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-12
- Revision:
- 21:3ac3c2e9d9ae
- Parent:
- 20:97059009a491
- Child:
- 22:d2393c670afd
File content as of revision 21:3ac3c2e9d9ae:
#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 bq1( 4.1660e04,8.3320e04,4.1660e04,1.4797e+00,.5582e01); BiQuad bq2( 1.0000e+00, 2.0000e+00, 1.0000e+00, 1.7010e+00,7.8850e01); volatile double y[50]= { }; volatile int n = 0; volatile bool full = 0; void emgSample() { //double emgFiltered = bqc.step( emg0.read() ); double emgFiltered = emg0.read(); scope.set(0,emgFiltered); // moving average 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(1,emgavg); scope.send(); // do stuff with filtered point emgavg } int main() { bqc.add( &bq1 ).add( &bq2 ); emgSampleTicker.attach( &emgSample, 0.01 ); /*empty loop, sample() is executed periodically*/ while(1) {} }