EMG signalen uitlezen met filters

Dependencies:   HIDScope biquadFilter mbed

Committer:
laurette
Date:
Fri Oct 28 11:40:57 2016 +0000
Revision:
4:d3c27bbe694f
Parent:
3:dfc08485b1b2
Filters opgesplitst per signaal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
laurette 0:5759df060d75 1 #include "mbed.h"
laurette 0:5759df060d75 2 #include "HIDScope.h"
laurette 1:0d62559f43af 3 #include "BiQuad.h"
laurette 0:5759df060d75 4
laurette 1:0d62559f43af 5 //Define EMG input
laurette 0:5759df060d75 6 AnalogIn emg0( A0 );
laurette 0:5759df060d75 7 AnalogIn emg1( A1 );
laurette 0:5759df060d75 8 AnalogIn emg2( A2 );
laurette 0:5759df060d75 9
laurette 0:5759df060d75 10 Ticker sample_timer;
laurette 1:0d62559f43af 11 HIDScope scope( 3 ); // 3-channel HIDScope object
laurette 1:0d62559f43af 12
laurette 1:0d62559f43af 13 // Filter coordinates of lowpass/highpass filter before rectifier and lowpassfilter for the envelope
laurette 1:0d62559f43af 14 const double b0_low = 0.2929, b1_low = 0.5858, b2_low = 0.2929, a1_low = 0, a2_low = 0.1716;
laurette 3:dfc08485b1b2 15 const double b0_high = 0.9978, b1_high = -1.9956, b2_high = 0.9978, a1_high = -1.9956, a2_high = 0.9956;
laurette 3:dfc08485b1b2 16 const double b0_envelope = 2.2059E-5, b1_envelope = 4.4119E-4, b2_envelope = 2.2059E-5, a1_envelope = -1.9867, a2_envelope = 0.9868;
laurette 1:0d62559f43af 17
laurette 1:0d62559f43af 18 double y1, y2, y3; // Gefilterde output
laurette 0:5759df060d75 19
laurette 1:0d62559f43af 20 // Biquad filters (lowpass and highpass become a chain in the int main)
laurette 4:d3c27bbe694f 21 BiQuad lowpass1(b0_low, b1_low , b2_low, a1_low, a2_low);
laurette 4:d3c27bbe694f 22 BiQuad lowpass2(b0_low, b1_low , b2_low, a1_low, a2_low);
laurette 4:d3c27bbe694f 23 BiQuad lowpass3(b0_low, b1_low , b2_low, a1_low, a2_low);
laurette 4:d3c27bbe694f 24 BiQuad highpass1(b0_high, b1_high , b2_high, a1_high, a2_high);
laurette 4:d3c27bbe694f 25 BiQuad highpass2(b0_high, b1_high , b2_high, a1_high, a2_high);
laurette 4:d3c27bbe694f 26 BiQuad highpass3(b0_high, b1_high , b2_high, a1_high, a2_high);
laurette 4:d3c27bbe694f 27 BiQuad envelope1(b0_envelope, b1_envelope , b2_envelope, a1_envelope, a2_envelope);
laurette 4:d3c27bbe694f 28 BiQuad envelope2(b0_envelope, b1_envelope , b2_envelope, a1_envelope, a2_envelope);
laurette 4:d3c27bbe694f 29 BiQuad envelope3(b0_envelope, b1_envelope , b2_envelope, a1_envelope, a2_envelope);
laurette 4:d3c27bbe694f 30 BiQuadChain bandpass1;
laurette 4:d3c27bbe694f 31 BiQuadChain bandpass2;
laurette 4:d3c27bbe694f 32 BiQuadChain bandpass3;
laurette 1:0d62559f43af 33
laurette 1:0d62559f43af 34 // Sample function, this function samples the emg and sends it to HIDScope
laurette 1:0d62559f43af 35 void filtering()
laurette 0:5759df060d75 36 {
laurette 4:d3c27bbe694f 37 y1 = bandpass1.step(emg0);
laurette 4:d3c27bbe694f 38 y2 = bandpass2.step(emg1);
laurette 4:d3c27bbe694f 39 y3 = bandpass3.step(emg2);
laurette 1:0d62559f43af 40 y1 = fabs(y1);
laurette 1:0d62559f43af 41 y2 = fabs(y2);
laurette 1:0d62559f43af 42 y3 = fabs(y3);
laurette 4:d3c27bbe694f 43 y1 = envelope1.step(y1);
laurette 4:d3c27bbe694f 44 y2 = envelope2.step(y2);
laurette 4:d3c27bbe694f 45 y3 = envelope3.step(y3);
laurette 0:5759df060d75 46
laurette 1:0d62559f43af 47 // Set the sampled and filtered emg values in channel 0/1/2 in the 'HIDScope' instance named 'scope'
laurette 1:0d62559f43af 48 scope.set(0, y1 );
laurette 1:0d62559f43af 49 scope.set(1, y2 );
laurette 1:0d62559f43af 50 scope.set(2, y3 );
laurette 0:5759df060d75 51
laurette 1:0d62559f43af 52 scope.send(); // Sends all channels to the PC at once
laurette 0:5759df060d75 53 }
laurette 0:5759df060d75 54
laurette 0:5759df060d75 55 int main()
laurette 0:5759df060d75 56 {
laurette 4:d3c27bbe694f 57 bandpass1.add(&lowpass1).add(&highpass1);
laurette 4:d3c27bbe694f 58 bandpass2.add(&lowpass2).add(&highpass2);
laurette 4:d3c27bbe694f 59 bandpass3.add(&lowpass3).add(&highpass3);
laurette 1:0d62559f43af 60 sample_timer.attach(&filtering, 0.001); // Attach the 'sample' function to the timer 'sample_timer'. This ensures that 'sample' is executed every 0.001 seconds = 1000 Hz
laurette 1:0d62559f43af 61
laurette 1:0d62559f43af 62 while(1) {} // Empty loop, sample() is executed periodically
laurette 0:5759df060d75 63 }