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@1:278677bb6b99, 2016-10-21 (annotated)
- Committer:
- Marieke
- Date:
- Fri Oct 21 10:15:43 2016 +0000
- Revision:
- 1:278677bb6b99
- Parent:
- 0:4d69864f1002
- Child:
- 2:27081b83a58e
calibratie script: op moment alles in main loop, moet uiteindelijk weer in if-loop. Oproepen van void "sample()" werkt niet zoals gewenst.
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 | 1:278677bb6b99 | 61 | |
| Marieke | 1:278677bb6b99 | 62 | double EMGright; |
| Marieke | 1:278677bb6b99 | 63 | double EMGleft; |
| Marieke | 0:4d69864f1002 | 64 | //average_timer_go=false, |
| Marieke | 0:4d69864f1002 | 65 | // Activates go-flags |
| Marieke | 0:4d69864f1002 | 66 | //void average_timer_act(){average_timer_go=true;}; |
| Marieke | 0:4d69864f1002 | 67 | /*void filter_timer_act(){filter_timer_go=true;}; |
| Marieke | 0:4d69864f1002 | 68 | |
| Marieke | 1:278677bb6b99 | 69 | |
| Marieke | 1:278677bb6b99 | 70 | |
| Marieke | 0:4d69864f1002 | 71 | BiQuadChain bcq; |
| Marieke | 0:4d69864f1002 | 72 | // Notch filter wo=50; bw=wo/35 |
| Marieke | 0:4d69864f1002 | 73 | BiQuad bq1(9.7805e-01,-1.1978e-16,9.7805e-01,1.0000e+00,-1.1978e-16,9.5610e-01); |
| Marieke | 0:4d69864f1002 | 74 | // High pass Butterworth filter 2nd order, Fc=10; |
| Marieke | 0:4d69864f1002 | 75 | BiQuad bq2(9.8239e-01,-1.9648e+00,9.8239e-01,1.0000e+00,-1.9645e+00,9.6508e-01); |
| Marieke | 0:4d69864f1002 | 76 | // Low pass Butterworth filter 2nd order, Fc = 8; |
| Marieke | 0:4d69864f1002 | 77 | BiQuad bq3(5.6248e-05,1.1250e-04,5.6248e-05,1.0000e+00,-1.9787e+00,9.7890e-01); |
| Marieke | 0:4d69864f1002 | 78 | // Low pass Butterworth filter 4th order, Fc = 450; plited up in 2x2nd order |
| Marieke | 0:4d69864f1002 | 79 | BiQuad bq4(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-4.6382e-01,8.9354e-02); |
| Marieke | 0:4d69864f1002 | 80 | BiQuad bq5(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-6.3254e-01,4.8559e-01);*/ |
| Marieke | 0:4d69864f1002 | 81 | |
| Marieke | 0:4d69864f1002 | 82 | void KeepTrackOfTime() |
| Marieke | 0:4d69864f1002 | 83 | { |
| Marieke | 0:4d69864f1002 | 84 | time_passed++; |
| Marieke | 0:4d69864f1002 | 85 | } |
| Marieke | 0:4d69864f1002 | 86 | |
| Marieke | 1:278677bb6b99 | 87 | void sample() |
| Marieke | 0:4d69864f1002 | 88 | { |
| Marieke | 1:278677bb6b99 | 89 | double EMGright = emg0; |
| Marieke | 1:278677bb6b99 | 90 | double EMGleft = emg1; |
| Marieke | 1:278677bb6b99 | 91 | /*.set(0, emg0.read() ); |
| Marieke | 0:4d69864f1002 | 92 | scope.set(1, emg1.read() ); |
| Marieke | 0:4d69864f1002 | 93 | |
| Marieke | 0:4d69864f1002 | 94 | scope.send(); |
| Marieke | 0:4d69864f1002 | 95 | |
| Marieke | 0:4d69864f1002 | 96 | led1 = 0; |
| Marieke | 0:4d69864f1002 | 97 | wait(0.5f); |
| Marieke | 0:4d69864f1002 | 98 | led1 = 1; |
| Marieke | 1:278677bb6b99 | 99 | wait(0.5f);*/ |
| Marieke | 1:278677bb6b99 | 100 | } |
| Marieke | 0:4d69864f1002 | 101 | |
| Marieke | 0:4d69864f1002 | 102 | // In the following: R is used for right arm, L is used for left arm! |
| Marieke | 0:4d69864f1002 | 103 | /*void FilteredSample() |
| Marieke | 0:4d69864f1002 | 104 | { |
| Marieke | 0:4d69864f1002 | 105 | double inR = emg0.read(); |
| Marieke | 0:4d69864f1002 | 106 | double inL = emg1.read(); |
| Marieke | 0:4d69864f1002 | 107 | //double inLcal = inL-averageL(sumL,size); |
| Marieke | 0:4d69864f1002 | 108 | double outRnotch = bq1.step(inR); |
| Marieke | 0:4d69864f1002 | 109 | double outRhigh = bq2.step(outRnotch); |
| Marieke | 0:4d69864f1002 | 110 | double outRrect = fabs(outRhigh); |
| Marieke | 0:4d69864f1002 | 111 | double outRlow = bcq.step(outRrect); |
| Marieke | 0:4d69864f1002 | 112 | double outLnotch = bq1.step(inL); |
| Marieke | 0:4d69864f1002 | 113 | double outLhigh = bq2.step(outLnotch); |
| Marieke | 0:4d69864f1002 | 114 | double outLrect = fabs(outLhigh); |
| Marieke | 0:4d69864f1002 | 115 | double outLlow = bcq.step(outLrect); |
| Marieke | 0:4d69864f1002 | 116 | |
| Marieke | 0:4d69864f1002 | 117 | scope.set(0, inR); |
| Marieke | 0:4d69864f1002 | 118 | scope.set(1, inL); |
| Marieke | 0:4d69864f1002 | 119 | scope.set(2, outRlow); |
| Marieke | 0:4d69864f1002 | 120 | scope.set(3, outLlow); |
| Marieke | 0:4d69864f1002 | 121 | |
| Marieke | 0:4d69864f1002 | 122 | |
| Marieke | 0:4d69864f1002 | 123 | scope.send(); |
| Marieke | 0:4d69864f1002 | 124 | // To indicate that the function is working, the LED is toggled |
| Marieke | 0:4d69864f1002 | 125 | led2 = !led2; |
| Marieke | 0:4d69864f1002 | 126 | }*/ |
| Marieke | 0:4d69864f1002 | 127 | |
| Marieke | 0:4d69864f1002 | 128 | |
| Marieke | 0:4d69864f1002 | 129 | /* |
| Marieke | 0:4d69864f1002 | 130 | void average(double averageR, double averageL) |
| Marieke | 0:4d69864f1002 | 131 | { |
| Marieke | 0:4d69864f1002 | 132 | int averageR(int,int); |
| Marieke | 0:4d69864f1002 | 133 | int averageL(int,int); |
| Marieke | 0:4d69864f1002 | 134 | int size = 5000; //10/0.002 |
| Marieke | 0:4d69864f1002 | 135 | int arrayR[size]; //declaring array |
| Marieke | 0:4d69864f1002 | 136 | int arrayL[size]; |
| Marieke | 0:4d69864f1002 | 137 | int sumR = 0; |
| Marieke | 0:4d69864f1002 | 138 | int sumL = 0; |
| Marieke | 0:4d69864f1002 | 139 | |
| Marieke | 0:4d69864f1002 | 140 | for (int i=0;i<size;i++) |
| Marieke | 0:4d69864f1002 | 141 | { |
| Marieke | 0:4d69864f1002 | 142 | double EMGright = emg0.read(); |
| Marieke | 0:4d69864f1002 | 143 | double EMGleft = emg1.read(); |
| Marieke | 0:4d69864f1002 | 144 | EMGright = arrayR[i]; |
| Marieke | 0:4d69864f1002 | 145 | EMGleft = arrayL[i]; |
| Marieke | 0:4d69864f1002 | 146 | sumL = sumL+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 147 | sumR=sumR+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 148 | //double averageR = sumR/arrayR; |
| Marieke | 0:4d69864f1002 | 149 | //double averageL = sumL/arrayL; |
| Marieke | 0:4d69864f1002 | 150 | } |
| Marieke | 0:4d69864f1002 | 151 | return averageR=sumR/sizeR; |
| Marieke | 0:4d69864f1002 | 152 | return averageL(sumL,sizeL);*/ |
| Marieke | 0:4d69864f1002 | 153 | |
| Marieke | 1:278677bb6b99 | 154 | float averageR(int sumR, int size) |
| Marieke | 0:4d69864f1002 | 155 | { |
| Marieke | 1:278677bb6b99 | 156 | return (float) sumR/size; |
| Marieke | 0:4d69864f1002 | 157 | } |
| Marieke | 0:4d69864f1002 | 158 | |
| Marieke | 1:278677bb6b99 | 159 | float averageL(int sumL, int size) |
| Marieke | 0:4d69864f1002 | 160 | { |
| Marieke | 1:278677bb6b99 | 161 | return (float) sumL/size; |
| Marieke | 0:4d69864f1002 | 162 | } |
| Marieke | 0:4d69864f1002 | 163 | |
| Marieke | 0:4d69864f1002 | 164 | |
| Marieke | 0:4d69864f1002 | 165 | int main() |
| Marieke | 0:4d69864f1002 | 166 | { |
| Marieke | 0:4d69864f1002 | 167 | pc.baud(115200); |
| Marieke | 0:4d69864f1002 | 168 | led1=1; |
| Marieke | 0:4d69864f1002 | 169 | led2=1; |
| Marieke | 0:4d69864f1002 | 170 | t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds |
| Marieke | 0:4d69864f1002 | 171 | |
| Marieke | 1:278677bb6b99 | 172 | //for (;;) { |
| Marieke | 1:278677bb6b99 | 173 | //if (time_passed<=10) |
| Marieke | 1:278677bb6b99 | 174 | //{ |
| Marieke | 1:278677bb6b99 | 175 | //sample_timer.attach(&sample, 0.002); //500Hz |
| Marieke | 0:4d69864f1002 | 176 | |
| Marieke | 1:278677bb6b99 | 177 | /*float averageR(float,int); |
| Marieke | 1:278677bb6b99 | 178 | float averageL(float,int); |
| Marieke | 0:4d69864f1002 | 179 | int size = 500; //10/0.002 |
| Marieke | 0:4d69864f1002 | 180 | int arrayR[size]; //declaring array |
| Marieke | 0:4d69864f1002 | 181 | int arrayL[size]; |
| Marieke | 0:4d69864f1002 | 182 | int sumR = 0; |
| Marieke | 0:4d69864f1002 | 183 | int sumL = 0; |
| Marieke | 1:278677bb6b99 | 184 | float EMGright = emg0.read(); |
| Marieke | 1:278677bb6b99 | 185 | float EMGleft = emg1.read(); |
| Marieke | 0:4d69864f1002 | 186 | |
| Marieke | 0:4d69864f1002 | 187 | for (int i=0;i<size;i++) |
| Marieke | 0:4d69864f1002 | 188 | { |
| Marieke | 1:278677bb6b99 | 189 | emg0.read() = arrayR[i]; |
| Marieke | 1:278677bb6b99 | 190 | arrayL[i]= emg1.read(); |
| Marieke | 1:278677bb6b99 | 191 | sumL = sumL+arrayL[i]; |
| Marieke | 0:4d69864f1002 | 192 | sumR = sumR+arrayR[i]; |
| Marieke | 0:4d69864f1002 | 193 | } |
| Marieke | 0:4d69864f1002 | 194 | // Calibration step with the gained averages |
| Marieke | 0:4d69864f1002 | 195 | //double CalibrationFactorR = 0.5/averageR(sumR,size); |
| Marieke | 0:4d69864f1002 | 196 | //double CalibrationFactorL = 0.5/averageL(sumL,size); |
| Marieke | 1:278677bb6b99 | 197 | */ |
| Marieke | 1:278677bb6b99 | 198 | int size = 12500; |
| Marieke | 1:278677bb6b99 | 199 | int i; |
| Marieke | 1:278677bb6b99 | 200 | double EMGsumR; |
| Marieke | 1:278677bb6b99 | 201 | double EMGsumL; |
| Marieke | 1:278677bb6b99 | 202 | |
| Marieke | 1:278677bb6b99 | 203 | while(i<size){ |
| Marieke | 1:278677bb6b99 | 204 | sample(); |
| Marieke | 1:278677bb6b99 | 205 | EMGsumR = emg0.read()+EMGsumR; |
| Marieke | 1:278677bb6b99 | 206 | EMGsumL = EMGleft+EMGsumL; |
| Marieke | 1:278677bb6b99 | 207 | i++; |
| Marieke | 1:278677bb6b99 | 208 | wait(0.0004); |
| Marieke | 1:278677bb6b99 | 209 | } |
| Marieke | 1:278677bb6b99 | 210 | |
| Marieke | 1:278677bb6b99 | 211 | double averageEMGr = (double) EMGsumR/size; |
| Marieke | 1:278677bb6b99 | 212 | double averageEMGl = (double) EMGsumL/size; |
| Marieke | 1:278677bb6b99 | 213 | double InRcal = emg0.read()-averageEMGr; |
| Marieke | 1:278677bb6b99 | 214 | double InLcal = emg1.read()-averageEMGl; |
| Marieke | 1:278677bb6b99 | 215 | |
| Marieke | 1:278677bb6b99 | 216 | led1 =!led1; |
| Marieke | 1:278677bb6b99 | 217 | //wait(0.5f); |
| Marieke | 0:4d69864f1002 | 218 | |
| Marieke | 0:4d69864f1002 | 219 | /*scope.set(0, emg0.read() ); |
| Marieke | 0:4d69864f1002 | 220 | scope.set(1, 1 ); |
| Marieke | 0:4d69864f1002 | 221 | scope.set(2, averageEMGr); |
| Marieke | 0:4d69864f1002 | 222 | scope.set(3, averageL(sumL,size)); |
| Marieke | 0:4d69864f1002 | 223 | scope.set(5, InRcal ); |
| Marieke | 0:4d69864f1002 | 224 | scope.set(6, InLcal ); |
| Marieke | 0:4d69864f1002 | 225 | |
| Marieke | 0:4d69864f1002 | 226 | scope.send();*/ |
| Marieke | 1:278677bb6b99 | 227 | //pc.printf("EMG-signal = %f\n\r",emg0.read()); |
| Marieke | 0:4d69864f1002 | 228 | pc.printf("averageR = %f\n\r",averageEMGr); |
| Marieke | 1:278677bb6b99 | 229 | pc.printf("averageR = %f\n\r",averageEMGl); |
| Marieke | 1:278677bb6b99 | 230 | //pc.printf("averageRvoid = %f\n\r",averageR(sumR,size)); |
| Marieke | 1:278677bb6b99 | 231 | //pc.printf("Detrend EMG = %f\n\r",InRcal); |
| Marieke | 1:278677bb6b99 | 232 | //pc.printf("array value = %f\n\r",arrayR[3]); |
| Marieke | 1:278677bb6b99 | 233 | pc.printf("test\n\r"); |
| Marieke | 1:278677bb6b99 | 234 | pc.printf("EMG sum = %f\n\r",EMGsumR); |
| Marieke | 1:278677bb6b99 | 235 | pc.printf("EMG signal = %f\n\r",EMGright); |
| Marieke | 0:4d69864f1002 | 236 | |
| Marieke | 1:278677bb6b99 | 237 | /*else |
| Marieke | 0:4d69864f1002 | 238 | { |
| Marieke | 0:4d69864f1002 | 239 | |
| Marieke | 0:4d69864f1002 | 240 | led1 = 1; |
| Marieke | 0:4d69864f1002 | 241 | led2=!led2; |
| Marieke | 0:4d69864f1002 | 242 | |
| Marieke | 1:278677bb6b99 | 243 | bcq.add(&bq3).add(&bq4).add(&bq5); |
| Marieke | 0:4d69864f1002 | 244 | |
| Marieke | 0:4d69864f1002 | 245 | filter_timer.attach(&filter_timer_act, 0.0004); //2500Hz (same as with filter coefficients on matlab!!! Thus adjust!) |
| Marieke | 0:4d69864f1002 | 246 | |
| Marieke | 0:4d69864f1002 | 247 | while(1) |
| Marieke | 0:4d69864f1002 | 248 | { |
| Marieke | 0:4d69864f1002 | 249 | if (filter_timer_go){ |
| Marieke | 0:4d69864f1002 | 250 | filter_timer_go=false; |
| Marieke | 0:4d69864f1002 | 251 | FilteredSample();} |
| Marieke | 1:278677bb6b99 | 252 | } |
| Marieke | 0:4d69864f1002 | 253 | |
| Marieke | 1:278677bb6b99 | 254 | }*/ |
| Marieke | 1:278677bb6b99 | 255 | |
| Marieke | 0:4d69864f1002 | 256 | } |