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@0:4d69864f1002, 2016-10-20 (annotated)
- Committer:
- Marieke
- Date:
- Thu Oct 20 20:44:51 2016 +0000
- Revision:
- 0:4d69864f1002
- Child:
- 1:278677bb6b99
average taking with putty
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Marieke | 0:4d69864f1002 | 1 | #include "mbed.h" |
| Marieke | 0:4d69864f1002 | 2 | #include <stdio.h> |
| Marieke | 0:4d69864f1002 | 3 | #define SERIAL_BAUD 115200 |
| Marieke | 0:4d69864f1002 | 4 | |
| Marieke | 0:4d69864f1002 | 5 | AnalogIn emg0( A0 ); |
| Marieke | 0:4d69864f1002 | 6 | AnalogIn emg1( A1 ); |
| Marieke | 0:4d69864f1002 | 7 | Serial pc(USBTX,USBRX); |
| Marieke | 0:4d69864f1002 | 8 | |
| Marieke | 0:4d69864f1002 | 9 | //HIDScope scope( 6 ); |
| Marieke | 0:4d69864f1002 | 10 | |
| Marieke | 0:4d69864f1002 | 11 | |
| Marieke | 0:4d69864f1002 | 12 | /*int main() { |
| Marieke | 0:4d69864f1002 | 13 | pc.baud(115200); |
| Marieke | 0:4d69864f1002 | 14 | int array[10], maximum, size, c, location = 1; |
| Marieke | 0:4d69864f1002 | 15 | |
| Marieke | 0:4d69864f1002 | 16 | for (int i=0;i<10;i++) |
| Marieke | 0:4d69864f1002 | 17 | { |
| Marieke | 0:4d69864f1002 | 18 | double EMGright = emg0.read(); |
| Marieke | 0:4d69864f1002 | 19 | EMGright = array[i]; |
| Marieke | 0:4d69864f1002 | 20 | } |
| Marieke | 0:4d69864f1002 | 21 | |
| Marieke | 0:4d69864f1002 | 22 | printf("Enter the number of elements in array\n"); |
| Marieke | 0:4d69864f1002 | 23 | scanf("%d", &size); |
| Marieke | 0:4d69864f1002 | 24 | |
| Marieke | 0:4d69864f1002 | 25 | printf("Enter %d integers\n", size); |
| Marieke | 0:4d69864f1002 | 26 | |
| Marieke | 0:4d69864f1002 | 27 | for (c = 0; c < size; c++) |
| Marieke | 0:4d69864f1002 | 28 | scanf("%d", &array[c]); |
| Marieke | 0:4d69864f1002 | 29 | |
| Marieke | 0:4d69864f1002 | 30 | maximum = array[0]; |
| Marieke | 0:4d69864f1002 | 31 | |
| Marieke | 0:4d69864f1002 | 32 | for (c = 1; c < size; c++) |
| Marieke | 0:4d69864f1002 | 33 | { |
| Marieke | 0:4d69864f1002 | 34 | if (array[c] > maximum) |
| Marieke | 0:4d69864f1002 | 35 | { |
| Marieke | 0:4d69864f1002 | 36 | maximum = array[c]; |
| Marieke | 0:4d69864f1002 | 37 | location = c+1; |
| Marieke | 0:4d69864f1002 | 38 | } |
| Marieke | 0:4d69864f1002 | 39 | } |
| Marieke | 0:4d69864f1002 | 40 | |
| Marieke | 0:4d69864f1002 | 41 | printf("Maximum element is present at location %d and it's value is %d.\n", location, maximum); |
| Marieke | 0:4d69864f1002 | 42 | return 0; |
| Marieke | 0:4d69864f1002 | 43 | }*/ |
| Marieke | 0:4d69864f1002 | 44 | /* |
| Marieke | 0:4d69864f1002 | 45 | #include "mbed.h" |
| Marieke | 0:4d69864f1002 | 46 | #include "HIDScope.h" |
| Marieke | 0:4d69864f1002 | 47 | #include "BiQuad.h" |
| Marieke | 0:4d69864f1002 | 48 | #include <stdio.h> |
| Marieke | 0:4d69864f1002 | 49 | |
| Marieke | 0:4d69864f1002 | 50 | //Define objects |
| Marieke | 0:4d69864f1002 | 51 | AnalogIn emg0( A0 ); |
| Marieke | 0:4d69864f1002 | 52 | AnalogIn emg1( A1 );*/ |
| Marieke | 0:4d69864f1002 | 53 | |
| Marieke | 0:4d69864f1002 | 54 | Ticker sample_timer, average_timer, filter_timer, t; |
| Marieke | 0:4d69864f1002 | 55 | //HIDScope scope( 6 ); |
| Marieke | 0:4d69864f1002 | 56 | DigitalOut led1(LED_RED); |
| Marieke | 0:4d69864f1002 | 57 | DigitalOut led2(LED_BLUE); |
| Marieke | 0:4d69864f1002 | 58 | |
| Marieke | 0:4d69864f1002 | 59 | volatile int time_passed = 0; |
| Marieke | 0:4d69864f1002 | 60 | volatile bool filter_timer_go=false; |
| Marieke | 0:4d69864f1002 | 61 | //average_timer_go=false, |
| Marieke | 0:4d69864f1002 | 62 | // Activates go-flags |
| Marieke | 0:4d69864f1002 | 63 | //void average_timer_act(){average_timer_go=true;}; |
| Marieke | 0:4d69864f1002 | 64 | /*void filter_timer_act(){filter_timer_go=true;}; |
| Marieke | 0:4d69864f1002 | 65 | |
| Marieke | 0:4d69864f1002 | 66 | BiQuadChain bcq; |
| Marieke | 0:4d69864f1002 | 67 | // Notch filter wo=50; bw=wo/35 |
| Marieke | 0:4d69864f1002 | 68 | BiQuad bq1(9.7805e-01,-1.1978e-16,9.7805e-01,1.0000e+00,-1.1978e-16,9.5610e-01); |
| Marieke | 0:4d69864f1002 | 69 | // High pass Butterworth filter 2nd order, Fc=10; |
| Marieke | 0:4d69864f1002 | 70 | BiQuad bq2(9.8239e-01,-1.9648e+00,9.8239e-01,1.0000e+00,-1.9645e+00,9.6508e-01); |
| Marieke | 0:4d69864f1002 | 71 | // Low pass Butterworth filter 2nd order, Fc = 8; |
| Marieke | 0:4d69864f1002 | 72 | BiQuad bq3(5.6248e-05,1.1250e-04,5.6248e-05,1.0000e+00,-1.9787e+00,9.7890e-01); |
| Marieke | 0:4d69864f1002 | 73 | // Low pass Butterworth filter 4th order, Fc = 450; plited up in 2x2nd order |
| Marieke | 0:4d69864f1002 | 74 | BiQuad bq4(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-4.6382e-01,8.9354e-02); |
| Marieke | 0:4d69864f1002 | 75 | BiQuad bq5(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-6.3254e-01,4.8559e-01);*/ |
| Marieke | 0:4d69864f1002 | 76 | |
| Marieke | 0:4d69864f1002 | 77 | void KeepTrackOfTime() |
| Marieke | 0:4d69864f1002 | 78 | { |
| Marieke | 0:4d69864f1002 | 79 | time_passed++; |
| Marieke | 0:4d69864f1002 | 80 | } |
| Marieke | 0:4d69864f1002 | 81 | |
| Marieke | 0:4d69864f1002 | 82 | /*void sample() |
| Marieke | 0:4d69864f1002 | 83 | { |
| Marieke | 0:4d69864f1002 | 84 | scope.set(0, emg0.read() ); |
| Marieke | 0:4d69864f1002 | 85 | scope.set(1, emg1.read() ); |
| Marieke | 0:4d69864f1002 | 86 | |
| Marieke | 0:4d69864f1002 | 87 | scope.send(); |
| Marieke | 0:4d69864f1002 | 88 | |
| Marieke | 0:4d69864f1002 | 89 | led1 = 0; |
| Marieke | 0:4d69864f1002 | 90 | wait(0.5f); |
| Marieke | 0:4d69864f1002 | 91 | led1 = 1; |
| Marieke | 0:4d69864f1002 | 92 | wait(0.5f); |
| Marieke | 0:4d69864f1002 | 93 | }*/ |
| Marieke | 0:4d69864f1002 | 94 | |
| Marieke | 0:4d69864f1002 | 95 | // In the following: R is used for right arm, L is used for left arm! |
| Marieke | 0:4d69864f1002 | 96 | /*void FilteredSample() |
| Marieke | 0:4d69864f1002 | 97 | { |
| Marieke | 0:4d69864f1002 | 98 | double inR = emg0.read(); |
| Marieke | 0:4d69864f1002 | 99 | double inL = emg1.read(); |
| Marieke | 0:4d69864f1002 | 100 | //double inLcal = inL-averageL(sumL,size); |
| Marieke | 0:4d69864f1002 | 101 | double outRnotch = bq1.step(inR); |
| Marieke | 0:4d69864f1002 | 102 | double outRhigh = bq2.step(outRnotch); |
| Marieke | 0:4d69864f1002 | 103 | double outRrect = fabs(outRhigh); |
| Marieke | 0:4d69864f1002 | 104 | double outRlow = bcq.step(outRrect); |
| Marieke | 0:4d69864f1002 | 105 | double outLnotch = bq1.step(inL); |
| Marieke | 0:4d69864f1002 | 106 | double outLhigh = bq2.step(outLnotch); |
| Marieke | 0:4d69864f1002 | 107 | double outLrect = fabs(outLhigh); |
| Marieke | 0:4d69864f1002 | 108 | double outLlow = bcq.step(outLrect); |
| Marieke | 0:4d69864f1002 | 109 | |
| Marieke | 0:4d69864f1002 | 110 | scope.set(0, inR); |
| Marieke | 0:4d69864f1002 | 111 | scope.set(1, inL); |
| Marieke | 0:4d69864f1002 | 112 | scope.set(2, outRlow); |
| Marieke | 0:4d69864f1002 | 113 | scope.set(3, outLlow); |
| Marieke | 0:4d69864f1002 | 114 | |
| Marieke | 0:4d69864f1002 | 115 | |
| Marieke | 0:4d69864f1002 | 116 | scope.send(); |
| Marieke | 0:4d69864f1002 | 117 | // To indicate that the function is working, the LED is toggled |
| Marieke | 0:4d69864f1002 | 118 | led2 = !led2; |
| Marieke | 0:4d69864f1002 | 119 | }*/ |
| Marieke | 0:4d69864f1002 | 120 | |
| Marieke | 0:4d69864f1002 | 121 | |
| Marieke | 0:4d69864f1002 | 122 | /* |
| Marieke | 0:4d69864f1002 | 123 | void average(double averageR, double averageL) |
| Marieke | 0:4d69864f1002 | 124 | { |
| Marieke | 0:4d69864f1002 | 125 | int averageR(int,int); |
| Marieke | 0:4d69864f1002 | 126 | int averageL(int,int); |
| Marieke | 0:4d69864f1002 | 127 | int size = 5000; //10/0.002 |
| Marieke | 0:4d69864f1002 | 128 | int arrayR[size]; //declaring array |
| Marieke | 0:4d69864f1002 | 129 | int arrayL[size]; |
| Marieke | 0:4d69864f1002 | 130 | int sumR = 0; |
| Marieke | 0:4d69864f1002 | 131 | int sumL = 0; |
| Marieke | 0:4d69864f1002 | 132 | |
| Marieke | 0:4d69864f1002 | 133 | for (int i=0;i<size;i++) |
| Marieke | 0:4d69864f1002 | 134 | { |
| Marieke | 0:4d69864f1002 | 135 | double EMGright = emg0.read(); |
| Marieke | 0:4d69864f1002 | 136 | double EMGleft = emg1.read(); |
| Marieke | 0:4d69864f1002 | 137 | EMGright = arrayR[i]; |
| Marieke | 0:4d69864f1002 | 138 | EMGleft = arrayL[i]; |
| Marieke | 0:4d69864f1002 | 139 | sumL = sumL+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 140 | sumR=sumR+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 141 | //double averageR = sumR/arrayR; |
| Marieke | 0:4d69864f1002 | 142 | //double averageL = sumL/arrayL; |
| Marieke | 0:4d69864f1002 | 143 | } |
| Marieke | 0:4d69864f1002 | 144 | return averageR=sumR/sizeR; |
| Marieke | 0:4d69864f1002 | 145 | return averageL(sumL,sizeL);*/ |
| Marieke | 0:4d69864f1002 | 146 | |
| Marieke | 0:4d69864f1002 | 147 | double averageR(int sumR, int size) |
| Marieke | 0:4d69864f1002 | 148 | { |
| Marieke | 0:4d69864f1002 | 149 | return (double) sumR/size; |
| Marieke | 0:4d69864f1002 | 150 | } |
| Marieke | 0:4d69864f1002 | 151 | |
| Marieke | 0:4d69864f1002 | 152 | double averageL(int sumL, int size) |
| Marieke | 0:4d69864f1002 | 153 | { |
| Marieke | 0:4d69864f1002 | 154 | return (double) sumL/size; |
| Marieke | 0:4d69864f1002 | 155 | } |
| Marieke | 0:4d69864f1002 | 156 | |
| Marieke | 0:4d69864f1002 | 157 | |
| Marieke | 0:4d69864f1002 | 158 | int main() |
| Marieke | 0:4d69864f1002 | 159 | { |
| Marieke | 0:4d69864f1002 | 160 | pc.baud(115200); |
| Marieke | 0:4d69864f1002 | 161 | led1=1; |
| Marieke | 0:4d69864f1002 | 162 | led2=1; |
| Marieke | 0:4d69864f1002 | 163 | t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds |
| Marieke | 0:4d69864f1002 | 164 | |
| Marieke | 0:4d69864f1002 | 165 | for (;;) { |
| Marieke | 0:4d69864f1002 | 166 | if (time_passed<=30) |
| Marieke | 0:4d69864f1002 | 167 | { |
| Marieke | 0:4d69864f1002 | 168 | led1 =!led1; |
| Marieke | 0:4d69864f1002 | 169 | wait(0.5f);//sample_timer.attach(&sample, 0.002); //500Hz |
| Marieke | 0:4d69864f1002 | 170 | |
| Marieke | 0:4d69864f1002 | 171 | double averageR(int,int); |
| Marieke | 0:4d69864f1002 | 172 | double averageL(int,int); |
| Marieke | 0:4d69864f1002 | 173 | int size = 500; //10/0.002 |
| Marieke | 0:4d69864f1002 | 174 | int arrayR[size]; //declaring array |
| Marieke | 0:4d69864f1002 | 175 | int arrayL[size]; |
| Marieke | 0:4d69864f1002 | 176 | int sumR = 0; |
| Marieke | 0:4d69864f1002 | 177 | int sumL = 0; |
| Marieke | 0:4d69864f1002 | 178 | double EMGright = emg0.read(); |
| Marieke | 0:4d69864f1002 | 179 | double EMGleft = emg1.read(); |
| Marieke | 0:4d69864f1002 | 180 | |
| Marieke | 0:4d69864f1002 | 181 | for (int i=0;i<size;i++) |
| Marieke | 0:4d69864f1002 | 182 | { |
| Marieke | 0:4d69864f1002 | 183 | EMGright = arrayR[i]; |
| Marieke | 0:4d69864f1002 | 184 | EMGleft = arrayL[i]; |
| Marieke | 0:4d69864f1002 | 185 | sumL = sumL+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 186 | sumR = sumR+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 187 | } |
| Marieke | 0:4d69864f1002 | 188 | // Calibration step with the gained averages |
| Marieke | 0:4d69864f1002 | 189 | //double CalibrationFactorR = 0.5/averageR(sumR,size); |
| Marieke | 0:4d69864f1002 | 190 | //double CalibrationFactorL = 0.5/averageL(sumL,size); |
| Marieke | 0:4d69864f1002 | 191 | double averageEMGr = sumR/size; |
| Marieke | 0:4d69864f1002 | 192 | double averageEMGl = sumL/size; |
| Marieke | 0:4d69864f1002 | 193 | double InRcal = emg0.read()-averageR(sumR,size); |
| Marieke | 0:4d69864f1002 | 194 | double InLcal = emg1.read()-averageL(sumL,size); |
| Marieke | 0:4d69864f1002 | 195 | |
| Marieke | 0:4d69864f1002 | 196 | /*scope.set(0, emg0.read() ); |
| Marieke | 0:4d69864f1002 | 197 | scope.set(1, 1 ); |
| Marieke | 0:4d69864f1002 | 198 | scope.set(2, averageEMGr); |
| Marieke | 0:4d69864f1002 | 199 | scope.set(3, averageL(sumL,size)); |
| Marieke | 0:4d69864f1002 | 200 | scope.set(5, InRcal ); |
| Marieke | 0:4d69864f1002 | 201 | scope.set(6, InLcal ); |
| Marieke | 0:4d69864f1002 | 202 | |
| Marieke | 0:4d69864f1002 | 203 | scope.send();*/ |
| Marieke | 0:4d69864f1002 | 204 | pc.printf("EMG-signal = %f\n\r",emg0.read()); |
| Marieke | 0:4d69864f1002 | 205 | pc.printf("averageR = %f\n\r",averageEMGr); |
| Marieke | 0:4d69864f1002 | 206 | pc.printf("averageRvoid = %f\n\r",averageR(sumR,size)); |
| Marieke | 0:4d69864f1002 | 207 | pc.printf("Detrend EMG = %f\n\r",InRcal); |
| Marieke | 0:4d69864f1002 | 208 | } |
| Marieke | 0:4d69864f1002 | 209 | |
| Marieke | 0:4d69864f1002 | 210 | else |
| Marieke | 0:4d69864f1002 | 211 | { |
| Marieke | 0:4d69864f1002 | 212 | |
| Marieke | 0:4d69864f1002 | 213 | led1 = 1; |
| Marieke | 0:4d69864f1002 | 214 | led2=!led2; |
| Marieke | 0:4d69864f1002 | 215 | |
| Marieke | 0:4d69864f1002 | 216 | /*bcq.add(&bq3).add(&bq4).add(&bq5); |
| Marieke | 0:4d69864f1002 | 217 | |
| Marieke | 0:4d69864f1002 | 218 | filter_timer.attach(&filter_timer_act, 0.0004); //2500Hz (same as with filter coefficients on matlab!!! Thus adjust!) |
| Marieke | 0:4d69864f1002 | 219 | |
| Marieke | 0:4d69864f1002 | 220 | while(1) |
| Marieke | 0:4d69864f1002 | 221 | { |
| Marieke | 0:4d69864f1002 | 222 | if (filter_timer_go){ |
| Marieke | 0:4d69864f1002 | 223 | filter_timer_go=false; |
| Marieke | 0:4d69864f1002 | 224 | FilteredSample();} |
| Marieke | 0:4d69864f1002 | 225 | }*/ |
| Marieke | 0:4d69864f1002 | 226 | |
| Marieke | 0:4d69864f1002 | 227 | } |
| Marieke | 0:4d69864f1002 | 228 | } |
| Marieke | 0:4d69864f1002 | 229 | } |