werkend filter: 50 hz notch 20 hz hoogdoorlaat 80 hz laagdoorlaat geabsoluteerd vermenigvuldigd met 10
Dependencies: HIDScope mbed-dsp mbed
Fork of Project5-filtering2 by
Revision 10:1efe8b0cddd0, committed 2014-10-16
- Comitter:
- Daanmk
- Date:
- Thu Oct 16 09:39:45 2014 +0000
- Parent:
- 4:c8ec56d87a5b
- Child:
- 11:a598cb27907f
- Commit message:
- Pour Dominique
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Oct 09 13:29:37 2014 +0000 +++ b/main.cpp Thu Oct 16 09:39:45 2014 +0000 @@ -16,8 +16,13 @@ //Define objects AnalogIn emg0(PTB0); //Biceps AnalogIn emg1(PTB1); //Triceps -HIDScope scope(2); +HIDScope scope(5); +int const windowsamples = 300; //aantal samples waaruit het window voor MOVAG bestaat, Met toestemming van Nik HuisintVeld + +float buffer1 [windowsamples]; +//float buffer2 [windowsamples]; + arm_biquad_casd_df1_inst_f32 notch; //constants for 50Hz notch float notch_const[] = {0.5857841106784856, -1.3007020142696517e-16, 0.5857841106784856, -1.3007020142696517e-16, 0.17156822135697122}; @@ -28,12 +33,21 @@ float highpass_const[] = {0.8948577513857248, -1.7897155027714495, 0.8948577513857248, 0.8008009266036016}; //state values float highpass_states[4]; +arm_biquad_casd_df1_inst_f32 envelop; +//constants for 5Hz lowpass +float envelop_const[] = {0.005542711916075981, 0.011085423832151962, 0.005542711916075981, -1.7786300789392977, 0.8008009266036016}; +//state values +float envelop_states[4]; void looper() { + int i = 0; /*variable to store value in*/ uint16_t emg_value; float filtered_emg; + float filtered_emg_notch; + float filtered_emg_abs; + float filtered_emg_env; float emg_value_f32; /*put raw emg value both in red and in emg_value*/ emg_value = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V) @@ -41,14 +55,38 @@ //process emg arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32, &filtered_emg, 1 ); - filtered_emg = fabs(filtered_emg); - arm_biquad_cascade_df1_f32(¬ch, &filtered_emg, &filtered_emg, 1 ); + arm_biquad_cascade_df1_f32(¬ch, &filtered_emg, &filtered_emg_notch, 1 ); + filtered_emg_abs = fabs(filtered_emg_notch); + arm_biquad_cascade_df1_f32(&envelop, &filtered_emg_abs, &filtered_emg_env, 1 ); + + //buffers + buffer1[i] = filtered_emg_abs; + //buffer2[i] = + + i++; + //Als buffer vol zit, opnieuw vanaf 0 bijvullen + if (i==windowsamples) + i=0; - /*send value to PC. */ + //moving average filter + float avg1,avg2; + avg1=avg2=0; + + //Inhoud van een buffer (=gefilterd signaal) optellen + for(int x=0; x<windowsamples; x++) { + avg1 = avg1 + abs(buffer1[x]); + //avg2 = avg2 + abs(buffer2[x]); + } + //Gemiddelde berekenen en relativeren tov maximum voluntary contraction + avg1 = avg1/windowsamples; + avg2 = avg2/windowsamples; + scope.set(0,emg_value); //uint value scope.set(1,filtered_emg); //processed float + scope.set(2,filtered_emg_notch); + scope.set(3,filtered_emg_abs); + scope.set(4,avg1); scope.send(); - } int main() @@ -57,6 +95,7 @@ //set up filters. Use external array for constants arm_biquad_cascade_df1_init_f32(¬ch,1 , notch_const, notch_states); arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states); + arm_biquad_cascade_df1_init_f32(&envelop,1 ,envelop_const, envelop_states); log_timer.attach(looper, 0.005); while(1) //Loop