EMG filtering script

Dependencies:   MODSERIAL mbed

main.cpp

Committer:
s1204246
Date:
2014-07-09
Revision:
0:dca649a31d1c

File content as of revision 0:dca649a31d1c:

#include "mbed.h"
#include "MODSERIAL.h"

//Define objects
AnalogIn    emg0(PTB0); //Analog input
DigitalOut      blue(LED_BLUE); //Digi output
Ticker timer;
MODSERIAL pc(USBTX,USBRX);

 double numh1,numh2,denh2; //High pass filter coeffs
 double numl1,numl2,numl3,numl4,denl2,denl3,denl4; //Low pass filter coeffs
 double numn1,numn2,numn3,denn2,denn3; //Notch filter coeffs
 double raw,xbr,x1br,hbr,h1br,h2br,nbr,n1br,n2br,yabsbr,yabs1br,yabs2br,yabs3br,lbr,l1br,l2br,l3br,signal,emggain; //Signal intermediates

void looper()
{
    /*put raw emg value both in red and in emg_value*/
    blue = raw = emg0.read();
        xbr=(raw-0.5)*2.0;
        hbr=xbr*numh1+x1br*numh2-h1br*denh2;
        nbr=hbr*numn1+h1br*numn2+h2br*numn3-n1br*denn2-n2br*denn3;
        yabsbr=abs(nbr);
        lbr=yabsbr*numl1+yabs1br*numl2+yabs2br*numl3+yabs3br*numl4-l1br*denl2-l2br*denl3-l3br*denl4;
        x1br=xbr;
        h2br=h1br;
        h1br=hbr;
        n2br=n1br;
        n1br=nbr;
        yabs3br=yabs2br;
        yabs2br=yabs1br;
        yabs1br=yabsbr;
        l3br=l2br;
        l2br=l1br;
        l1br=lbr;
        signal=lbr*emggain;
    /*send value to PC. use 6 digits after decimal sign*/
    pc.printf("%f \n",signal);
    /**When not using the LED, the above could also have been done this way:
    * pc.printf("%.6\n", emg0.read());
    */
}

int main()

{  
x1br=0;
h2br=0;
h1br=0;
n2br=0;
n1br=0;
yabs3br=0;
yabs2br=0;
yabs1br=0;
l3br=0;
l2br=0;
l1br=0;
    
    //Filtercoëfficienten.
    //High pass, 30Hz, 1e orde, 4 ms.
    numh1=0.839799649112263;
    numh2=-0.839799649112263;
    //denh1=1;
    denh2=-0.679599298224526;
    
    //Notch filter, 50 Hz, -35 dB
    numn1=0.991103635646810;
    numn2=-1.603639368850131;
    numn3=0.991103635646810;
    //denn1=1;
    denn2=-1.603639368850131;
    denn3=0.982207271293620;

    //Low pass, 3 Hz, 3e orde, 4 ms.
    numl1=0.000001935454105;
    numl2=0.000005806362315;
    numl3=0.000005806362315;
    numl4=0.000001935454105;
    //denl1=1;
    denl2=-2.949735839706348;
    denl3=2.900726988355438;
    denl4=-0.950975665016249;    
    //emg gain
    emggain=5;

    /*setup baudrate. Choose the same in your program on PC side*/
    pc.baud(115200);
    /*set the period for the PWM to the red LED*/
    //red.period_ms(2);
    /**Here you attach the 'void looper(void)' function to the Ticker object
    * The looper() function will be called every 0.001 seconds.
    * Please mind that the parentheses after looper are omitted when using attach.
    */
    timer.attach(looper, 0.001);
    while(1) //Loop
    {
      /*Empty!*/
      /*Everything is handled by the interrupt routine now!*/
    }
}