Emg filter function script for a uni project. Made by Teun van der Molen

Dependencies:   HIDScope MODSERIAL mbed

Fork of frdm_EMG by Teun van der Molen

main.cpp

Committer:
teunman
Date:
2015-09-23
Revision:
8:54f0a76d35f4
Parent:
7:43f2f7039841
Child:
9:2b9240084724

File content as of revision 8:54f0a76d35f4:

#include "mbed.h"
#include "HIDScope.h"
#include "math.h" 
// Define the HIDScope and Ticker object
HIDScope    scope(3);
Ticker      scopeTimer;
Ticker      biquadTicker;
DigitalOut  light(LED2);
DigitalIn    knop(SW3);

double c=5; //calibration value
double n = 0; // counter for calibration
bool calib = false; //changes into false when calibration is done (reset program for new calibration); 
double v1=0, v2=0, u=0, y=0,     fy=0, fv1=0, fv2=0, fu=0;

//const double b0 = 0.9999999999999999,b1 = 1.9999999999999998,b2 = 0.9999999999999999, a1 = 1.9999999999999998 ,a2 = 0.9999999999999998; //low-pass Fc = 50hz fs = 100hz
//const double fb0 = 0.02008333102602092 ,fb1 = 0.04016666205204184 ,fb2 = 0.02008333102602092, fa1 = -1.5610153912536877 ,fa2 = 0.6413487153577715; //low-pass Fc = 5hz fs = 100hz
//const double b0 = 0.8005910266528649,b1 = -1.6011820533057297,b2 = 0.8005910266528649,a1 = -1.5610153912536877,a2 = 0.6413487153577715; //high-pass Fc = 5hz fs = 100hz
//const double b0 = 0.007820199259120319,b1 = 0.015640398518240638,b2 = 0.007820199259120319,a1 = -1.7347238224240125,a2 = 0.7660046194604936; //low-pass Fc = 3hz fs = 100hz
//const double b0 = 0.0009446914586925257,b1 = 0.0018893829173850514,b2 = 0.0009446914586925257,a1 = -1.911196288237583,a2 = 0.914975054072353; //low-pass Fc = 1hz fs = 100hz
//const double b0 = 0.956542835577484, b1 = -1.913085671154968, b2 = 0.956542835577484, a1 = -1.911196288237583, a2 = 0.914975054072353; //high-pass Fc  =  1hz fs = 100hz

const double b0 = 0.00008765553769759188,b1 = 0.00017531107539518376,b2 = 0.00008765553769759188,a1 = -1.9733440008737442,a2 = 0.9736946230245347;//low-pass Fc = 3Hz fs = 1000hz
//const double b0 = 0.00034604125149151127,b1 = 0.0006920825029830225, b2 = 0.00034604125149151127 ,a1 = -1.9466970561224466 ,a2 = 0.9480812211284125; //low-pass Fc = 6Hz fs = 1000hz
//const double fb0 = 0.9149684297741606, fb1 = -1.8299368595483212, fb2 = 0.9149684297741606 ,fa1 = -1.8226935021735358, fa2 = 0.8371802169231065; // High-pass Fc = 20Hz fs = 1000hz
//const double fb0 = 0.8948577513857248 ,fb1 = -1.7897155027714495, fb2 = 0.8948577513857248,fa1 = -1.7786300789392977,fa2 = 0.8008009266036016; // High-pass Fc = 25Hz fs = 1000Hz
//const double b0 = 0.005542711916075981,b1 = 0.011085423832151962,b2 = 0.005542711916075981,a1 = -1.7786300789392977,a2 = 0.8008009266036016; //Low-pass Fc = 25Hz fs=1000Hz
//const double fb0 = 0.9780302754084559,fb1 = -1.9560605508169118,fb2 = 0.9780302754084559,fa1 = -1.9555778328194147,fa2 = 0.9565432688144089; //high-pass Fc = 6hz fs = 1000hz
const double fb0 = 0.9911535113858849,fb1 = -1.9823070227717698,fb2 = 0.9911535113858849,fa1 = -1.9822287623675816,fa2 = 0.982385283175958; //High-pass Fc = 2Hz fs = 1000Hz
//const double fb0 = 0.0036216786873927774,fb1 = 0.007243357374785555,fb2 = 0.0036216786873927774,fa1 = -1.8226935021735358,fa2 = 0.8371802169231065; ///Low-pass Fc = 20 Hz Fs = 1000Hz



// Read the analog input
AnalogIn    an_in(A0);

AnalogOut   an_out(DAC0_OUT); 
// The data read and send function
void scopeSend()
{
    scope.set(0,c);
    scope.set(1,fy);
    scope.set(2,n);
   
    scope.send();
    
    while(calib == true and n <= 2000.00) {
        
        c = c + fy;
    
        n ++;
        
        }
        
        
}
 
 void computeBiquad(){
   
  
     
    double v = an_in - a1*v1 - a2*v2;
    y= b0*v + b1*v1 +b2*v2;
    v2=v1;
    v1=v;
     
       y = abs(y);
     
     
     double fv = y - fa1*fv1 - fa2*fv2;
    fy= fb0*fv + fb1*fv1 + fb2*fv2;
    fv2=fv1;
    fv1=fv;
    
    fy = abs(fy);
}
 
 
 

 
 
 
 
int main()
{
    light = 1;
    
    // Attach the data read and send function at 1000 Hz
    scopeTimer.attach_us(&scopeSend, 1e5);   
    //scopeTimer.attach_us(&calibrate, 1e5);
    biquadTicker.attach(&computeBiquad,0.0001f);
     //float i = 1;
    while(1) {
      if (fy >=  c and calib == false){
          light = 0;
          }
        
      
      else if (knop == 0){
          light = 0;
          calib = true;
          c = 0;
          n = 0;
          wait(5);
          light = 1;
          calib = false;
          c = c/n;
         }
          
          
      else{
            light = 1;
            }
    }
}