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 Dominique Clevers

Committer:
Daanmk
Date:
Fri Oct 10 12:25:05 2014 +0000
Revision:
8:27b5468c77bc
Parent:
7:46806eb44597
Child:
9:26f75461bace
Highpass-notch-lowpass. Lowpass nog niet werkend.;  scope 3 van de 5 werkend.

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 8:27b5468c77bc 19 PwmOut blue(LED_BLUE);
Daanmk 7:46806eb44597 20 HIDScope scope(5);
Daanmk 8:27b5468c77bc 21
Daanmk 8:27b5468c77bc 22 arm_biquad_casd_df1_inst_f32 lowpass;
Daanmk 8:27b5468c77bc 23 //constants for 80Hz lowpass
Daanmk 8:27b5468c77bc 24 float lowpass_const[] = {0.6389437261127493, 1.2778874522254986, 0.6389437261127493, 1.1429772843080919, 0.4127976201429053};
Daanmk 8:27b5468c77bc 25 //state values
Daanmk 8:27b5468c77bc 26 float lowpass_states[4];
Daanmk 4:c8ec56d87a5b 27 arm_biquad_casd_df1_inst_f32 notch;
Daanmk 4:c8ec56d87a5b 28 //constants for 50Hz notch
Daanmk 4:c8ec56d87a5b 29 float notch_const[] = {0.5857841106784856, -1.3007020142696517e-16, 0.5857841106784856, -1.3007020142696517e-16, 0.17156822135697122};
Daanmk 0:68c8cf9a1f96 30 //state values
Daanmk 4:c8ec56d87a5b 31 float notch_states[4];
Daanmk 0:68c8cf9a1f96 32 arm_biquad_casd_df1_inst_f32 highpass;
Daanmk 3:9d5879b64f3c 33 //constants for 5Hz highpass
Daanmk 3:9d5879b64f3c 34 float highpass_const[] = {0.8948577513857248, -1.7897155027714495, 0.8948577513857248, 0.8008009266036016};
Daanmk 0:68c8cf9a1f96 35 //state values
Daanmk 0:68c8cf9a1f96 36 float highpass_states[4];
Daanmk 7:46806eb44597 37 arm_biquad_casd_df1_inst_f32 envelop;
Daanmk 7:46806eb44597 38 //constants for 5Hz lowpass
Daanmk 7:46806eb44597 39 float envelop_const[] = {0.005542711916075981, 0.011085423832151962, 0.005542711916075981, -1.7786300789392977, 0.8008009266036016};
Daanmk 7:46806eb44597 40 //state values
Daanmk 7:46806eb44597 41 float envelop_states[4];
Daanmk 4:c8ec56d87a5b 42
Daanmk 0:68c8cf9a1f96 43 void looper()
Daanmk 0:68c8cf9a1f96 44 {
Daanmk 0:68c8cf9a1f96 45 /*variable to store value in*/
Daanmk 6:168e7e03e166 46 uint16_t emg_value;
Daanmk 6:168e7e03e166 47 float filtered_emg;
Daanmk 7:46806eb44597 48 float filtered_emg_notch;
Daanmk 7:46806eb44597 49 float filtered_emg_low;
Daanmk 7:46806eb44597 50 float filtered_emg_abs;
Daanmk 8:27b5468c77bc 51 float filtered_emg_env;
Daanmk 6:168e7e03e166 52 float emg_value_f32;
Daanmk 0:68c8cf9a1f96 53 /*put raw emg value both in red and in emg_value*/
Daanmk 6:168e7e03e166 54 emg_value = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
Daanmk 6:168e7e03e166 55 emg_value_f32 = emg0.read();
Daanmk 4:c8ec56d87a5b 56
Daanmk 0:68c8cf9a1f96 57 //process emg
Daanmk 6:168e7e03e166 58 arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32, &filtered_emg, 1 );
Daanmk 7:46806eb44597 59 arm_biquad_cascade_df1_f32(&notch, &filtered_emg, &filtered_emg_notch, 1 );
Daanmk 8:27b5468c77bc 60 arm_biquad_cascade_df1_f32(&lowpass, &filtered_emg_notch, &filtered_emg_low, 1 );
Daanmk 8:27b5468c77bc 61 filtered_emg_abs = fabs(filtered_emg_low);
Daanmk 8:27b5468c77bc 62 arm_biquad_cascade_df1_f32(&envelop, &filtered_emg_abs, &filtered_emg_env, 1 );
Daanmk 7:46806eb44597 63
Daanmk 8:27b5468c77bc 64 blue = emg0.read();
Daanmk 0:68c8cf9a1f96 65 /*send value to PC. */
Daanmk 6:168e7e03e166 66 scope.set(0,emg_value); //uint value
Daanmk 6:168e7e03e166 67 scope.set(1,filtered_emg); //processed float
Daanmk 7:46806eb44597 68 scope.set(2,filtered_emg_notch);
Daanmk 8:27b5468c77bc 69 scope.set(3,filtered_emg_low);
Daanmk 8:27b5468c77bc 70 scope.set(4,filtered_emg_abs);
Daanmk 8:27b5468c77bc 71 scope.set(5,filtered_emg_env);
Daanmk 0:68c8cf9a1f96 72 scope.send();
Daanmk 4:c8ec56d87a5b 73
Daanmk 0:68c8cf9a1f96 74 }
Daanmk 4:c8ec56d87a5b 75
Daanmk 0:68c8cf9a1f96 76 int main()
Daanmk 0:68c8cf9a1f96 77 {
Daanmk 0:68c8cf9a1f96 78 Ticker log_timer;
Daanmk 0:68c8cf9a1f96 79 //set up filters. Use external array for constants
Daanmk 8:27b5468c77bc 80 arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states);
Daanmk 4:c8ec56d87a5b 81 arm_biquad_cascade_df1_init_f32(&notch,1 , notch_const, notch_states);
Daanmk 0:68c8cf9a1f96 82 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
Daanmk 7:46806eb44597 83 arm_biquad_cascade_df1_init_f32(&envelop,1 ,envelop_const, envelop_states);
Daanmk 0:68c8cf9a1f96 84
Daanmk 0:68c8cf9a1f96 85 log_timer.attach(looper, 0.005);
Daanmk 0:68c8cf9a1f96 86 while(1) //Loop
Daanmk 0:68c8cf9a1f96 87 {
Daanmk 0:68c8cf9a1f96 88 /*Empty!*/
Daanmk 0:68c8cf9a1f96 89 /*Everything is handled by the interrupt routine now!*/
Daanmk 0:68c8cf9a1f96 90 }
Daanmk 0:68c8cf9a1f96 91 }