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:
- 1:278677bb6b99
- Parent:
- 0:4d69864f1002
- Child:
- 2:27081b83a58e
File content as of revision 1:278677bb6b99:
#include "mbed.h" #include <stdio.h> #define SERIAL_BAUD 115200 AnalogIn emg0( A0 ); AnalogIn emg1( A1 ); Serial pc(USBTX,USBRX); //HIDScope scope( 6 ); /*int main() { pc.baud(115200); int array[10], maximum, size, c, location = 1; for (int i=0;i<10;i++) { double EMGright = emg0.read(); EMGright = array[i]; } printf("Enter the number of elements in array\n"); scanf("%d", &size); printf("Enter %d integers\n", size); for (c = 0; c < size; c++) scanf("%d", &array[c]); maximum = array[0]; for (c = 1; c < size; c++) { if (array[c] > maximum) { maximum = array[c]; location = c+1; } } printf("Maximum element is present at location %d and it's value is %d.\n", location, maximum); return 0; }*/ /* #include "mbed.h" #include "HIDScope.h" #include "BiQuad.h" #include <stdio.h> //Define objects AnalogIn emg0( A0 ); AnalogIn emg1( A1 );*/ 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; double EMGleft; //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++; } void sample() { double EMGright = emg0; double EMGleft = emg1; /*.set(0, emg0.read() ); scope.set(1, emg1.read() ); scope.send(); led1 = 0; wait(0.5f); led1 = 1; wait(0.5f);*/ } // In the following: R is used for right arm, L is used for left arm! /*void FilteredSample() { double inR = emg0.read(); double inL = emg1.read(); //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); 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 led2 = !led2; }*/ /* void average(double averageR, double averageL) { int averageR(int,int); int averageL(int,int); int size = 5000; //10/0.002 int arrayR[size]; //declaring array int arrayL[size]; int sumR = 0; int sumL = 0; for (int i=0;i<size;i++) { double EMGright = emg0.read(); double EMGleft = emg1.read(); EMGright = arrayR[i]; EMGleft = arrayL[i]; sumL = sumL+arrayR[i]; sumR=sumR+arrayR[i]; //double averageR = sumR/arrayR; //double averageL = sumL/arrayL; } return averageR=sumR/sizeR; return averageL(sumL,sizeL);*/ float averageR(int sumR, int size) { return (float) sumR/size; } float averageL(int sumL, int size) { return (float) sumL/size; } int main() { pc.baud(115200); led1=1; led2=1; t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds //for (;;) { //if (time_passed<=10) //{ //sample_timer.attach(&sample, 0.002); //500Hz /*float averageR(float,int); float averageL(float,int); int size = 500; //10/0.002 int arrayR[size]; //declaring array int arrayL[size]; int sumR = 0; int sumL = 0; float EMGright = emg0.read(); float EMGleft = emg1.read(); for (int i=0;i<size;i++) { emg0.read() = arrayR[i]; arrayL[i]= emg1.read(); sumL = sumL+arrayL[i]; sumR = sumR+arrayR[i]; } // Calibration step with the gained averages //double CalibrationFactorR = 0.5/averageR(sumR,size); //double CalibrationFactorL = 0.5/averageL(sumL,size); */ int size = 12500; int i; double EMGsumR; double EMGsumL; while(i<size){ sample(); EMGsumR = emg0.read()+EMGsumR; EMGsumL = EMGleft+EMGsumL; i++; wait(0.0004); } double averageEMGr = (double) EMGsumR/size; double averageEMGl = (double) EMGsumL/size; double InRcal = emg0.read()-averageEMGr; double InLcal = emg1.read()-averageEMGl; led1 =!led1; //wait(0.5f); /*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("averageR = %f\n\r",averageEMGr); pc.printf("averageR = %f\n\r",averageEMGl); //pc.printf("averageRvoid = %f\n\r",averageR(sumR,size)); //pc.printf("Detrend EMG = %f\n\r",InRcal); //pc.printf("array value = %f\n\r",arrayR[3]); pc.printf("test\n\r"); pc.printf("EMG sum = %f\n\r",EMGsumR); pc.printf("EMG signal = %f\n\r",EMGright); /*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!) while(1) { if (filter_timer_go){ filter_timer_go=false; FilteredSample();} } }*/ }