OSDN Git Service

Uses 4-th order low-pass for extracting gravity.
authorMathias Agopian <mathias@google.com>
Fri, 12 Nov 2010 01:58:51 +0000 (17:58 -0800)
committerMathias Agopian <mathias@google.com>
Tue, 30 Nov 2010 22:07:28 +0000 (14:07 -0800)
Most accelerometers have 8-bits accuracy so we beed to
reject 48dB in thestop-band, which requires a 4-th order
filter at the cut-off frequency we're using.

Change-Id: Ic00421d38d751641f86b1f3ad7663e6b44a91198

services/sensorservice/GravitySensor.cpp
services/sensorservice/GravitySensor.h
services/sensorservice/SecondOrderLowPassFilter.cpp
services/sensorservice/SecondOrderLowPassFilter.h

index 18bd359..da72f9c 100644 (file)
@@ -30,7 +30,7 @@ namespace android {
 GravitySensor::GravitySensor(sensor_t const* list, size_t count)
     : mSensorDevice(SensorDevice::getInstance()),
       mEnabled(false), mAccTime(0),
-      mLowPass(M_SQRT1_2, 1),
+      mLowPass(M_SQRT1_2, 1.5f),
       mX(mLowPass), mY(mLowPass), mZ(mLowPass)
 
 {
index f9850b7..ff3bea7 100644 (file)
@@ -37,7 +37,7 @@ class GravitySensor : public SensorInterface {
     double mAccTime;
 
     SecondOrderLowPassFilter mLowPass;
-    BiquadFilter mX, mY, mZ;
+    CascadedBiquadFilter mX, mY, mZ;
 
 public:
     GravitySensor(sensor_t const* list, size_t count);
index e13e136..eeb6d1e 100644 (file)
@@ -67,4 +67,23 @@ float BiquadFilter::operator()(float x)
 }
 
 // ---------------------------------------------------------------------------
+
+CascadedBiquadFilter::CascadedBiquadFilter(const SecondOrderLowPassFilter& s)
+    : mA(s), mB(s)
+{
+}
+
+float CascadedBiquadFilter::init(float x)
+{
+    mA.init(x);
+    mB.init(x);
+    return x;
+}
+
+float CascadedBiquadFilter::operator()(float x)
+{
+    return mB(mA(x));
+}
+
+// ---------------------------------------------------------------------------
 }; // namespace android
index 998ca35..85698ca 100644 (file)
@@ -54,6 +54,18 @@ public:
     float operator()(float in);
 };
 
+/*
+ * Two cascaded biquad IIR filters
+ * (4-poles IIR)
+ */
+class CascadedBiquadFilter {
+    BiquadFilter mA;
+    BiquadFilter mB;
+public:
+    CascadedBiquadFilter(const SecondOrderLowPassFilter& s);
+    float init(float in);
+    float operator()(float in);
+};
 
 // ---------------------------------------------------------------------------
 }; // namespace android