Highpass en Notch filter voor EMG verwerking

Dependencies:   HIDScope mbed-dsp mbed

Fork of EMG_HIDScope by First Last

Committer:
vsluiter
Date:
Mon Sep 29 13:08:57 2014 +0000
Revision:
20:f7d281e3112b
Parent:
19:dbc1bca498e3
Child:
21:133e9390a42a
Corrected array assignment for states

Who changed what in which revision?

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