Working moving average filter. IIR filters (low pass, high pass) still have to be implemented via biquad.
Dependencies: HIDScope biquadFilter mbed
Fork of EMG by
main.cpp
- Committer:
- MaikOvermars
- Date:
- 2018-10-13
- Revision:
- 22:d2393c670afd
- Parent:
- 21:3ac3c2e9d9ae
File content as of revision 22:d2393c670afd:
#include "mbed.h" #include "BiQuad.h" #include "HIDScope.h" //Define objects HIDScope scope(2); // We’re going to send 2 channels of data AnalogIn emg0( A0 ); AnalogIn emg1( A1 ); Ticker emgSampleTicker; // filter chains for high pass, low pass and notch filters BiQuadChain bqc; BiQuad bqlow( 0.0128, 0.0256, 0.0128, -1.6556, 0.7068); BiQuad bqhigh( 0.6458, -1.2917, 0.6458, -1.1620, 0.4213); BiQuad bqnotch( 0.5, 0, 0.5, 0, 0); volatile double y[50]= { }; volatile int n = 0; volatile bool full = 0; void emgSample() { double emgRaw = emg0.read(); scope.set(0,emgRaw); double emgFiltered = bqc.step( emgRaw ); scope.set(1,emgFiltered); // moving average and rectifier y[n] = abs(emgFiltered - 0.45); double emgavg = 0; if(full == 0){ for(int i=0;i<50;i++){ emgavg = emgavg + y[i]; } emgavg = emgavg/(n+1); } else{ for(int i=0;i<50;i++){ emgavg = emgavg + y[i]; } emgavg = emgavg/50; } n++; if(n == 50){ n = 0; full = 1; } scope.set(2,emgavg); scope.send(); // do stuff with filtered point emgavg } int main() { bqc.add( &bqlow ).add( &bqhigh ).add( &bqnotch ); emgSampleTicker.attach( &emgSample, 0.01 ); /*empty loop, sample() is executed periodically*/ while(1) {} }