Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed HIDScope biquadFilter
main.cpp@4:ebb36bf9feb8, 2016-10-21 (annotated)
- Committer:
- Marieke
- Date:
- Fri Oct 21 15:01:44 2016 +0000
- Revision:
- 4:ebb36bf9feb8
- Parent:
- 3:339b19905505
- Child:
- 5:df782fe787f0
filter script with everything working, no calibration anymore, second low pass filter is removed.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Marieke | 0:4d69864f1002 | 1 | #include "mbed.h" |
| Marieke | 2:27081b83a58e | 2 | #include "BiQuad.h" |
| Marieke | 3:339b19905505 | 3 | #include "HIDScope.h" |
| Marieke | 4:ebb36bf9feb8 | 4 | #include <math.h> |
| Marieke | 3:339b19905505 | 5 | |
| Marieke | 3:339b19905505 | 6 | //#define SERIAL_BAUD 115200 |
| Marieke | 0:4d69864f1002 | 7 | |
| Marieke | 0:4d69864f1002 | 8 | AnalogIn emg0( A0 ); |
| Marieke | 0:4d69864f1002 | 9 | AnalogIn emg1( A1 ); |
| Marieke | 3:339b19905505 | 10 | //Serial pc(USBTX,USBRX); |
| Marieke | 0:4d69864f1002 | 11 | |
| Marieke | 0:4d69864f1002 | 12 | Ticker sample_timer, average_timer, filter_timer, t; |
| Marieke | 3:339b19905505 | 13 | HIDScope scope( 6 ); |
| Marieke | 0:4d69864f1002 | 14 | DigitalOut led1(LED_RED); |
| Marieke | 0:4d69864f1002 | 15 | DigitalOut led2(LED_BLUE); |
| Marieke | 0:4d69864f1002 | 16 | |
| Marieke | 0:4d69864f1002 | 17 | volatile int time_passed = 0; |
| Marieke | 0:4d69864f1002 | 18 | volatile bool filter_timer_go=false; |
| Marieke | 1:278677bb6b99 | 19 | |
| Marieke | 2:27081b83a58e | 20 | double EMGright, EMGleft, inR; |
| Marieke | 2:27081b83a58e | 21 | double averageEMGr =0; |
| Marieke | 2:27081b83a58e | 22 | double averageEMGl =0; |
| Marieke | 3:339b19905505 | 23 | |
| Marieke | 2:27081b83a58e | 24 | void filter_timer_act(){filter_timer_go=true;}; |
| Marieke | 0:4d69864f1002 | 25 | |
| Marieke | 3:339b19905505 | 26 | BiQuadChain bcq1; |
| Marieke | 3:339b19905505 | 27 | BiQuadChain bcq2; |
| Marieke | 0:4d69864f1002 | 28 | // Notch filter wo=50; bw=wo/35 |
| Marieke | 3:339b19905505 | 29 | BiQuad bq1(9.9821e-01,-1.9807e+00,9.9821e-01,-1.9807e+00,9.9642e-01); |
| Marieke | 0:4d69864f1002 | 30 | // High pass Butterworth filter 2nd order, Fc=10; |
| Marieke | 3:339b19905505 | 31 | BiQuad bq2(9.8239e-01,-1.9648e+00,9.8239e-01,-1.9645e+00,9.6508e-01); |
| Marieke | 0:4d69864f1002 | 32 | // Low pass Butterworth filter 2nd order, Fc = 8; |
| Marieke | 3:339b19905505 | 33 | BiQuad bq3(5.6248e-05,1.1250e-04,5.6248e-05,-1.9787e+00,9.7890e-01); |
| Marieke | 4:ebb36bf9feb8 | 34 | |
| Marieke | 0:4d69864f1002 | 35 | |
| Marieke | 0:4d69864f1002 | 36 | void KeepTrackOfTime() |
| Marieke | 0:4d69864f1002 | 37 | { |
| Marieke | 0:4d69864f1002 | 38 | time_passed++; |
| Marieke | 0:4d69864f1002 | 39 | } |
| Marieke | 0:4d69864f1002 | 40 | |
| Marieke | 0:4d69864f1002 | 41 | // In the following: R is used for right arm, L is used for left arm! |
| Marieke | 3:339b19905505 | 42 | void FilteredSample() |
| Marieke | 0:4d69864f1002 | 43 | { |
| Marieke | 3:339b19905505 | 44 | double inR = emg0.read(); |
| Marieke | 3:339b19905505 | 45 | double inL = emg1.read(); |
| Marieke | 4:ebb36bf9feb8 | 46 | |
| Marieke | 4:ebb36bf9feb8 | 47 | double outRfilter1 = bcq1.step(inR); |
| Marieke | 4:ebb36bf9feb8 | 48 | double outRrect= fabs(outRfilter1); |
| Marieke | 4:ebb36bf9feb8 | 49 | double outRenvelope= bcq2.step(outRrect); |
| Marieke | 0:4d69864f1002 | 50 | |
| Marieke | 4:ebb36bf9feb8 | 51 | double outLfilter1 = bcq1.step(inL); |
| Marieke | 4:ebb36bf9feb8 | 52 | double outLrect = fabs(outLfilter1); |
| Marieke | 4:ebb36bf9feb8 | 53 | double outLenvelope= bcq2.step(outLrect); |
| Marieke | 4:ebb36bf9feb8 | 54 | |
| Marieke | 3:339b19905505 | 55 | //pc.printf("Detrend EMG = %f\n\r",inR); |
| Marieke | 3:339b19905505 | 56 | //pc.printf("EMG signal= %f\n\r",emg0.read()); |
| Marieke | 3:339b19905505 | 57 | //pc.printf("average EMG right = %f\n\r",averageEMGr); |
| Marieke | 2:27081b83a58e | 58 | |
| Marieke | 3:339b19905505 | 59 | scope.set(0, inR); |
| Marieke | 0:4d69864f1002 | 60 | scope.set(1, inL); |
| Marieke | 4:ebb36bf9feb8 | 61 | scope.set(2, outRenvelope); |
| Marieke | 4:ebb36bf9feb8 | 62 | scope.set(3, outLenvelope); |
| Marieke | 0:4d69864f1002 | 63 | |
| Marieke | 0:4d69864f1002 | 64 | scope.send(); |
| Marieke | 2:27081b83a58e | 65 | // To indicate that the function is working, the LED is toggled*/ |
| Marieke | 3:339b19905505 | 66 | led2 = !led2; |
| Marieke | 0:4d69864f1002 | 67 | } |
| Marieke | 0:4d69864f1002 | 68 | |
| Marieke | 0:4d69864f1002 | 69 | int main() |
| Marieke | 0:4d69864f1002 | 70 | { |
| Marieke | 3:339b19905505 | 71 | //pc.baud(115200); |
| Marieke | 0:4d69864f1002 | 72 | led1=1; |
| Marieke | 0:4d69864f1002 | 73 | led2=1; |
| Marieke | 3:339b19905505 | 74 | led2=!led2; |
| Marieke | 3:339b19905505 | 75 | //t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds |
| Marieke | 0:4d69864f1002 | 76 | |
| Marieke | 3:339b19905505 | 77 | bcq1.add(&bq1).add(&bq2); |
| Marieke | 4:ebb36bf9feb8 | 78 | bcq2.add(&bq3); |
| Marieke | 3:339b19905505 | 79 | |
| Marieke | 0:4d69864f1002 | 80 | |
| Marieke | 3:339b19905505 | 81 | filter_timer.attach(&filter_timer_act, 0.0004); //2500Hz (same as with filter coefficients on matlab!!! Thus adjust!) |
| Marieke | 3:339b19905505 | 82 | //pc.printf("\rMain-loop\n\r"); |
| Marieke | 2:27081b83a58e | 83 | //pc.printf("Detrend EMG = %f\n\r",inR); |
| Marieke | 0:4d69864f1002 | 84 | |
| Marieke | 3:339b19905505 | 85 | while(1) |
| Marieke | 3:339b19905505 | 86 | { |
| Marieke | 3:339b19905505 | 87 | if (filter_timer_go){ |
| Marieke | 0:4d69864f1002 | 88 | filter_timer_go=false; |
| Marieke | 3:339b19905505 | 89 | FilteredSample();} |
| Marieke | 2:27081b83a58e | 90 | } |
| Marieke | 0:4d69864f1002 | 91 | } |