This is a test version

Dependencies:   HIDScope MODSERIAL QEI mbed

Fork of Filter_EMG by Bayu Dharmaputra

main.cpp

Committer:
bvgool
Date:
2015-10-18
Revision:
1:b9471e519760
Parent:
0:8ccd4c66e07f

File content as of revision 1:b9471e519760:

#include "mbed.h"
#include "MODSERIAL.h"
#include "math.h"
#include "HIDScope.h"


AnalogIn EMG(A1);
MODSERIAL pc(USBTX, USBRX);

//const int baudrate = 115200;
//const int ms_wait = 100;

// Define the HIDScope and Ticker objects
HIDScope    scope(1);
Ticker scopeTimer;

// Define moving average variables
const int N = 125;
double a;  

 // Define the storage variables and filter coe icients for two filters
 double f1_v1 = 0, f1_v2 = 0, f2_v1 = 0, f2_v2 = 0;
const double f1_a1 =  -1.822694925196308, f1_a2 = 0.837181651256022, f1_b0 = 0.914969144113083, f1_b1 = -1.829938288226165, f1_b2 = 0.914969144113083;
const double f2_a1 = -1.142980502539901, f2_a2 = 0.412801598096189, f2_b0 = 0.067455273889072, f2_b1 =  0.134910547778144, f2_b2 = 0.067455273889072;

 double biquad( double u, double &v1, double &v2, const double a1, const double a2, const double b0, const double b1, const double b2 )
 {
 double v = u-a1*v1-a2*v2;
 double y = b0*v + b1*v1 + b2*v2;
 v2 = v1; v1 = v;
 return y;
 }

double sliding_average(double u,const int f_N)
{
    double f_x[f_N];
    double f_sum=0;
    f_x[1]=abs(u);
    for (int i=f_N; i>=1; i--){
        f_x[i]=f_x[i-1];
        }
        
      
    for (int i=f_N; i>=0; i--){
        f_sum=f_x[i]+f_sum;
       }
        a=f_sum/double(f_N);
        f_sum=0;
    return a;
}




void scopeSend(){
 double u1 = EMG.read()  ; //filter 1 input
 double y1 = biquad( u1, f1_v1, f1_v2, f1_a1, f1_a2, f1_b0, f1_b1, f1_b2 ); //notch
 double y2 = biquad( y1, f2_v1, f2_v2, f2_a1, f2_a2, f2_b0, f2_b1, f2_b2 ); //lowpass with rectifier
 double z1 = 3*sliding_average(y2, N); //moving average
  scope.set(0,z1);
scope.send();
 }
 
int main()
{
    scopeTimer.attach(&scopeSend,0.002);
     while(1){}
        
}