Working with all filters, all filter results are low amplitude.
Dependencies: HIDScope biquadFilter mbed
Fork of frdm_calibratie_maximum by
main.cpp
- Committer:
- Marieke
- Date:
- 2016-10-21
- Revision:
- 2:27081b83a58e
- Parent:
- 1:278677bb6b99
- Child:
- 3:339b19905505
File content as of revision 2:27081b83a58e:
#include "mbed.h" #include "BiQuad.h" #define SERIAL_BAUD 115200 AnalogIn emg0( A0 ); AnalogIn emg1( A1 ); Serial pc(USBTX,USBRX); Ticker sample_timer, average_timer, filter_timer, t; //HIDScope scope( 6 ); DigitalOut led1(LED_RED); DigitalOut led2(LED_BLUE); volatile int time_passed = 0; volatile bool filter_timer_go=false; double EMGright, EMGleft, inR; double averageEMGr =0; double averageEMGl =0; //average_timer_go=false, // Activates go-flags //void average_timer_act(){average_timer_go=true;}; void filter_timer_act(){filter_timer_go=true;}; BiQuadChain bcq; // Notch filter wo=50; bw=wo/35 BiQuad bq1(9.7805e-01,-1.1978e-16,9.7805e-01,1.0000e+00,-1.1978e-16,9.5610e-01); // High pass Butterworth filter 2nd order, Fc=10; BiQuad bq2(9.8239e-01,-1.9648e+00,9.8239e-01,1.0000e+00,-1.9645e+00,9.6508e-01); // Low pass Butterworth filter 2nd order, Fc = 8; BiQuad bq3(5.6248e-05,1.1250e-04,5.6248e-05,1.0000e+00,-1.9787e+00,9.7890e-01); // Low pass Butterworth filter 4th order, Fc = 450; plited up in 2x2nd order BiQuad bq4(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-4.6382e-01,8.9354e-02); BiQuad bq5(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-6.3254e-01,4.8559e-01); void KeepTrackOfTime() { time_passed++; } // In the following: R is used for right arm, L is used for left arm! void FilteredSample(double averageEMGr, double averageEMGl) { double inR = emg0.read()-averageEMGr; double inL = emg1.read()-averageEMGl; //double inLcal = inL-averageL(sumL,size); double outRnotch = bq1.step(inR); double outRhigh = bq2.step(outRnotch); double outRrect = fabs(outRhigh); double outRlow = bcq.step(outRrect); double outLnotch = bq1.step(inL); double outLhigh = bq2.step(outLnotch); double outLrect = fabs(outLhigh); double outLlow = bcq.step(outLrect); pc.printf("Detrend EMG = %f\n\r",inR); pc.printf("EMG signal= %f\n\r",emg0.read()); pc.printf("average EMG right = %f\n\r",averageEMGr); led2 = !led2; /*scope.set(0, inR); scope.set(1, inL); scope.set(2, outRlow); scope.set(3, outLlow); scope.send(); // To indicate that the function is working, the LED is toggled*/ } int main() { pc.baud(115200); led1=1; led2=1; t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds for (;;) { if (time_passed<=5) { led1 =!led1; //sample_timer.attach(&sample, 0.002); //500Hz pc.printf("\rStart IF-loop\r\n"); int size = 12500; int i; double EMGsumR; double EMGsumL; while(i<size) { EMGsumR = emg0.read()+EMGsumR; EMGsumL = emg1.read()+EMGsumL; i++; wait(0.0004); } averageEMGr = (double) EMGsumR/size; averageEMGl = (double) EMGsumL/size; double InRcal = emg0.read()-averageEMGr; double InLcal = emg1.read()-averageEMGl; scope.set(0, emg0.read() ); scope.set(1, 1 ); scope.set(2, averageEMGr); scope.set(3, averageL(sumL,size)); scope.set(5, InRcal ); scope.set(6, InLcal ); scope.send();*/ //pc.printf("EMG-signal = %f\n\r",emg0.read()); /*pc.printf("\r\nIF-loop end:"); pc.printf("time is %i sec\n",time_passed); pc.printf("averageR = %f\n\r", averageEMGr);*/ } else { led1 = 1; led2=!led2; bcq.add(&bq3).add(&bq4).add(&bq5); filter_timer.attach(&filter_timer_act, 0.0004); //2500Hz (same as with filter coefficients on matlab!!! Thus adjust!) pc.printf("\rMain-loop\n\r"); //pc.printf("Detrend EMG = %f\n\r",inR); while(1) { if (filter_timer_go){ filter_timer_go=false; FilteredSample(averageEMGr, averageEMGl);} } } } }