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: biquadFilter mbed
emg-utils.cpp@5:dd261ba7b047, 2016-11-03 (annotated)
- Committer:
- Jankoekenpan
- Date:
- Thu Nov 03 10:01:14 2016 +0000
- Revision:
- 5:dd261ba7b047
- Parent:
- 2:8b790c03a760
working test version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ofosakar | 2:8b790c03a760 | 1 | //#include "mbed.h" |
ofosakar | 2:8b790c03a760 | 2 | //#include "HIDScope.h" |
ofosakar | 2:8b790c03a760 | 3 | //#include "BiQuad.h" |
ofosakar | 2:8b790c03a760 | 4 | //#include "math.h" |
ofosakar | 2:8b790c03a760 | 5 | //#include "emg-utils.h" |
ofosakar | 2:8b790c03a760 | 6 | // |
ofosakar | 2:8b790c03a760 | 7 | // |
ofosakar | 2:8b790c03a760 | 8 | //AnalogIn emg1(A0); |
ofosakar | 2:8b790c03a760 | 9 | //AnalogIn emg2(A1); |
ofosakar | 2:8b790c03a760 | 10 | // |
ofosakar | 2:8b790c03a760 | 11 | //HIDScope scope(6); |
ofosakar | 2:8b790c03a760 | 12 | //Ticker ticker; |
ofosakar | 2:8b790c03a760 | 13 | // |
ofosakar | 2:8b790c03a760 | 14 | //BiQuadChain bqc1; |
ofosakar | 2:8b790c03a760 | 15 | //BiQuadChain bqc2; |
ofosakar | 2:8b790c03a760 | 16 | // |
ofosakar | 2:8b790c03a760 | 17 | //// EMG BIQUAD 1 |
ofosakar | 2:8b790c03a760 | 18 | ////Bandpass butterworth filter + Notch butterworth filter. |
ofosakar | 2:8b790c03a760 | 19 | ////Bandpass: 10 --- 500 Hz |
ofosakar | 2:8b790c03a760 | 20 | ////No Bandpass filters |
ofosakar | 2:8b790c03a760 | 21 | ////Nothc: 50 +- 2 Hz |
ofosakar | 2:8b790c03a760 | 22 | //BiQuad bq11( 9.93756e-01, -1.89024e+00, 9.93756e-01, -1.89024e+00, 9.87512e-01 ); |
ofosakar | 2:8b790c03a760 | 23 | // |
ofosakar | 2:8b790c03a760 | 24 | //// EMG BIQUAD 2 |
ofosakar | 2:8b790c03a760 | 25 | ////Bandpass butterworth filter + Notch butterworth filter. |
ofosakar | 2:8b790c03a760 | 26 | ////Bandpass: 10 --- 500 Hz |
ofosakar | 2:8b790c03a760 | 27 | ////No Bandpass filters |
ofosakar | 2:8b790c03a760 | 28 | ////Nothc: 50 +- 2 Hz |
ofosakar | 2:8b790c03a760 | 29 | //BiQuad bq12( 9.93756e-01, -1.89024e+00, 9.93756e-01, -1.89024e+00, 9.87512e-01 ); |
ofosakar | 2:8b790c03a760 | 30 | // |
ofosakar | 2:8b790c03a760 | 31 | // |
ofosakar | 2:8b790c03a760 | 32 | //volatile float TOTAL_SAMPLE_SUM = 0; |
ofosakar | 2:8b790c03a760 | 33 | //volatile long NUMBER_SAMPLES = 0; |
ofosakar | 2:8b790c03a760 | 34 | // |
ofosakar | 2:8b790c03a760 | 35 | //const int numEmgCache = 50; |
ofosakar | 2:8b790c03a760 | 36 | //float emgCache1[numEmgCache]; //sorted from new to old; |
ofosakar | 2:8b790c03a760 | 37 | //float emgCache2[numEmgCache]; //sorted from new to old; |
ofosakar | 2:8b790c03a760 | 38 | // |
ofosakar | 2:8b790c03a760 | 39 | //void addFirst(float newValue, float array[], int size) { |
ofosakar | 2:8b790c03a760 | 40 | // for (int i = size - 2; i >= 0; i--) { |
ofosakar | 2:8b790c03a760 | 41 | // array[i+1] = array[i]; |
ofosakar | 2:8b790c03a760 | 42 | // } |
ofosakar | 2:8b790c03a760 | 43 | // array[0] = newValue; |
ofosakar | 2:8b790c03a760 | 44 | //} |
ofosakar | 2:8b790c03a760 | 45 | // |
ofosakar | 2:8b790c03a760 | 46 | //float average(float newValue, float array[], int size) { |
ofosakar | 2:8b790c03a760 | 47 | // float sum = 0; |
ofosakar | 2:8b790c03a760 | 48 | // for (int i = size - 2; i >= 0; i--) { |
ofosakar | 2:8b790c03a760 | 49 | // sum += array[i]; |
ofosakar | 2:8b790c03a760 | 50 | // } |
ofosakar | 2:8b790c03a760 | 51 | // // array[0] = newValue; |
ofosakar | 2:8b790c03a760 | 52 | // sum += newValue; |
ofosakar | 2:8b790c03a760 | 53 | // return sum / size; |
ofosakar | 2:8b790c03a760 | 54 | //} |
ofosakar | 1:984b6b6812c7 | 55 | // |
ofosakar | 2:8b790c03a760 | 56 | ////shifts the array by adding the new emg value up front. |
ofosakar | 2:8b790c03a760 | 57 | ////returns the new calculated average |
ofosakar | 2:8b790c03a760 | 58 | //float movingAverage(float newValue, float array[], int size) { |
ofosakar | 2:8b790c03a760 | 59 | // float sum = 0; |
ofosakar | 2:8b790c03a760 | 60 | // for (int i = size - 2; i >= 0; i--) { |
ofosakar | 2:8b790c03a760 | 61 | // array[i+1] = array[i]; |
ofosakar | 2:8b790c03a760 | 62 | // sum += array[i]; |
ofosakar | 2:8b790c03a760 | 63 | // } |
ofosakar | 2:8b790c03a760 | 64 | // array[0] = newValue; |
ofosakar | 2:8b790c03a760 | 65 | // sum += newValue; |
ofosakar | 2:8b790c03a760 | 66 | // return sum / size; |
ofosakar | 2:8b790c03a760 | 67 | //} |
ofosakar | 2:8b790c03a760 | 68 | // |
ofosakar | 2:8b790c03a760 | 69 | //float sum(float array[], int size) { |
ofosakar | 2:8b790c03a760 | 70 | // float sum = 0; |
ofosakar | 2:8b790c03a760 | 71 | // for (int i = 0; i < size; i++) { |
ofosakar | 2:8b790c03a760 | 72 | // sum += array[i]; |
ofosakar | 2:8b790c03a760 | 73 | // } |
ofosakar | 2:8b790c03a760 | 74 | // return sum; |
ofosakar | 2:8b790c03a760 | 75 | //} |
ofosakar | 2:8b790c03a760 | 76 | // |
ofosakar | 2:8b790c03a760 | 77 | //float mean(float array[], int size) { |
ofosakar | 2:8b790c03a760 | 78 | // return sum(array, size) / size; |
ofosakar | 2:8b790c03a760 | 79 | //} |
ofosakar | 2:8b790c03a760 | 80 | // |
ofosakar | 2:8b790c03a760 | 81 | //float meanSquare(float array[], int size) { |
ofosakar | 2:8b790c03a760 | 82 | // float naam[size]; |
ofosakar | 2:8b790c03a760 | 83 | // for(int i = 0; i < size; i++) { |
ofosakar | 2:8b790c03a760 | 84 | // naam[i] = pow(array[i], 2); |
ofosakar | 2:8b790c03a760 | 85 | // } |
ofosakar | 2:8b790c03a760 | 86 | // return sum(naam, size) / size; |
ofosakar | 2:8b790c03a760 | 87 | //} |
ofosakar | 2:8b790c03a760 | 88 | // |
ofosakar | 2:8b790c03a760 | 89 | //float variance(float array[], int size, float avg) { |
ofosakar | 2:8b790c03a760 | 90 | // float squaredDifferences[size]; |
ofosakar | 2:8b790c03a760 | 91 | // for (int i = 0; i < size; i++) { |
ofosakar | 2:8b790c03a760 | 92 | // float difference = array[i] - avg; |
ofosakar | 2:8b790c03a760 | 93 | // squaredDifferences[i] = difference*difference; |
ofosakar | 2:8b790c03a760 | 94 | // } |
ofosakar | 2:8b790c03a760 | 95 | // return mean(squaredDifferences, size); |
ofosakar | 2:8b790c03a760 | 96 | //} |
ofosakar | 2:8b790c03a760 | 97 | // |
ofosakar | 2:8b790c03a760 | 98 | //float standardDeviation(float array[], int size, float avg) { |
ofosakar | 2:8b790c03a760 | 99 | // return sqrt(variance(array, size, avg)); |
ofosakar | 2:8b790c03a760 | 100 | //} |
ofosakar | 2:8b790c03a760 | 101 | // |
ofosakar | 2:8b790c03a760 | 102 | //int decide(float value, float threshold) { |
ofosakar | 2:8b790c03a760 | 103 | // return value < threshold ? 0 : 1; |
ofosakar | 2:8b790c03a760 | 104 | //} |
ofosakar | 2:8b790c03a760 | 105 | // |
ofosakar | 2:8b790c03a760 | 106 | //float rectifier(float value) { |
ofosakar | 2:8b790c03a760 | 107 | // return fabs(value - 0.5f)*2.0f; |
ofosakar | 2:8b790c03a760 | 108 | //} |
ofosakar | 2:8b790c03a760 | 109 | // |
ofosakar | 2:8b790c03a760 | 110 | //void processEMG() { |
ofosakar | 2:8b790c03a760 | 111 | // float emgOne = emg1.read(); |
ofosakar | 2:8b790c03a760 | 112 | // scope.set(0, emgOne); |
ofosakar | 2:8b790c03a760 | 113 | // float notch1 = bqc1.step( emgOne ); |
ofosakar | 2:8b790c03a760 | 114 | // |
ofosakar | 2:8b790c03a760 | 115 | // float emgTwo = emg2.read(); |
ofosakar | 2:8b790c03a760 | 116 | // scope.set(1, emgTwo); |
ofosakar | 2:8b790c03a760 | 117 | // float notch2 = bqc2.step( emgTwo ); |
ofosakar | 2:8b790c03a760 | 118 | // |
ofosakar | 1:984b6b6812c7 | 119 | // |
ofosakar | 1:984b6b6812c7 | 120 | // |
ofosakar | 2:8b790c03a760 | 121 | // float rect1 = rectifier(notch1); |
ofosakar | 2:8b790c03a760 | 122 | //// scope.set(2, rect1); |
ofosakar | 2:8b790c03a760 | 123 | // |
ofosakar | 2:8b790c03a760 | 124 | // float rect2 = rectifier(notch2); |
ofosakar | 2:8b790c03a760 | 125 | //// scope.set(3, rect2); |
ofosakar | 2:8b790c03a760 | 126 | // |
ofosakar | 2:8b790c03a760 | 127 | // |
ofosakar | 2:8b790c03a760 | 128 | // float filtered1 = movingAverage( rect1, emgCache1, numEmgCache); |
ofosakar | 2:8b790c03a760 | 129 | // scope.set(2, filtered1); |
ofosakar | 2:8b790c03a760 | 130 | // |
ofosakar | 2:8b790c03a760 | 131 | // float filtered2 = movingAverage( rect2, emgCache2, numEmgCache); |
ofosakar | 2:8b790c03a760 | 132 | // scope.set(3, filtered2); |
ofosakar | 2:8b790c03a760 | 133 | // |
ofosakar | 2:8b790c03a760 | 134 | // float threshold1 = 0.114318; |
ofosakar | 2:8b790c03a760 | 135 | // float threshold2 = 0.118785; |
ofosakar | 2:8b790c03a760 | 136 | // int decide1 = decide(filtered1 , threshold1); |
ofosakar | 2:8b790c03a760 | 137 | // scope.set(4, decide1); |
ofosakar | 2:8b790c03a760 | 138 | // |
ofosakar | 2:8b790c03a760 | 139 | // int decide2 = decide(filtered2 , threshold2); |
ofosakar | 2:8b790c03a760 | 140 | // scope.set(5, decide2); |
ofosakar | 2:8b790c03a760 | 141 | // |
ofosakar | 2:8b790c03a760 | 142 | // |
ofosakar | 2:8b790c03a760 | 143 | // scope.send(); |
ofosakar | 2:8b790c03a760 | 144 | //} |
ofosakar | 2:8b790c03a760 | 145 | //// |
ofosakar | 2:8b790c03a760 | 146 | ////int main() |
ofosakar | 2:8b790c03a760 | 147 | ////{ |
ofosakar | 2:8b790c03a760 | 148 | //// bqc1.add( &bq11 ); |
ofosakar | 2:8b790c03a760 | 149 | //// bqc2.add( &bq12 ); |
ofosakar | 2:8b790c03a760 | 150 | //// |
ofosakar | 2:8b790c03a760 | 151 | //// |
ofosakar | 2:8b790c03a760 | 152 | ////// bqc1.add( &bq11 ); |
ofosakar | 2:8b790c03a760 | 153 | ////// bqc2.add( &bq12 ); |
ofosakar | 2:8b790c03a760 | 154 | //// // 500 HZ Ticker |
ofosakar | 2:8b790c03a760 | 155 | //// ticker.attach(&processEMG, 0.002); |
ofosakar | 2:8b790c03a760 | 156 | //// while (true); |
ofosakar | 2:8b790c03a760 | 157 | ////} |