Anaïs Chaumeil / Mbed 2 deprecated EMG_processing_biorobotics_group19

Dependencies:   mbed HIDScope FXOS8700Q

Committer:
AnaisChaumeil
Date:
Mon Oct 14 17:30:57 2019 +0000
Revision:
2:c177a3e9708e
Parent:
1:0b3280b1795e
Child:
3:15eeab5ba885
array has now 2 values only (direct time), no normalization phase (don't know how)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnaisChaumeil 0:971166224b2d 1 #include "mbed.h"
AnaisChaumeil 0:971166224b2d 2 #include "math.h"
AnaisChaumeil 0:971166224b2d 3
AnaisChaumeil 0:971166224b2d 4 // CODE THE PART WHERE WE PUT THE SIGNAL INTO RAW_SIGNAL
AnaisChaumeil 2:c177a3e9708e 5 // IF NEEDED WE CAN HAVE THE FILTERS OF SECOND ORDER
AnaisChaumeil 0:971166224b2d 6
AnaisChaumeil 0:971166224b2d 7 // Defining objects
AnaisChaumeil 0:971166224b2d 8
AnaisChaumeil 0:971166224b2d 9 AnalogIn emg0( A0 ); // for movement up/down, named A
AnaisChaumeil 0:971166224b2d 10 AnalogIn emg1( A1 );
AnaisChaumeil 0:971166224b2d 11
AnaisChaumeil 0:971166224b2d 12 AnalogIn emg2( A2 ); // for movement forward/backward, named B
AnaisChaumeil 0:971166224b2d 13 AnalogIn emg3( A3 );
AnaisChaumeil 0:971166224b2d 14
AnaisChaumeil 1:0b3280b1795e 15 //int mark=0; // allows us to know where we are exactly in the sampling process
AnaisChaumeil 0:971166224b2d 16
AnaisChaumeil 0:971166224b2d 17 const double pi=3.14;
AnaisChaumeil 0:971166224b2d 18
AnaisChaumeil 0:971166224b2d 19 // define two functions that will be attached to the tickers
AnaisChaumeil 0:971166224b2d 20 Ticker sampling; // ticker for the sampling of the signal, every 0.002s a value is sampled
AnaisChaumeil 0:971166224b2d 21 Ticker processing; //ticker that defines the signal processed, every second a signal is defined
AnaisChaumeil 0:971166224b2d 22
AnaisChaumeil 2:c177a3e9708e 23 double raw_signal_0[2]; // has the values measured via the electrodes
AnaisChaumeil 2:c177a3e9708e 24 double raw_signal_1[2];
AnaisChaumeil 2:c177a3e9708e 25 double raw_signal_2[2];
AnaisChaumeil 2:c177a3e9708e 26 double raw_signal_3[2];
AnaisChaumeil 0:971166224b2d 27
AnaisChaumeil 2:c177a3e9708e 28 double filt0[2]; // raw_emg_1 filtered by high pass filter
AnaisChaumeil 2:c177a3e9708e 29 double filt1[2];
AnaisChaumeil 2:c177a3e9708e 30 double filt2[2];
AnaisChaumeil 2:c177a3e9708e 31 double filt3[2];
AnaisChaumeil 0:971166224b2d 32
AnaisChaumeil 2:c177a3e9708e 33 double filt_filt0[2]; // filt1 filtered by low pass filter
AnaisChaumeil 2:c177a3e9708e 34 double filt_filt1[2];
AnaisChaumeil 2:c177a3e9708e 35 double filt_filt2[2];
AnaisChaumeil 2:c177a3e9708e 36 double filt_filt3[2];
AnaisChaumeil 0:971166224b2d 37
AnaisChaumeil 2:c177a3e9708e 38 double emgA; // not an array
AnaisChaumeil 2:c177a3e9708e 39 double emgB;
AnaisChaumeil 0:971166224b2d 40
AnaisChaumeil 2:c177a3e9708e 41 double emg_absA[2]; // absolute value applied to emg
AnaisChaumeil 2:c177a3e9708e 42 double emg_absB[2];
AnaisChaumeil 0:971166224b2d 43
AnaisChaumeil 2:c177a3e9708e 44 double emg_filtA[2];
AnaisChaumeil 2:c177a3e9708e 45 double emg_filtB[2];
AnaisChaumeil 0:971166224b2d 46
AnaisChaumeil 2:c177a3e9708e 47 double emg_normA[2]; // normalization of emg_rms
AnaisChaumeil 2:c177a3e9708e 48 double emg_normB[2];
AnaisChaumeil 0:971166224b2d 49
AnaisChaumeil 1:0b3280b1795e 50 bool modeA= false; // running motor at intermediate speed, derived from threshold
AnaisChaumeil 1:0b3280b1795e 51 bool modeB= false;
AnaisChaumeil 0:971166224b2d 52
AnaisChaumeil 1:0b3280b1795e 53 bool speedA= false; // running motor at high speed
AnaisChaumeil 1:0b3280b1795e 54 bool speedB= false;
AnaisChaumeil 0:971166224b2d 55
AnaisChaumeil 0:971166224b2d 56 double T=0.002; // time between two samples
AnaisChaumeil 0:971166224b2d 57
AnaisChaumeil 0:971166224b2d 58
AnaisChaumeil 0:971166224b2d 59 void sample()
AnaisChaumeil 0:971166224b2d 60 {
AnaisChaumeil 2:c177a3e9708e 61 // raw_signal=[ value(T-2), value(T-1), value(T)]
AnaisChaumeil 2:c177a3e9708e 62 raw_signal_0[0]=raw_signal_0[1];
AnaisChaumeil 2:c177a3e9708e 63 raw_signal_1[0]=raw_signal_1[1];
AnaisChaumeil 2:c177a3e9708e 64 raw_signal_2[0]=raw_signal_2[1];
AnaisChaumeil 2:c177a3e9708e 65 raw_signal_3[0]=raw_signal_3[1];
AnaisChaumeil 2:c177a3e9708e 66
AnaisChaumeil 2:c177a3e9708e 67 raw_signal_0[1]=emg0.read();
AnaisChaumeil 2:c177a3e9708e 68 raw_signal_1[1]=emg1.read();
AnaisChaumeil 2:c177a3e9708e 69 raw_signal_2[1]=emg2.read();
AnaisChaumeil 2:c177a3e9708e 70 raw_signal_3[1]=emg3.read();
AnaisChaumeil 0:971166224b2d 71 }
AnaisChaumeil 0:971166224b2d 72
AnaisChaumeil 0:971166224b2d 73
AnaisChaumeil 0:971166224b2d 74 // BIG FUNCTION THAT INCLUDES EVERYTHING
AnaisChaumeil 0:971166224b2d 75
AnaisChaumeil 0:971166224b2d 76 void processing_signals()
AnaisChaumeil 0:971166224b2d 77 {
AnaisChaumeil 2:c177a3e9708e 78
AnaisChaumeil 0:971166224b2d 79 // LOWPASS FILTER
AnaisChaumeil 0:971166224b2d 80 double wclp=300*2*pi; // cutoff omega for low pass filter
AnaisChaumeil 0:971166224b2d 81
AnaisChaumeil 0:971166224b2d 82 // initialization of the filt arrays
AnaisChaumeil 2:c177a3e9708e 83 filt0[0]=filt0[1];
AnaisChaumeil 2:c177a3e9708e 84 filt1[0]=filt1[1];
AnaisChaumeil 2:c177a3e9708e 85 filt2[0]=filt2[1];
AnaisChaumeil 2:c177a3e9708e 86 filt3[0]=filt3[1];
AnaisChaumeil 2:c177a3e9708e 87
AnaisChaumeil 0:971166224b2d 88
AnaisChaumeil 0:971166224b2d 89 // initialization of the parameters
AnaisChaumeil 0:971166224b2d 90 double b0=(wclp*T)/(wclp*T+2);
AnaisChaumeil 0:971166224b2d 91 double b1=(wclp*T)/(wclp*T+2);
AnaisChaumeil 0:971166224b2d 92 double a1=(wclp*T-2)/(wclp*T+2);
AnaisChaumeil 2:c177a3e9708e 93
AnaisChaumeil 2:c177a3e9708e 94 filt0[1]=b0*raw_signal_0[1]+b1*raw_signal_0[0]-a1*filt0[0];
AnaisChaumeil 2:c177a3e9708e 95 filt1[1]=b0*raw_signal_1[1]+b1*raw_signal_1[0]-a1*filt1[0];
AnaisChaumeil 2:c177a3e9708e 96 filt2[1]=b0*raw_signal_2[1]+b1*raw_signal_2[0]-a1*filt2[0];
AnaisChaumeil 2:c177a3e9708e 97 filt3[1]=b0*raw_signal_3[1]+b1*raw_signal_3[0]-a1*filt3[0];
AnaisChaumeil 2:c177a3e9708e 98
AnaisChaumeil 0:971166224b2d 99
AnaisChaumeil 0:971166224b2d 100 // HIGH PASS FILTER
AnaisChaumeil 0:971166224b2d 101 double wchp=10*2*pi;
AnaisChaumeil 0:971166224b2d 102
AnaisChaumeil 0:971166224b2d 103 // initialization by the mean of the two first values
AnaisChaumeil 2:c177a3e9708e 104 filt_filt0[0]=filt_filt0[1];
AnaisChaumeil 2:c177a3e9708e 105 filt_filt1[0]=filt_filt1[1];
AnaisChaumeil 2:c177a3e9708e 106 filt_filt2[0]=filt_filt2[1];
AnaisChaumeil 2:c177a3e9708e 107 filt_filt4[0]=filt_filt3[1];
AnaisChaumeil 0:971166224b2d 108
AnaisChaumeil 0:971166224b2d 109 // initialization of the parameters
AnaisChaumeil 0:971166224b2d 110 double d0=2/(wchp*T+2);
AnaisChaumeil 0:971166224b2d 111 double d1=2/(wchp*T+2);
AnaisChaumeil 0:971166224b2d 112 double c1=(wchp*T-2)/(wchp*T+2);
AnaisChaumeil 2:c177a3e9708e 113
AnaisChaumeil 2:c177a3e9708e 114 filt_filt0[1]=d0*filt0[1]+d1*filt0[0]-c1*filt_filt0[0];
AnaisChaumeil 2:c177a3e9708e 115 filt_filt1[1]=d0*filt1[1]+d1*filt1[0]-c1*filt_filt1[0];
AnaisChaumeil 2:c177a3e9708e 116 filt_filt2[1]=d0*filt2[1]+d1*filt2[0]-c1*filt_filt2[0];
AnaisChaumeil 2:c177a3e9708e 117 filt_filt3[1]=d0*filt3[1]+d1*filt3[0]-c1*filt_filt3[0];
AnaisChaumeil 2:c177a3e9708e 118
AnaisChaumeil 0:971166224b2d 119
AnaisChaumeil 0:971166224b2d 120 // DIFFERENCE OF THE SIGNALS AND ABSOLUTE VALUE
AnaisChaumeil 2:c177a3e9708e 121
AnaisChaumeil 2:c177a3e9708e 122 emgA=filt_filt0[1]-filt_filt1[1];
AnaisChaumeil 2:c177a3e9708e 123 emg_absA[0]=emg_absA[1];
AnaisChaumeil 2:c177a3e9708e 124 emg_absA[1]=fabs(emgA);
AnaisChaumeil 0:971166224b2d 125
AnaisChaumeil 2:c177a3e9708e 126 emgB=filt_filt2[1]-filt_filt3[1];
AnaisChaumeil 2:c177a3e9708e 127 emg_absB[0]=emg_absB[1];
AnaisChaumeil 2:c177a3e9708e 128 emg_absB[1]=fabs(emgB);
AnaisChaumeil 0:971166224b2d 129
AnaisChaumeil 0:971166224b2d 130
AnaisChaumeil 2:c177a3e9708e 131 // APPLYING ANOTHER LOW PASS FILTER WITH SUPER LOW CUTOFF FREQUENCY
AnaisChaumeil 0:971166224b2d 132
AnaisChaumeil 2:c177a3e9708e 133 double wcllp=2*pi; // low low pass cutoff frequency
AnaisChaumeil 2:c177a3e9708e 134
AnaisChaumeil 2:c177a3e9708e 135 emg_filtA[0]=(emg_absA[0]+emg_absA[1])/2; // we take the mean of the two first values to initialize the signal
AnaisChaumeil 2:c177a3e9708e 136 emg_filtB[0]=(emg_absB[0]+emg_absB[1])/2;
AnaisChaumeil 0:971166224b2d 137
AnaisChaumeil 2:c177a3e9708e 138 double k0=(wcllp*T)/(wcllp*T+2);
AnaisChaumeil 2:c177a3e9708e 139 double k1=(wcllp*T)/(wcllp*T+2);
AnaisChaumeil 2:c177a3e9708e 140 double l1=(wcllp*T-2)/(wcllp*T+2);
AnaisChaumeil 2:c177a3e9708e 141
AnaisChaumeil 2:c177a3e9708e 142 emg_filtA[0]=emg_filtA[1];
AnaisChaumeil 2:c177a3e9708e 143 emg_filtB[0]=emg_filtB[1];
AnaisChaumeil 0:971166224b2d 144
AnaisChaumeil 2:c177a3e9708e 145 emg_filtA[1]=k0*emg_absA[1]+k1*emg_absA[0]-l1*emg_filtA[0];
AnaisChaumeil 2:c177a3e9708e 146 emg_filtB[1]=k0*emg_absB[1]+k1*emg_absB[0]-l1*emg_filtB[0];
AnaisChaumeil 0:971166224b2d 147
AnaisChaumeil 0:971166224b2d 148
AnaisChaumeil 0:971166224b2d 149 int main()
AnaisChaumeil 0:971166224b2d 150 {
AnaisChaumeil 0:971166224b2d 151 sampling.attach(&sample, 0.002);
AnaisChaumeil 2:c177a3e9708e 152 processing.attach(&processing_signals, 0.002);
AnaisChaumeil 0:971166224b2d 153
AnaisChaumeil 0:971166224b2d 154 while (true)
AnaisChaumeil 0:971166224b2d 155 {
AnaisChaumeil 0:971166224b2d 156
AnaisChaumeil 0:971166224b2d 157 }
AnaisChaumeil 0:971166224b2d 158 return 0;
AnaisChaumeil 0:971166224b2d 159 }