Recently, I have been processing data from sensors from different devices. These sensors consist of accelerometers, gyroscopes, magnetometers, etc. It all started when I wanted to isolate the gravitational force and came across this link (code from android_frameworks_base / services / sensorservice / SecondOrderLowPassFilter.cpp):
#include <stdint.h> #include <sys/types.h> #include <math.h> #include <cutils/log.h> #include "SecondOrderLowPassFilter.h" // --------------------------------------------------------------------------- namespace android { // --------------------------------------------------------------------------- SecondOrderLowPassFilter::SecondOrderLowPassFilter(float Q, float fc) : iQ(1.0f / Q), fc(fc) { } void SecondOrderLowPassFilter::setSamplingPeriod(float dT) { K = tanf(float(M_PI) * fc * dT); iD = 1.0f / (K*K + K*iQ + 1); a0 = K*K*iD; a1 = 2.0f * a0; b1 = 2.0f*(K*K - 1)*iD; b2 = (K*K - K*iQ + 1)*iD; } // --------------------------------------------------------------------------- BiquadFilter::BiquadFilter(const SecondOrderLowPassFilter& s) : s(s) { } float BiquadFilter::init(float x) { x1 = x2 = x; y1 = y2 = x; return x; } float BiquadFilter::operator()(float x) { float y = (x + x2)*s.a0 + x1*s.a1 - y1*s.b1 - y2*s.b2; x2 = x1; y2 = y1; x1 = x; y1 = y; return y; } // --------------------------------------------------------------------------- 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
Although this code works very well, I feel that I need to understand some of the basics of the filter philosophy as a whole. For example, maybe I need to change something in this filter.
I started reading on Wikipedia (Kalman, Low-Pass, ...), but it still seems to me that I need to better feel / touch this theory before starting to change the code of another.
So, I ask you, SO users, what can I read to have a more general understanding of filters? Any link, resource, documentation will be good.
In addition: I have an engineering degree, but I did not study filters, except for some Fourier transforms (DFT) when studying signal processing. Mathematics should not be a big problem.
I ask this question because I saw that there are MUCH questions related to filters.
Thank you very much,
Julian
Ins source share