Filter documentation in general

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):

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #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

+4
source share
1 answer

I found a less complicated introduction to dspguide in the following chapters:


More interesting answers are here on dsp stackexchange .


PS: I did this wiki so that people can add their resources (contributions are welcome).


+1
source

All Articles