Dependencies:   mbed HIDScope biquadFilter

Committer:
hidde1104
Date:
Wed Oct 16 12:13:09 2019 +0000
Revision:
24:2637e0160301
Parent:
23:4c66541f00d3
Child:
25:10be3ac71e2f
Normalisation wellicht goed nu?;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:32bb76391d89 1 #include "mbed.h"
vsluiter 11:ce72ec658a95 2 #include "HIDScope.h"
hidde1104 21:48b40b82d195 3 #include "BiQuad.h"
hidde1104 24:2637e0160301 4 #include "algorithm"
hidde1104 23:4c66541f00d3 5 Serial pc(USBTX, USBRX);
hidde1104 22:65c90d816235 6 InterruptIn but1(PTC6);
hidde1104 21:48b40b82d195 7
hidde1104 21:48b40b82d195 8 BiQuad bq1 (0.881889334678067, -1.76377866935613, 0.8818893346780671, -1.77069673005903, 0.797707797506027);
hidde1104 21:48b40b82d195 9
hidde1104 21:48b40b82d195 10 BiQuad bq2 (0.000198358203463849, 0.000396716406927699, 0.000198358203463849, -1.96262073248799, 0.963423352820821);
hidde1104 21:48b40b82d195 11
hidde1104 21:48b40b82d195 12
hidde1104 21:48b40b82d195 13 BiQuadChain bqc;
hidde1104 21:48b40b82d195 14
vsluiter 0:32bb76391d89 15
vsluiter 4:8b298dfada81 16 //Define objects
tomlankhorst 19:2bf824669684 17 AnalogIn emg0( A0 );
tomlankhorst 19:2bf824669684 18 AnalogIn emg1( A1 );
tomlankhorst 19:2bf824669684 19
tomlankhorst 14:f83354387756 20 Ticker sample_timer;
hidde1104 24:2637e0160301 21 Ticker calibrate_emg_timer;
hidde1104 21:48b40b82d195 22 HIDScope scope( 3 );
hidde1104 24:2637e0160301 23 DigitalOut led1(LED1);
hidde1104 24:2637e0160301 24 DigitalOut led2(LED2);
hidde1104 24:2637e0160301 25 DigitalOut led3(LED3);
vsluiter 2:e314bb3b2d99 26
tomlankhorst 14:f83354387756 27 /** Sample function
tomlankhorst 14:f83354387756 28 * this function samples the emg and sends it to HIDScope
tomlankhorst 14:f83354387756 29 **/
hidde1104 21:48b40b82d195 30
hidde1104 24:2637e0160301 31 /*
hidde1104 24:2637e0160301 32 double sample_max = 0.0f;
hidde1104 24:2637e0160301 33 double sample_min = 1.0f;
hidde1104 24:2637e0160301 34 int o = 0;
hidde1104 22:65c90d816235 35
hidde1104 23:4c66541f00d3 36 float emg0_value = emg0.read();
hidde1104 22:65c90d816235 37 float emg1_value = emg1.read();
hidde1104 22:65c90d816235 38
hidde1104 22:65c90d816235 39 float filter_value = fabs(bq2.step(fabs(bq1.step(emg0_value - emg1_value))));
hidde1104 24:2637e0160301 40 */
hidde1104 22:65c90d816235 41
hidde1104 24:2637e0160301 42 const int length = 1000;
hidde1104 24:2637e0160301 43 int i = 0;
hidde1104 24:2637e0160301 44 int j = 0;
hidde1104 23:4c66541f00d3 45
hidde1104 24:2637e0160301 46 float filter_value;
hidde1104 24:2637e0160301 47 float filter_value_2;
hidde1104 24:2637e0160301 48 float emg0_value;
hidde1104 24:2637e0160301 49 float emg1_value;
hidde1104 23:4c66541f00d3 50
hidde1104 24:2637e0160301 51 float emg_mean_array[length] = { };
hidde1104 24:2637e0160301 52 float emg_mean;
hidde1104 24:2637e0160301 53
hidde1104 24:2637e0160301 54 float filter_max = 0;
hidde1104 24:2637e0160301 55
tomlankhorst 14:f83354387756 56 void sample()
vsluiter 2:e314bb3b2d99 57 {
tomlankhorst 19:2bf824669684 58 /* Set the sampled emg values in channel 0 (the first channel) and 1 (the second channel) in the 'HIDScope' instance named 'scope' */
hidde1104 24:2637e0160301 59 emg0_value = emg0.read();
hidde1104 24:2637e0160301 60 emg1_value = emg1.read();
hidde1104 21:48b40b82d195 61
hidde1104 21:48b40b82d195 62 //double filter_value = bqc.step(emg1_value);
hidde1104 24:2637e0160301 63 //filter_value = fabs(bq2.step(fabs(bq1.step(emg0_value - emg1_value))));
hidde1104 24:2637e0160301 64 //float filter_value = fabs(bq2.step(fabs(bq1.step(emg0_value)))); //alleen emg0 geeft een betere baseline dan emg0 - emg1
hidde1104 24:2637e0160301 65
hidde1104 24:2637e0160301 66
hidde1104 23:4c66541f00d3 67 /*
hidde1104 21:48b40b82d195 68 if (filter_value > sample_max) {
hidde1104 21:48b40b82d195 69 sample_max = filter_value;
hidde1104 21:48b40b82d195 70 }
hidde1104 24:2637e0160301 71 if (filter_value < sample_min) {
hidde1104 21:48b40b82d195 72 sample_min = filter_value;
hidde1104 21:48b40b82d195 73 }
hidde1104 24:2637e0160301 74
hidde1104 24:2637e0160301 75
hidde1104 24:2637e0160301 76 //filter_value = filter_value/sample_max;
hidde1104 21:48b40b82d195 77
hidde1104 24:2637e0160301 78 filter_value = filter_value-((sample_max+sample_min)/2);
hidde1104 24:2637e0160301 79 filter_value = filter_value/(sample_max-sample_min);
hidde1104 24:2637e0160301 80 */
hidde1104 24:2637e0160301 81
hidde1104 24:2637e0160301 82
hidde1104 24:2637e0160301 83 //filter_value = filter_value - filter_mean;
hidde1104 24:2637e0160301 84 //filter_value = filter_value/filter_max;
hidde1104 23:4c66541f00d3 85
hidde1104 23:4c66541f00d3 86 //but1.mode(PullUp);
hidde1104 23:4c66541f00d3 87 //but1.rise(&calibrate);
hidde1104 23:4c66541f00d3 88
hidde1104 21:48b40b82d195 89
tomlankhorst 19:2bf824669684 90 scope.set(0, emg0.read() );
tomlankhorst 19:2bf824669684 91 scope.set(1, emg1.read() );
tomlankhorst 19:2bf824669684 92 /* Repeat the step above if required for more channels of required (channel 0 up to 5 = 6 channels)
tomlankhorst 19:2bf824669684 93 * Ensure that enough channels are available (HIDScope scope( 2 ))
tomlankhorst 20:97059009a491 94 * Finally, send all channels to the PC at once */
vsluiter 11:ce72ec658a95 95 scope.send();
tomlankhorst 18:21d8e7a81cf5 96 /* To indicate that the function is working, the LED is toggled */
hidde1104 24:2637e0160301 97 led2 = !led2;
vsluiter 2:e314bb3b2d99 98 }
vsluiter 0:32bb76391d89 99
hidde1104 24:2637e0160301 100
hidde1104 24:2637e0160301 101
hidde1104 24:2637e0160301 102
hidde1104 24:2637e0160301 103
hidde1104 24:2637e0160301 104 float emg0_value_2;
hidde1104 24:2637e0160301 105 float emg1_value_2;
hidde1104 24:2637e0160301 106 float emg_mean_corr;
hidde1104 24:2637e0160301 107
hidde1104 24:2637e0160301 108 void sample_2() { // mean corrected emg waarden die worden gebruikt voor de eerste instantie van filter_value.
hidde1104 24:2637e0160301 109 emg0_value_2 = emg0.read();
hidde1104 24:2637e0160301 110 emg1_value_2 = emg1.read();
hidde1104 22:65c90d816235 111
hidde1104 24:2637e0160301 112 emg_mean_corr = (emg0_value_2-emg1_value_2)-emg_mean;
hidde1104 24:2637e0160301 113
hidde1104 24:2637e0160301 114 filter_value = fabs(bq2.step(fabs(bq1.step(emg_mean_corr))));
hidde1104 24:2637e0160301 115 scope.set(2, filter_value);
hidde1104 24:2637e0160301 116 }
hidde1104 24:2637e0160301 117
hidde1104 24:2637e0160301 118
hidde1104 24:2637e0160301 119
hidde1104 24:2637e0160301 120
hidde1104 24:2637e0160301 121 float filter_array[length] = { };
hidde1104 24:2637e0160301 122
hidde1104 24:2637e0160301 123 void calibration_preparation() {
hidde1104 24:2637e0160301 124 while (i < length) {
hidde1104 24:2637e0160301 125 sample();
hidde1104 24:2637e0160301 126 filter_array [i] = filter_value;
hidde1104 24:2637e0160301 127 i++;
hidde1104 24:2637e0160301 128 }
hidde1104 24:2637e0160301 129
hidde1104 24:2637e0160301 130
hidde1104 24:2637e0160301 131 int filter_max = 0;
hidde1104 24:2637e0160301 132 int m;
hidde1104 24:2637e0160301 133 for (m = 0 ; m < length ; m++);
hidde1104 24:2637e0160301 134
hidde1104 24:2637e0160301 135 if (filter_array[m] > filter_max) {
hidde1104 24:2637e0160301 136 filter_max = filter_array[m];
hidde1104 24:2637e0160301 137 }
hidde1104 24:2637e0160301 138 }
hidde1104 24:2637e0160301 139
hidde1104 24:2637e0160301 140
hidde1104 24:2637e0160301 141
hidde1104 24:2637e0160301 142
hidde1104 24:2637e0160301 143
hidde1104 24:2637e0160301 144 void emg_mean_function() {
hidde1104 24:2637e0160301 145 while (j < length) {
hidde1104 24:2637e0160301 146 sample();
hidde1104 24:2637e0160301 147 emg_mean_array[i] = emg0_value - emg1_value;
hidde1104 24:2637e0160301 148 j++;
hidde1104 24:2637e0160301 149 }
hidde1104 24:2637e0160301 150 float emg_sum = 0;
hidde1104 24:2637e0160301 151 for (int n = 0; n < length; n++) {
hidde1104 24:2637e0160301 152 emg_sum += emg_mean_array[n];
hidde1104 24:2637e0160301 153 }
hidde1104 24:2637e0160301 154 emg_mean = emg_sum/length;
hidde1104 24:2637e0160301 155 }
hidde1104 24:2637e0160301 156
hidde1104 24:2637e0160301 157
hidde1104 24:2637e0160301 158
hidde1104 24:2637e0160301 159
hidde1104 24:2637e0160301 160 void sample_3() {
hidde1104 24:2637e0160301 161
hidde1104 24:2637e0160301 162 filter_value_2 = filter_value/filter_max;
hidde1104 24:2637e0160301 163
hidde1104 24:2637e0160301 164 scope.set(2, filter_value_2 );
hidde1104 24:2637e0160301 165 }
hidde1104 24:2637e0160301 166
vsluiter 0:32bb76391d89 167 int main()
tomlankhorst 19:2bf824669684 168 {
hidde1104 24:2637e0160301 169
hidde1104 23:4c66541f00d3 170 pc.baud(115200);
hidde1104 24:2637e0160301 171
tomlankhorst 14:f83354387756 172 /**Attach the 'sample' function to the timer 'sample_timer'.
tomlankhorst 19:2bf824669684 173 * this ensures that 'sample' is executed every... 0.002 seconds = 500 Hz
vsluiter 4:8b298dfada81 174 */
hidde1104 24:2637e0160301 175
hidde1104 24:2637e0160301 176
hidde1104 24:2637e0160301 177 emg_mean_function();
hidde1104 24:2637e0160301 178 sample_2();
hidde1104 24:2637e0160301 179
hidde1104 24:2637e0160301 180
hidde1104 24:2637e0160301 181
hidde1104 24:2637e0160301 182
hidde1104 24:2637e0160301 183 sample_timer.attach(&sample_3, 0.001);
tomlankhorst 14:f83354387756 184 /*empty loop, sample() is executed periodically*/
hidde1104 24:2637e0160301 185 //pc.printf("The value of sample_min is %f\n\r",sample_min);
hidde1104 24:2637e0160301 186 //pc.printf("The value of sample_max is %f\n\r",sample_max);
hidde1104 23:4c66541f00d3 187 while(1) {
hidde1104 23:4c66541f00d3 188 }
hidde1104 21:48b40b82d195 189 }