emg2

Dependencies:   HIDScope biquadFilter mbed QEI

Fork of EMG by Tom Tom

main.cpp

Committer:
keeswieriks
Date:
2018-10-30
Revision:
27:6b4814ef266d
Parent:
26:1eafb6111ae8
Child:
28:433d12c52913

File content as of revision 27:6b4814ef266d:

#include "mbed.h"
#include "HIDScope.h"
#include "BiQuad.h"

HIDScope scope( 6 );
Ticker sample_timer;

// Inputs EMG
AnalogIn emg0_in( A0 );
AnalogIn emg1_in( A1 );
AnalogIn emg2_in( A2 );

// Constants EMG
const double m1 = 0.5000;
const double m2 = -0.8090;
const double n0 = 0.5000;
const double n1 = -0.8090;
const double n2 = 0;
const double a1 = 0.9565;
const double a2 = -1.9131;
const double b0 = 0.9565;
const double b1 = -1.9112;
const double b2 = 0.9150;
const double c1 = 0.0675;
const double c2 = 0.1349;
const double d0 = 0.0675;
const double d1 = -1.1430;
const double d2 = 0.4128;
  
// Variables EMG
double emg0;
double emg1;
double emg2;
double notch0;
double notch1;
double notch2;
double high0;
double high1;
double high2;
double absolute0;
double absolute1;
double absolute2;
double low0;
double low1;
double low2;

// BiQuad values
BiQuadChain notch;
BiQuad N1( m1, m2, n0, n1, n2);
BiQuad N2( m1, m2, n0, n1, n2);
BiQuad N3( m1, m2, n0, n1, n2);
BiQuadChain highpass;
BiQuad H1( a1, a2, b0, b1, b2);
BiQuad H2( a1, a2, b0, b1, b2);
BiQuad H3( a1, a2, b0, b1, b2);
BiQuadChain lowpass;
BiQuad L1( c1, c2, d0, d1, d2);
BiQuad L2( c1, c2, d0, d1, d2);
BiQuad L3( c1, c2, d0, d1, d2);

// EMG
const int sizeMovAg = 100; //Size of array over which the moving average (MovAg) is calculated
double sum, sum1, sum2, sum3; //Variables used in calibration and MovAg to sum the elements in the array
double StoreArray0[sizeMovAg] = {}, StoreArray1[sizeMovAg] = {}, StoreArray2[sizeMovAg] = {};

//Empty arrays to calculate MovAgs
double Average0, Average1, Average2; //Outcome of MovAg
const int sizeCali = 2000; //Size of array over which the Threshold will be calculated
double StoreCali0[sizeCali] = {}, StoreCali1[sizeCali] = {}, StoreCali2[sizeCali] = {};
//Empty arrays to calculate means in calibration

double Mean0, Mean1, Mean2; //Mean of maximum contraction, calculated in the calibration
double Threshold0 = 1, Threshold1 = 1, Threshold2 = 1; //Thresholds for muscles 0 to 2
int g = 0; //Part of the switch void, where the current state can be changed
int emg_calib=0; //After calibration this value will be 1, enabling the

//EMG
Ticker Filter_tick;
Ticker MovAg_tick;

// Filter of the first EMG signal
void filtering()
{
    emg0 = emg0_in.read(); // Reading the EMG signal
    emg1 = emg1_in.read();
    emg2 = emg2_in.read(); 
    notch0 = N1.step(emg0); // Applying a notch filter over the EMG data
    notch1 = N2.step(emg1);
    notch2 = N3.step(emg2); 
    high0 = H1.step(notch0); // Applying a high pass filter
    high1 = H2.step(notch1); 
    high2 = H3.step(notch2);
    absolute0 = fabs(high0); // Rectifying the signal
    absolute1 = fabs(high1);
    absolute2 = fabs(high2); 
    low0 = L1.step(absolute0); // Applying low pass filter
    low1 = L2.step(absolute1);
    low2 = L3.step(absolute2); 
    
    for (int i = sizeMovAg-1; i>=0; i--) {
//For statement to make an array of the last datapoints of the filtered signal
StoreArray0[i] = StoreArray0[i-1]; //Shifts the i'th element one place to the right
StoreArray1[i] = StoreArray1[i-1];
StoreArray2[i] = StoreArray2[i-1];
}
StoreArray0[0] = low0; //Stores the latest datapoint in the first element of the array
StoreArray1[0] = low1;
StoreArray2[0] = low2;
sum1 = 0.0;
sum2 = 0.0;
sum3 = 0.0;
for (int a = 0; a<=sizeMovAg-1; a++) { //For statement to sum the elements in the array
sum1+=StoreArray0[a];
sum2+=StoreArray1[a];
sum3+=StoreArray2[a];
}
Average0 = sum1/sizeMovAg; //Calculates an average over the datapoints in the array
Average1 = sum2/sizeMovAg;
Average2 = sum3/sizeMovAg;
    
    scope.set( 0, emg0); // Sending the signal to the HIDScope 
    scope.set( 1, low0); // Change the numer of inputs on the top when necessary
    scope.set( 2, Average0);
    scope.set( 3, low1);
    scope.set( 4, emg2);
    scope.set( 5, low2);
    scope.send(); 
}

int main() 
{  
    sample_timer.attach( &filtering, 0.002);

    while(1) {}
}



void MovAg() //Void to make a moving average
{

}