Dominique Clevers / Mbed 2 deprecated Project5-filteringBiceps

Dependencies:   HIDScope mbed-dsp mbed

Fork of Project5-filtering2 by Dominique Clevers

Committer:
Daanmk
Date:
Thu Oct 16 09:39:45 2014 +0000
Revision:
10:1efe8b0cddd0
Parent:
4:c8ec56d87a5b
Child:
11:a598cb27907f
Pour Dominique

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Daanmk 0:68c8cf9a1f96 1 /***************************************/
Daanmk 0:68c8cf9a1f96 2 /* */
Daanmk 0:68c8cf9a1f96 3 /* BRONCODE GROEP 5, MODULE 9, 2014 */
Daanmk 0:68c8cf9a1f96 4 /* *****-THE SLAP-****** */
Daanmk 0:68c8cf9a1f96 5 /* */
Daanmk 0:68c8cf9a1f96 6 /* -Dominique Clevers */
Daanmk 0:68c8cf9a1f96 7 /* -Rianne van Dommelen */
Daanmk 0:68c8cf9a1f96 8 /* -Daan de Muinck Keizer */
Daanmk 0:68c8cf9a1f96 9 /* -David den Houting */
Daanmk 0:68c8cf9a1f96 10 /* -Marjolein Thijssen */
Daanmk 0:68c8cf9a1f96 11 /***************************************/
Daanmk 0:68c8cf9a1f96 12 #include "mbed.h"
Daanmk 0:68c8cf9a1f96 13 #include "HIDScope.h"
Daanmk 0:68c8cf9a1f96 14 #include "arm_math.h"
Daanmk 4:c8ec56d87a5b 15
Daanmk 0:68c8cf9a1f96 16 //Define objects
Daanmk 0:68c8cf9a1f96 17 AnalogIn emg0(PTB0); //Biceps
Daanmk 0:68c8cf9a1f96 18 AnalogIn emg1(PTB1); //Triceps
Daanmk 10:1efe8b0cddd0 19 HIDScope scope(5);
Daanmk 4:c8ec56d87a5b 20
Daanmk 10:1efe8b0cddd0 21 int const windowsamples = 300; //aantal samples waaruit het window voor MOVAG bestaat, Met toestemming van Nik HuisintVeld
Daanmk 10:1efe8b0cddd0 22
Daanmk 10:1efe8b0cddd0 23 float buffer1 [windowsamples];
Daanmk 10:1efe8b0cddd0 24 //float buffer2 [windowsamples];
Daanmk 10:1efe8b0cddd0 25
Daanmk 4:c8ec56d87a5b 26 arm_biquad_casd_df1_inst_f32 notch;
Daanmk 4:c8ec56d87a5b 27 //constants for 50Hz notch
Daanmk 4:c8ec56d87a5b 28 float notch_const[] = {0.5857841106784856, -1.3007020142696517e-16, 0.5857841106784856, -1.3007020142696517e-16, 0.17156822135697122};
Daanmk 0:68c8cf9a1f96 29 //state values
Daanmk 4:c8ec56d87a5b 30 float notch_states[4];
Daanmk 0:68c8cf9a1f96 31 arm_biquad_casd_df1_inst_f32 highpass;
Daanmk 3:9d5879b64f3c 32 //constants for 5Hz highpass
Daanmk 3:9d5879b64f3c 33 float highpass_const[] = {0.8948577513857248, -1.7897155027714495, 0.8948577513857248, 0.8008009266036016};
Daanmk 0:68c8cf9a1f96 34 //state values
Daanmk 0:68c8cf9a1f96 35 float highpass_states[4];
Daanmk 10:1efe8b0cddd0 36 arm_biquad_casd_df1_inst_f32 envelop;
Daanmk 10:1efe8b0cddd0 37 //constants for 5Hz lowpass
Daanmk 10:1efe8b0cddd0 38 float envelop_const[] = {0.005542711916075981, 0.011085423832151962, 0.005542711916075981, -1.7786300789392977, 0.8008009266036016};
Daanmk 10:1efe8b0cddd0 39 //state values
Daanmk 10:1efe8b0cddd0 40 float envelop_states[4];
Daanmk 4:c8ec56d87a5b 41
Daanmk 0:68c8cf9a1f96 42 void looper()
Daanmk 0:68c8cf9a1f96 43 {
Daanmk 10:1efe8b0cddd0 44 int i = 0;
Daanmk 0:68c8cf9a1f96 45 /*variable to store value in*/
Daanmk 0:68c8cf9a1f96 46 uint16_t emg_value;
Daanmk 0:68c8cf9a1f96 47 float filtered_emg;
Daanmk 10:1efe8b0cddd0 48 float filtered_emg_notch;
Daanmk 10:1efe8b0cddd0 49 float filtered_emg_abs;
Daanmk 10:1efe8b0cddd0 50 float filtered_emg_env;
Daanmk 0:68c8cf9a1f96 51 float emg_value_f32;
Daanmk 0:68c8cf9a1f96 52 /*put raw emg value both in red and in emg_value*/
Daanmk 0:68c8cf9a1f96 53 emg_value = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
Daanmk 0:68c8cf9a1f96 54 emg_value_f32 = emg0.read();
Daanmk 4:c8ec56d87a5b 55
Daanmk 0:68c8cf9a1f96 56 //process emg
Daanmk 0:68c8cf9a1f96 57 arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32, &filtered_emg, 1 );
Daanmk 10:1efe8b0cddd0 58 arm_biquad_cascade_df1_f32(&notch, &filtered_emg, &filtered_emg_notch, 1 );
Daanmk 10:1efe8b0cddd0 59 filtered_emg_abs = fabs(filtered_emg_notch);
Daanmk 10:1efe8b0cddd0 60 arm_biquad_cascade_df1_f32(&envelop, &filtered_emg_abs, &filtered_emg_env, 1 );
Daanmk 10:1efe8b0cddd0 61
Daanmk 10:1efe8b0cddd0 62 //buffers
Daanmk 10:1efe8b0cddd0 63 buffer1[i] = filtered_emg_abs;
Daanmk 10:1efe8b0cddd0 64 //buffer2[i] =
Daanmk 10:1efe8b0cddd0 65
Daanmk 10:1efe8b0cddd0 66 i++;
Daanmk 10:1efe8b0cddd0 67 //Als buffer vol zit, opnieuw vanaf 0 bijvullen
Daanmk 10:1efe8b0cddd0 68 if (i==windowsamples)
Daanmk 10:1efe8b0cddd0 69 i=0;
Daanmk 0:68c8cf9a1f96 70
Daanmk 10:1efe8b0cddd0 71 //moving average filter
Daanmk 10:1efe8b0cddd0 72 float avg1,avg2;
Daanmk 10:1efe8b0cddd0 73 avg1=avg2=0;
Daanmk 10:1efe8b0cddd0 74
Daanmk 10:1efe8b0cddd0 75 //Inhoud van een buffer (=gefilterd signaal) optellen
Daanmk 10:1efe8b0cddd0 76 for(int x=0; x<windowsamples; x++) {
Daanmk 10:1efe8b0cddd0 77 avg1 = avg1 + abs(buffer1[x]);
Daanmk 10:1efe8b0cddd0 78 //avg2 = avg2 + abs(buffer2[x]);
Daanmk 10:1efe8b0cddd0 79 }
Daanmk 10:1efe8b0cddd0 80 //Gemiddelde berekenen en relativeren tov maximum voluntary contraction
Daanmk 10:1efe8b0cddd0 81 avg1 = avg1/windowsamples;
Daanmk 10:1efe8b0cddd0 82 avg2 = avg2/windowsamples;
Daanmk 10:1efe8b0cddd0 83
Daanmk 0:68c8cf9a1f96 84 scope.set(0,emg_value); //uint value
Daanmk 0:68c8cf9a1f96 85 scope.set(1,filtered_emg); //processed float
Daanmk 10:1efe8b0cddd0 86 scope.set(2,filtered_emg_notch);
Daanmk 10:1efe8b0cddd0 87 scope.set(3,filtered_emg_abs);
Daanmk 10:1efe8b0cddd0 88 scope.set(4,avg1);
Daanmk 0:68c8cf9a1f96 89 scope.send();
Daanmk 0:68c8cf9a1f96 90 }
Daanmk 4:c8ec56d87a5b 91
Daanmk 0:68c8cf9a1f96 92 int main()
Daanmk 0:68c8cf9a1f96 93 {
Daanmk 0:68c8cf9a1f96 94 Ticker log_timer;
Daanmk 0:68c8cf9a1f96 95 //set up filters. Use external array for constants
Daanmk 4:c8ec56d87a5b 96 arm_biquad_cascade_df1_init_f32(&notch,1 , notch_const, notch_states);
Daanmk 0:68c8cf9a1f96 97 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
Daanmk 10:1efe8b0cddd0 98 arm_biquad_cascade_df1_init_f32(&envelop,1 ,envelop_const, envelop_states);
Daanmk 0:68c8cf9a1f96 99
Daanmk 0:68c8cf9a1f96 100 log_timer.attach(looper, 0.005);
Daanmk 0:68c8cf9a1f96 101 while(1) //Loop
Daanmk 0:68c8cf9a1f96 102 {
Daanmk 0:68c8cf9a1f96 103 /*Empty!*/
Daanmk 0:68c8cf9a1f96 104 /*Everything is handled by the interrupt routine now!*/
Daanmk 0:68c8cf9a1f96 105 }
Daanmk 0:68c8cf9a1f96 106 }