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:
DominiqueC
Date:
Mon Oct 20 07:47:41 2014 +0000
Revision:
30:2162f7a82fc7
Parent:
29:40a157c53841
median

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
DominiqueC 20:3ae43944846a 21 arm_biquad_casd_df1_inst_f32 notch;
Daanmk 4:c8ec56d87a5b 22 //constants for 50Hz notch
DominiqueC 20:3ae43944846a 23 float notch_const[] = {0.9695312529087462, -0.0, 0.9695312529087462, 0.0, -0.9390625058174924};
Daanmk 0:68c8cf9a1f96 24 //state values
DominiqueC 20:3ae43944846a 25 float notch_states[4];
DominiqueC 18:2523eba53f16 26 arm_biquad_casd_df1_inst_f32 highpass;
DominiqueC 26:d73e33ca524d 27 //constants for 20Hz highpass
DominiqueC 25:a84afc4598fe 28 float highpass_const[] = {0.638945525159022, -1.277891050318045, 0.638945525159022, 1.142980502539901, -0.412801598096189};
Daanmk 0:68c8cf9a1f96 29 //state values
DominiqueC 18:2523eba53f16 30 float highpass_states[4];
DominiqueC 12:8a30e43337bb 31 //constants for 80Hz lowpass
DominiqueC 20:3ae43944846a 32 arm_biquad_casd_df1_inst_f32 lowpass;
DominiqueC 28:c40dc343033f 33 float lowpass_const[] = {0.638945525159022, 1.277891050318045, 0.638945525159022, -1.142980502539901, -0.412801598096189};
DominiqueC 12:8a30e43337bb 34 //state values
DominiqueC 20:3ae43944846a 35 float lowpass_states[4];
DominiqueC 11:a598cb27907f 36
Daanmk 4:c8ec56d87a5b 37
Daanmk 0:68c8cf9a1f96 38 void looper()
Daanmk 0:68c8cf9a1f96 39 {
Daanmk 0:68c8cf9a1f96 40 /*variable to store value in*/
Daanmk 0:68c8cf9a1f96 41 uint16_t emg_value;
DominiqueC 28:c40dc343033f 42 float emg_value_f32;
Daanmk 10:1efe8b0cddd0 43 float filtered_emg_notch;
DominiqueC 22:fe4d9195f6dd 44 float filtered_emg_notch_highpass;
DominiqueC 27:2ccef1104c16 45 float filtered_emg_notch_highpass_lowpass;
DominiqueC 28:c40dc343033f 46 float filtered_emg_eindsignaal_abs;
Daanmk 0:68c8cf9a1f96 47 /*put raw emg value both in red and in emg_value*/
Daanmk 0:68c8cf9a1f96 48 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 49 emg_value_f32 = emg0.read();
Daanmk 4:c8ec56d87a5b 50
Daanmk 0:68c8cf9a1f96 51 //process emg
DominiqueC 21:c9da9adc6706 52 arm_biquad_cascade_df1_f32(&notch, &emg_value_f32, &filtered_emg_notch, 1 );
DominiqueC 22:fe4d9195f6dd 53 arm_biquad_cascade_df1_f32(&highpass, &filtered_emg_notch, &filtered_emg_notch_highpass, 1 );
DominiqueC 27:2ccef1104c16 54 arm_biquad_cascade_df1_f32(&lowpass, &filtered_emg_notch_highpass, &filtered_emg_notch_highpass_lowpass, 1 );
DominiqueC 29:40a157c53841 55 filtered_emg_eindsignaal_abs = 10*fabs(filtered_emg_notch_highpass_lowpass); //gelijkrichter
DominiqueC 29:40a157c53841 56
DominiqueC 30:2162f7a82fc7 57 //(Movag) Median berekenen
DominiqueC 29:40a157c53841 58
DominiqueC 30:2162f7a82fc7 59 int compare (const void * a, const void * b)
DominiqueC 29:40a157c53841 60 {
DominiqueC 30:2162f7a82fc7 61 return ( *(int*)a - *(int*)b );
DominiqueC 29:40a157c53841 62 }
DominiqueC 30:2162f7a82fc7 63
DominiqueC 30:2162f7a82fc7 64 int main() {
DominiqueC 30:2162f7a82fc7 65
DominiqueC 30:2162f7a82fc7 66 float samples[5]={};
DominiqueC 30:2162f7a82fc7 67 float med[5]={};
DominiqueC 30:2162f7a82fc7 68 int count = 0;
DominiqueC 30:2162f7a82fc7 69 float sensval;
DominiqueC 30:2162f7a82fc7 70 while(1)
DominiqueC 30:2162f7a82fc7 71 {
DominiqueC 30:2162f7a82fc7 72 count += 1;
DominiqueC 30:2162f7a82fc7 73 sensval = input;
DominiqueC 30:2162f7a82fc7 74 med[4] = med[3];
DominiqueC 30:2162f7a82fc7 75 med[3] = med[2];
DominiqueC 30:2162f7a82fc7 76 med[2] = med[1];
DominiqueC 30:2162f7a82fc7 77 med[1] = med[0];
DominiqueC 30:2162f7a82fc7 78 med[0] = sensval;
DominiqueC 30:2162f7a82fc7 79
DominiqueC 30:2162f7a82fc7 80 samples[4] = med[4];
DominiqueC 30:2162f7a82fc7 81 samples[3] = med[3];
DominiqueC 30:2162f7a82fc7 82 samples[2] = med[2];
DominiqueC 30:2162f7a82fc7 83 samples[1] = med[1];
DominiqueC 30:2162f7a82fc7 84 samples[0] = med[0];
DominiqueC 30:2162f7a82fc7 85
DominiqueC 30:2162f7a82fc7 86 qsort (samples, 5, sizeof(int), compare);
DominiqueC 30:2162f7a82fc7 87
DominiqueC 30:2162f7a82fc7 88 // show the averages
DominiqueC 30:2162f7a82fc7 89 pc.printf("\n%i %f %f",count,sensval,samples[2]);
DominiqueC 30:2162f7a82fc7 90 }
DominiqueC 30:2162f7a82fc7 91 }
DominiqueC 30:2162f7a82fc7 92 //eind
DominiqueC 21:c9da9adc6706 93
DominiqueC 28:c40dc343033f 94 scope.set(0,emg_value_f32);
DominiqueC 22:fe4d9195f6dd 95 scope.set(1,filtered_emg_notch);
DominiqueC 22:fe4d9195f6dd 96 scope.set(2,filtered_emg_notch_highpass);
DominiqueC 27:2ccef1104c16 97 scope.set(3,filtered_emg_notch_highpass_lowpass);
DominiqueC 28:c40dc343033f 98 scope.set(4,filtered_emg_eindsignaal_abs);
Daanmk 0:68c8cf9a1f96 99 scope.send();
Daanmk 0:68c8cf9a1f96 100 }
Daanmk 4:c8ec56d87a5b 101
Daanmk 0:68c8cf9a1f96 102 int main()
Daanmk 0:68c8cf9a1f96 103 {
Daanmk 0:68c8cf9a1f96 104 Ticker log_timer;
Daanmk 0:68c8cf9a1f96 105 //set up filters. Use external array for constants
DominiqueC 20:3ae43944846a 106 arm_biquad_cascade_df1_init_f32(&notch,1 , notch_const, notch_states);
DominiqueC 18:2523eba53f16 107 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
DominiqueC 20:3ae43944846a 108 arm_biquad_cascade_df1_init_f32(&lowpass,1 ,lowpass_const,lowpass_states);
Daanmk 0:68c8cf9a1f96 109
Daanmk 0:68c8cf9a1f96 110 log_timer.attach(looper, 0.005);
Daanmk 0:68c8cf9a1f96 111 while(1) //Loop
Daanmk 0:68c8cf9a1f96 112 {
Daanmk 0:68c8cf9a1f96 113 /*Empty!*/
Daanmk 0:68c8cf9a1f96 114 /*Everything is handled by the interrupt routine now!*/
Daanmk 0:68c8cf9a1f96 115 }
Daanmk 0:68c8cf9a1f96 116 }