How to filter data in realtime?
10th order Butterworth lowpass filter (fs=1kHz, f0=25Hz, f0norm=0.025) | |
Impulse response | Frequency response |
In order to filter data in realtime we need fast digital filters with minmal delay which process samples as they arrive.
The library 'IIR1' contains all the neccesary routines to create fast IIR filters with just a few commands.
This example sends a delta pulse as an input signal into the filter and saves it in a file while filtering it.
const int order = 3; Iir::Butterworth::LowPass<order> f; const float samplingrate = 1000; // Hz const float cutoff_frequency = 50; // Hz f.setup (order, samplingrate, cutoff_frequency); f.reset (); FILE *fimpulse = fopen("lp.dat","wt"); // let's generate an input signal and filter it // instantly! for(int i=0;i<1000;i++) { float a=0; if (i==10) a = 1; // delta pulse at t=10 float b = f.filter(a); fprintf(fimpulse,"%f\n",b); }
Central here is the command "b = f.filter(a)" where we feed one sample at a time into the filter and receive the filtered sample instantly. This command can directly be used during comedi's asynchronous acquisition, for example to remove 50Hz in realtime. comedirecord uses this library to remove the 50Hz while plotting it.
Download
- USB-DUX's UBUNTU respository. Just type:
sudo add-apt-repository ppa:berndporr/usbdux
The packages iir1 and iir1-dev will then show up in your package manager. - Ubuntu lucid deb packages: library, development files, source
- git respository
Check out the "demo" directory (under /usr/share/doc/iir1-dev/demo/ for the binary packages): run "make" and start "./iirdemo". Plot the .dat files with gnuplot or octave.
Installation from source
The best performance will be achieved when compiling from source:
git clone git://github.com/berndporr/iir1.git cd iir1 CXXFLAGS="-O3 -march=native" ./configure make sudo make install sudo ldconfig
To be able to utilise the full processing power of your computer compile the library with the compiler option "-O3 -march=native". This will generate native code heavily optimised for your processor.
Credits: The original library "DSPFilters" has been written by Vinnie Falco. Bernd Porr made this library available to Unix/Linux users and added realtime filtering.