Working with all filters, all filter results are low amplitude.

Dependencies:   HIDScope biquadFilter mbed

Fork of frdm_calibratie_maximum by Marieke M

main.cpp

Committer:
Marieke
Date:
2016-10-21
Revision:
1:278677bb6b99
Parent:
0:4d69864f1002
Child:
2:27081b83a58e

File content as of revision 1:278677bb6b99:

#include "mbed.h"
#include <stdio.h>
#define SERIAL_BAUD 115200

AnalogIn    emg0( A0 );
AnalogIn    emg1( A1 );
Serial pc(USBTX,USBRX);

//HIDScope    scope( 6 );

 
/*int main() {
  pc.baud(115200);
  int array[10], maximum, size, c, location = 1;
  
  for (int i=0;i<10;i++)
    {
    double EMGright = emg0.read();
    EMGright = array[i];
    }
 
  printf("Enter the number of elements in array\n");
  scanf("%d", &size);
 
  printf("Enter %d integers\n", size);
 
  for (c = 0; c < size; c++)
    scanf("%d", &array[c]);
 
  maximum = array[0];
 
  for (c = 1; c < size; c++)
  {
    if (array[c] > maximum)
    {
       maximum  = array[c];
       location = c+1;
    }
  }
 
  printf("Maximum element is present at location %d and it's value is %d.\n", location, maximum);
  return 0;
}*/
/*
#include "mbed.h"
#include "HIDScope.h"
#include "BiQuad.h"
#include <stdio.h>

//Define objects
AnalogIn    emg0( A0 );
AnalogIn    emg1( A1 );*/

Ticker      sample_timer, average_timer, filter_timer, t;
//HIDScope    scope( 6 );
DigitalOut  led1(LED_RED);
DigitalOut  led2(LED_BLUE);

volatile int time_passed = 0;
volatile bool filter_timer_go=false;

double EMGright;
double EMGleft;
//average_timer_go=false,
 // Activates go-flags
//void average_timer_act(){average_timer_go=true;};
/*void filter_timer_act(){filter_timer_go=true;};



BiQuadChain bcq;
// Notch filter wo=50; bw=wo/35
BiQuad bq1(9.7805e-01,-1.1978e-16,9.7805e-01,1.0000e+00,-1.1978e-16,9.5610e-01);
// High pass Butterworth filter 2nd order, Fc=10;
BiQuad bq2(9.8239e-01,-1.9648e+00,9.8239e-01,1.0000e+00,-1.9645e+00,9.6508e-01);
// Low pass Butterworth filter 2nd order, Fc = 8;
BiQuad bq3(5.6248e-05,1.1250e-04,5.6248e-05,1.0000e+00,-1.9787e+00,9.7890e-01);
// Low pass Butterworth filter 4th order, Fc = 450; plited up in 2x2nd order
BiQuad bq4(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-4.6382e-01,8.9354e-02);
BiQuad bq5(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-6.3254e-01,4.8559e-01);*/

void KeepTrackOfTime()
{
    time_passed++;
}

void sample()
{
    double EMGright = emg0;
    double EMGleft = emg1;
    /*.set(0, emg0.read() );
    scope.set(1, emg1.read() );
    
    scope.send();
    
    led1 = 0;
    wait(0.5f);
    led1 = 1;
    wait(0.5f);*/
}

