Kim Bruil
/
EMG_Input
EMG input library biorobortics 31-10-2016
Fork of EMG by
EMG_input.cpp@29:98406a20a42b, 2016-10-31 (annotated)
- Committer:
- kbruil
- Date:
- Mon Oct 31 12:30:20 2016 +0000
- Revision:
- 29:98406a20a42b
- Parent:
- 28:ceed9f02b815
Code project biorobotics 31-10-2016;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kbruil | 28:ceed9f02b815 | 1 | #include "EMG_input.h" |
kbruil | 27:869ec80f2bf7 | 2 | |
kbruil | 28:ceed9f02b815 | 3 | /* |
kbruil | 28:ceed9f02b815 | 4 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 5 | ** EMG_input |
kbruil | 28:ceed9f02b815 | 6 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 7 | ** Function: |
kbruil | 28:ceed9f02b815 | 8 | ** Constructor |
kbruil | 28:ceed9f02b815 | 9 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 10 | */ |
kbruil | 27:869ec80f2bf7 | 11 | EMG_input::EMG_input(PinName pin) : emg0(pin), |
kbruil | 27:869ec80f2bf7 | 12 | bq1(9.755715E-01, -1.951143E+00, 9.755715E-01, 1.000000E+00, -1.949216E+00, 9.530699E-01), // High pass 10 Hz (4th order) |
kbruil | 27:869ec80f2bf7 | 13 | bq2(9.442373E-01, -1.888475E+00, 9.442373E-01, 1.000000E+00, -1.886610E+00, 8.903397E-01), |
kbruil | 27:869ec80f2bf7 | 14 | bq3(9.955670E-01, -1.893718E+00, 9.955670E-01, 1.000000E+00, -1.890851E+00, 9.910331E-01), // Notch (stop band) 49 - 51 Hz (4th order) |
kbruil | 27:869ec80f2bf7 | 15 | bq4(9.955670E-01, -1.893718E+00, 9.955670E-01, 1.000000E+00, -1.896548E+00, 9.912741E-01), |
kbruil | 27:869ec80f2bf7 | 16 | bq5(4.798613E-01, 9.597225E-01, 4.798613E-01, 1.000000E+00, 4.531195E-01, 4.663256E-01), // Low pass 300 Hz (4th order) |
kbruil | 27:869ec80f2bf7 | 17 | bq6(3.483908E-01, 6.967817E-01, 3.483908E-01, 1.000000E+00, 3.289757E-01, 6.458765E-02), |
kbruil | 27:869ec80f2bf7 | 18 | bq7(8.818771E-05, 1.763754E-04, 8.818771E-05, 1.000000E+00, -1.985325E+00, 9.856773E-01), // Low pass 3Hz on rectified signal (4th order) |
kbruil | 27:869ec80f2bf7 | 19 | bq8(8.730353E-05, 1.746071E-04, 8.730353E-05, 1.000000E+00, -1.965420E+00, 9.657687E-01), |
kbruil | 27:869ec80f2bf7 | 20 | maxsig(0) { |
kbruil | 27:869ec80f2bf7 | 21 | bqc1.add(&bq1).add(&bq2).add(&bq3).add(&bq4).add(&bq5).add(&bq6); // Add filters to filter chain |
kbruil | 28:ceed9f02b815 | 22 | bqc2.add(&bq7).add(&bq8); // Add filters to filter chain |
kbruil | 27:869ec80f2bf7 | 23 | } |
kbruil | 27:869ec80f2bf7 | 24 | |
kbruil | 28:ceed9f02b815 | 25 | /* |
kbruil | 28:ceed9f02b815 | 26 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 27 | ** tick |
kbruil | 28:ceed9f02b815 | 28 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 29 | ** Function: |
kbruil | 28:ceed9f02b815 | 30 | ** Reads and filters the raw EMG signal. |
kbruil | 28:ceed9f02b815 | 31 | ** Has to be called 1000 times per second from a (dereferenced) ticker function. |
kbruil | 28:ceed9f02b815 | 32 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 33 | */ |
kbruil | 27:869ec80f2bf7 | 34 | void EMG_input::tick(void){ |
kbruil | 28:ceed9f02b815 | 35 | e0 = emg0.read(); // Read emg signal |
kbruil | 28:ceed9f02b815 | 36 | e0f = fabs(bqc1.step(e0)); // Filter signal, rectify |
kbruil | 28:ceed9f02b815 | 37 | e0flow = bqc2.step(e0f); // Low pass filter rectified emg signal |
kbruil | 27:869ec80f2bf7 | 38 | if (e0flow>maxsig){ maxsig = e0flow;} // Remember maximum peak (used for calibrating signal) |
kbruil | 28:ceed9f02b815 | 39 | discrete = floor((e0flow/maxsig)*10.0)/10.0; // Discretise signal non linearly (low muscle activity means higher gain on the input signal, sqrt used as envelope) |
kbruil | 27:869ec80f2bf7 | 40 | } |
kbruil | 27:869ec80f2bf7 | 41 | |
kbruil | 28:ceed9f02b815 | 42 | /* |
kbruil | 28:ceed9f02b815 | 43 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 44 | ** read |
kbruil | 28:ceed9f02b815 | 45 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 46 | ** Function: |
kbruil | 28:ceed9f02b815 | 47 | ** Returns true if muscle is active, false if muscle is inactive. |
kbruil | 28:ceed9f02b815 | 48 | ** Threshold value is set in .h file. |
kbruil | 28:ceed9f02b815 | 49 | ** ============================================================================= |
kbruil | 28:ceed9f02b815 | 50 | */ |
kbruil | 27:869ec80f2bf7 | 51 | bool EMG_input::read(void){ |
kbruil | 29:98406a20a42b | 52 | //return (discrete>=EMG_THRESHOLD); |
kbruil | 29:98406a20a42b | 53 | return false; |
kbruil | 27:869ec80f2bf7 | 54 | } |
kbruil | 27:869ec80f2bf7 | 55 | |
kbruil | 27:869ec80f2bf7 | 56 | EMG_input::~EMG_input(){ |
kbruil | 27:869ec80f2bf7 | 57 | } |