EMG signalen uitlezen met filters
Dependencies: HIDScope biquadFilter mbed
main.cpp@4:d3c27bbe694f, 2016-10-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |