Highpass en Notch filter voor EMG verwerking

Dependencies:   HIDScope mbed-dsp mbed

Fork of EMG_HIDScope by First Last

Committer:
jessekaiser
Date:
Tue Oct 14 13:32:59 2014 +0000
Revision:
22:6b4ea19efad1
Parent:
21:133e9390a42a
Werkt (maar waarom? Nobody knows)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:32bb76391d89 1 #include "mbed.h"
vsluiter 11:ce72ec658a95 2 #include "HIDScope.h"
vsluiter 18:fed07cc1f8f6 3 #include "arm_math.h"
vsluiter 18:fed07cc1f8f6 4
vsluiter 4:8b298dfada81 5 //Define objects
vsluiter 7:3396c3e33928 6 AnalogIn emg0(PTB1); //Analog input
vsluiter 11:ce72ec658a95 7 HIDScope scope(2);
vsluiter 2:e314bb3b2d99 8
vsluiter 18:fed07cc1f8f6 9 arm_biquad_casd_df1_inst_f32 lowpass;
vsluiter 19:dbc1bca498e3 10 //constants for 5Hz lowpass
jessekaiser 22:6b4ea19efad1 11 float lowpass_const[] = {0.5857841106784856, -1.3007020142696517e-16, 0.5857841106784856, -1.3007020142696517e-16, 0.17156822135697122};
vsluiter 20:f7d281e3112b 12 //state values
vsluiter 20:f7d281e3112b 13 float lowpass_states[4];
vsluiter 18:fed07cc1f8f6 14 arm_biquad_casd_df1_inst_f32 highpass;
vsluiter 19:dbc1bca498e3 15 //constants for 0.5Hz highpass
jessekaiser 22:6b4ea19efad1 16 float highpass_const[] = {0.8948577513857248, -1.7897155027714495, 0.8948577513857248, 0.8008009266036016};
vsluiter 20:f7d281e3112b 17 //state values
vsluiter 20:f7d281e3112b 18 float highpass_states[4];
vsluiter 15:d3a849ab3697 19
vsluiter 15:d3a849ab3697 20
vsluiter 4:8b298dfada81 21 /** Looper function
vsluiter 4:8b298dfada81 22 * functions used for Ticker and Timeout should be of type void <name>(void)
vsluiter 4:8b298dfada81 23 * i.e. no input arguments, no output arguments.
vsluiter 4:8b298dfada81 24 * if you want to change a variable that you use in other places (for example in main)
vsluiter 4:8b298dfada81 25 * you will have to make that variable global in order to be able to reach it both from
vsluiter 4:8b298dfada81 26 * the function called at interrupt time, and in the main function.
vsluiter 4:8b298dfada81 27 * To make a variable global, define it under the includes.
vsluiter 4:8b298dfada81 28 * variables that are changed in the interrupt routine (written to) should be made
vsluiter 4:8b298dfada81 29 * 'volatile' to let the compiler know that those values may change outside the current context.
vsluiter 8:8a17f65622b4 30 * i.e.: "volatile uint16_t emg_value;" instead of "uint16_t emg_value"
vsluiter 4:8b298dfada81 31 * in the example below, the variable is not re-used in the main function, and is thus declared
vsluiter 4:8b298dfada81 32 * local in the looper function only.
vsluiter 4:8b298dfada81 33 **/
vsluiter 2:e314bb3b2d99 34 void looper()
vsluiter 2:e314bb3b2d99 35 {
vsluiter 4:8b298dfada81 36 /*variable to store value in*/
vsluiter 8:8a17f65622b4 37 uint16_t emg_value;
vsluiter 15:d3a849ab3697 38 float filtered_emg;
vsluiter 18:fed07cc1f8f6 39 float emg_value_f32;
vsluiter 4:8b298dfada81 40 /*put raw emg value both in red and in emg_value*/
vsluiter 12:768048d7f742 41 emg_value = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
vsluiter 18:fed07cc1f8f6 42 emg_value_f32 = emg0.read();
vsluiter 19:dbc1bca498e3 43
vsluiter 19:dbc1bca498e3 44 //process emg
vsluiter 18:fed07cc1f8f6 45 arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32, &filtered_emg, 1 );
vsluiter 18:fed07cc1f8f6 46 filtered_emg = fabs(filtered_emg);
vsluiter 18:fed07cc1f8f6 47 arm_biquad_cascade_df1_f32(&lowpass, &filtered_emg, &filtered_emg, 1 );
vsluiter 19:dbc1bca498e3 48
vsluiter 19:dbc1bca498e3 49 /*send value to PC. */
vsluiter 19:dbc1bca498e3 50 scope.set(0,emg_value); //uint value
vsluiter 19:dbc1bca498e3 51 scope.set(1,filtered_emg); //processed float
vsluiter 11:ce72ec658a95 52 scope.send();
vsluiter 16:24e992616cf6 53
vsluiter 2:e314bb3b2d99 54 }
vsluiter 0:32bb76391d89 55
vsluiter 0:32bb76391d89 56 int main()
jessekaiser 22:6b4ea19efad1 57 {
jessekaiser 22:6b4ea19efad1 58
vsluiter 21:133e9390a42a 59 Ticker log_timer;
vsluiter 19:dbc1bca498e3 60 //set up filters. Use external array for constants
vsluiter 20:f7d281e3112b 61 arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states);
vsluiter 20:f7d281e3112b 62 arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
vsluiter 19:dbc1bca498e3 63
vsluiter 4:8b298dfada81 64 /**Here you attach the 'void looper(void)' function to the Ticker object
vsluiter 9:d33e7b175ad7 65 * The looper() function will be called every 0.01 seconds.
vsluiter 4:8b298dfada81 66 * Please mind that the parentheses after looper are omitted when using attach.
vsluiter 4:8b298dfada81 67 */
vsluiter 13:18d4cef1fdb4 68 log_timer.attach(looper, 0.005);
ArvidKeemink 1:db54d9412d18 69 while(1) //Loop
vsluiter 0:32bb76391d89 70 {
vsluiter 4:8b298dfada81 71 /*Empty!*/
vsluiter 4:8b298dfada81 72 /*Everything is handled by the interrupt routine now!*/
vsluiter 0:32bb76391d89 73 }
vsluiter 19:dbc1bca498e3 74 }