// In the following: R is used for right arm, L is used for left arm!
/*void FilteredSample()
{   
    double inR = emg0.read();
    double inL = emg1.read();
    //double inLcal = inL-averageL(sumL,size);
    double outRnotch = bq1.step(inR);
    double outRhigh = bq2.step(outRnotch);
    double outRrect = fabs(outRhigh);
    double outRlow = bcq.step(outRrect);
    double outLnotch = bq1.step(inL);
    double outLhigh = bq2.step(outLnotch);
    double outLrect = fabs(outLhigh);
    double outLlow = bcq.step(outLrect);
    
    scope.set(0, inR);
    scope.set(1, inL);
    scope.set(2, outRlow);
    scope.set(3, outLlow);
    
    
    scope.send();
    // To indicate that the function is working, the LED is toggled
    led2 = !led2;
}*/

    
/*
void average(double averageR, double averageL)
{
    int averageR(int,int);
    int averageL(int,int);
    int size = 5000; //10/0.002
    int arrayR[size]; //declaring array
    int arrayL[size];
    int sumR = 0;
    int sumL = 0;
    
    for (int i=0;i<size;i++)
    {
        double EMGright = emg0.read();
        double EMGleft = emg1.read();
        EMGright = arrayR[i];
        EMGleft = arrayL[i];
        sumL = sumL+arrayR[i];
        sumR=sumR+arrayR[i];
        //double averageR = sumR/arrayR;
        //double averageL = sumL/arrayL;
    }
    return averageR=sumR/sizeR;
    return averageL(sumL,sizeL);*/
    
float averageR(int sumR, int size)
{
    return (float) sumR/size;
}

float averageL(int sumL, int size)
{
    return (float) sumL/size;
}


int main()
{   
    pc.baud(115200);
    led1=1;
    led2=1;
    t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds

    //for (;;) {
        //if (time_passed<=10) 
        //{
        //sample_timer.attach(&sample, 0.002); //500Hz
        
        /*float averageR(float,int);
        float averageL(float,int);
        int size = 500; //10/0.002
        int arrayR[size]; //declaring array
        int arrayL[size];
        int sumR = 0;
        int sumL = 0;
        float EMGright = emg0.read();
        float EMGleft = emg1.read();
        
            for (int i=0;i<size;i++)
            {
            emg0.read() = arrayR[i];
            arrayL[i]= emg1.read();
            sumL = sumL+arrayL[i];
            sumR = sumR+arrayR[i];
            }
            // Calibration step with the gained averages
            //double CalibrationFactorR = 0.5/averageR(sumR,size);
            //double CalibrationFactorL = 0.5/averageL(sumL,size);
            */
            int size = 12500;
            int i; 
            double EMGsumR;
            double EMGsumL; 
            
            while(i<size){
            sample();
            EMGsumR = emg0.read()+EMGsumR;
            EMGsumL = EMGleft+EMGsumL;
            i++;
            wait(0.0004);
            }
            
        double averageEMGr = (double) EMGsumR/size;
        double averageEMGl = (double) EMGsumL/size;
        double InRcal = emg0.read()-averageEMGr;
        double InLcal = emg1.read()-averageEMGl;
        
        led1 =!led1;
        //wait(0.5f);
        
        /*scope.set(0, emg0.read() );
        scope.set(1, 1 );
        scope.set(2, averageEMGr);
        scope.set(3, averageL(sumL,size));
        scope.set(5, InRcal );
        scope.set(6, InLcal );
        
        scope.send();*/
        //pc.printf("EMG-signal = %f\n\r",emg0.read());
        pc.printf("averageR = %f\n\r",averageEMGr);
        pc.printf("averageR = %f\n\r",averageEMGl);
        //pc.printf("averageRvoid = %f\n\r",averageR(sumR,size));
        //pc.printf("Detrend EMG = %f\n\r",InRcal);
        //pc.printf("array value = %f\n\r",arrayR[3]);
        pc.printf("test\n\r");
        pc.printf("EMG sum = %f\n\r",EMGsumR);
        pc.printf("EMG signal  = %f\n\r",EMGright);
        
        /*else
        {
                   
        led1 = 1; 
        led2=!led2;
        
        bcq.add(&bq3).add(&bq4).add(&bq5);
      
        filter_timer.attach(&filter_timer_act, 0.0004); //2500Hz (same as with filter coefficients on matlab!!! Thus adjust!)
        
            while(1)
            {
            if (filter_timer_go){
                filter_timer_go=false;
                FilteredSample();}
            }
        
        }*/

}