EMG input library biorobortics 31-10-2016

Dependencies:   HIDScope mbed

Fork of EMG by Tom Tom

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?

UserRevisionLine numberNew 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 }