Professional Documents
Culture Documents
A Quick and Dirty Real
A Quick and Dirty Real
Filter Implementation
MAY 31ST, 2013 | COMMENTS
Introduction
You have this Data Acquisition System that coughs out data in
real time, and you want to add a digital filter that takes each
filter sample, throws out the filtered output. Thats the task of
this post.
Lets say the digital data is over your computers serial port, and
you have set up some Matlab code to plot it already, now we
need to filter each sample before storing it for plotting.
First of all you need to decide what kind of filter you want to use
low pass/bandpass etc, butterworth/elliptic etc, the filters
order, cutoff frequency etc. And depending on all that use the
matlab functions like butter(), ellip() to get the coefficients of the
filter you want to use. You could calculate the coefficients by any
other method also. This post assumes that you already have the
filter coefficients and you just need some simple code to
implement the filter.
Now that you have the coefficients usually denoted by the
vectors a and b for the denominator and numerator
respectively, lets look at the general form of an IIR filter
H(z)=Pi=0bizi1+Qj=1ajzj
Make sure that in your coefficients, a(0)=1.
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
Thats all to it! Now consider an FIR filter, this is easier because
now we do not have the vector a , so just delete the Multiply and
accumulate loop for the a terms in the above code.
A moving average filter can also be implemented in a similar
fashion. The code looks like this:
1function [data] = MavgFilter(value)
2
3k = 1;
4global Dbuffer ;
5global N;
6% 1. shift by one element (discard the left most element)
7while(k<N)
8Dbuffer(k) = Dbuffer(k+1);
9k=k+1;
1end
0Dbuffer(N) = 0;
1
1k = 1;
1
2
1
3
1
4while(k<N+1)
1Dbuffer(k) = Dbuffer(k) + value;
5k=k+1;
1end
6
1data = Dbuffer(1)/N;
7
1
8
1
9