0 оценок0% нашли этот документ полезным (0 голосов)
4 просмотров3 страницы
This document discusses implementing digital filters in real-time to filter data from a data acquisition system. It describes using IIR and FIR filters with coefficients to filter each input sample. Code is provided to implement the filters using Matlab by storing previous output values in a buffer, multiplying by coefficients, and accumulating the results. A moving average filter is also implemented using a similar buffer approach. The code provided gives a simple way to quickly filter real-time data for analysis and plotting.
This document discusses implementing digital filters in real-time to filter data from a data acquisition system. It describes using IIR and FIR filters with coefficients to filter each input sample. Code is provided to implement the filters using Matlab by storing previous output values in a buffer, multiplying by coefficients, and accumulating the results. A moving average filter is also implemented using a similar buffer approach. The code provided gives a simple way to quickly filter real-time data for analysis and plotting.
This document discusses implementing digital filters in real-time to filter data from a data acquisition system. It describes using IIR and FIR filters with coefficients to filter each input sample. Code is provided to implement the filters using Matlab by storing previous output values in a buffer, multiplying by coefficients, and accumulating the results. A moving average filter is also implemented using a similar buffer approach. The code provided gives a simple way to quickly filter real-time data for analysis and plotting.
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. Use the following code to implement the above filter: 1 2 [b_lp,a_lp] = butter(8,40/(Fs/2),'low'); global dbuffer ; 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
dbuffer = zeros(length(b_lp),1); % buffer for LPF %....... Read the ADC value from the serialport... % Pass it to the filter subfunction filtered_value = NewFilter(b_lp, a_lp, value); %..... Plot data....
% NewFilter subfunction function [data] = NewFilter(b, a,value) k = 1; global dbuffer ; while(k<length(b)) dbuffer(k) = dbuffer(k+1); k=k+1; end dbuffer(length(b)) = 0; k = 1; while(k<(length(b)+1)) dbuffer(k) = dbuffer(k) + value * b(k); k=k+1; end
k = 1; while(k<length(b)) dbuffer(k+1) = dbuffer(k+1) - dbuffer(1) * a(k+1); k=k+1; end
data = dbuffer(1);
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: 1 function [data] = MavgFilter(value) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
k = 1; global Dbuffer ; global N; % 1. shift by one element (discard the left most element) while(k<N) Dbuffer(k) = Dbuffer(k+1); k=k+1; end Dbuffer(N) = 0;
k = 1; while(k<N+1) Dbuffer(k) = Dbuffer(k) + value; k=k+1; end
data = Dbuffer(1)/N;
Obviously, the same code can be used in any other language like C, or C# if you want to do analysis using them. And also note that this is not the most efficient implementation, but its easy to understand and quick to implement, so its always good for a first try. http://www.desultoryquest.com/blog/a-quick-and-dirty-real-time-digital-iir-slash-fir-filter- implementation/
Python Advanced Programming: The Guide to Learn Python Programming. Reference with Exercises and Samples About Dynamical Programming, Multithreading, Multiprocessing, Debugging, Testing and More