![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
first test of done filter
Dependencies: biquadFilter mbed HIDScope
main.cpp@7:f99e7ca907f1, 2016-10-26 (annotated)
- Committer:
- s1604554
- Date:
- Wed Oct 26 10:40:04 2016 +0000
- Revision:
- 7:f99e7ca907f1
- Parent:
- 6:7223ff6719b7
- Child:
- 8:3c9f2e6ea1cd
moving average filter added, if it does not work there are 3 alternative bqc's commented, just used those;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
s1604554 | 0:eb47e42019a4 | 1 | #include "mbed.h" |
s1604554 | 0:eb47e42019a4 | 2 | #include "BiQuad.h" |
s1604554 | 0:eb47e42019a4 | 3 | #include "stdlib.h" |
s1604554 | 0:eb47e42019a4 | 4 | #include <iostream> |
s1604554 | 0:eb47e42019a4 | 5 | #include <cmath> |
s1604554 | 0:eb47e42019a4 | 6 | #include <string> |
s1604554 | 1:e7cf79380e24 | 7 | #include "HIDScope.h" |
s1604554 | 0:eb47e42019a4 | 8 | |
s1604554 | 6:7223ff6719b7 | 9 | |
s1604554 | 1:e7cf79380e24 | 10 | AnalogIn emg0(A0); |
carlmaykel | 2:812bb0deedef | 11 | AnalogIn emg1(A1); |
s1604554 | 7:f99e7ca907f1 | 12 | DigitalOut led2(LED2); |
carlmaykel | 2:812bb0deedef | 13 | DigitalOut led1(LED1); |
s1604554 | 7:f99e7ca907f1 | 14 | |
s1604554 | 1:e7cf79380e24 | 15 | // |
carlmaykel | 2:812bb0deedef | 16 | HIDScope scope( 2 ); |
s1604554 | 1:e7cf79380e24 | 17 | Ticker emgticker; |
s1604554 | 1:e7cf79380e24 | 18 | |
s1604554 | 1:e7cf79380e24 | 19 | |
s1604554 | 0:eb47e42019a4 | 20 | |
s1604554 | 0:eb47e42019a4 | 21 | BiQuadChain bqc; |
s1604554 | 7:f99e7ca907f1 | 22 | BiQuad bq1( 5.79192e-01, -9.37153e-01, 5.79192e-01, -9.37153e-01, 1.58384e-01 ); |
s1604554 | 7:f99e7ca907f1 | 23 | BiQuad bq2( 7.69910e-09, 1.53982e-08, 7.69910e-09, -1.96542e+00, 9.65769e-01 ); |
s1604554 | 7:f99e7ca907f1 | 24 | BiQuad bq3( 1.00000e+00, 2.00000e+00, 1.00000e+00, -1.98532e+00, 9.85677e-01 ); |
s1604554 | 7:f99e7ca907f1 | 25 | BiQuad bq4( 9.91824e-01, -1.98365e+00, 9.91824e-01, -1.98842e+00, 9.88457e-01 ); |
s1604554 | 7:f99e7ca907f1 | 26 | BiQuad bq5( 1.00000e+00, -2.00000e+00, 1.00000e+00, -1.99516e+00, 9.95203e-01 ); |
s1604554 | 7:f99e7ca907f1 | 27 | BiQuad bq6( 1.00000e-01, 1.00000e-01, 0.00000e+00, 0.00000e+00, 0.00000e+00 ); |
s1604554 | 7:f99e7ca907f1 | 28 | BiQuad bq7( 1.00000e+00, -6.18034e-01, 1.00000e+00, 0.00000e+00, 0.00000e+00 ); |
s1604554 | 7:f99e7ca907f1 | 29 | BiQuad bq8( 1.00000e+00, 6.18034e-01, 1.00000e+00, 0.00000e+00, 0.00000e+00 ); |
s1604554 | 7:f99e7ca907f1 | 30 | BiQuad bq9( 1.00000e+00, 1.61803e+00, 1.00000e+00, 0.00000e+00, 0.00000e+00 ); |
s1604554 | 7:f99e7ca907f1 | 31 | BiQuad bq10( 1.00000e+00, -1.61803e+00, 1.00000e+00, 0.00000e+00, 0.00000e+00 ); |
s1604554 | 7:f99e7ca907f1 | 32 | //BiQuad bq1( 5.79192e-01, -9.37153e-01, 5.79192e-01, -9.37153e-01, 1.58384e-01 ); //notch |
s1604554 | 7:f99e7ca907f1 | 33 | //BiQuad bq2( 2.00834e-02, 4.01667e-02, 2.00834e-02, -1.56102e+00, 6.41352e-01 ); //low pass |
s1604554 | 7:f99e7ca907f1 | 34 | //BiQuad bq3( 8.94859e-01, -1.78972e+00, 8.94859e-01, -1.77863e+00, 8.00803e-01 ); //high pass |
s1604554 | 6:7223ff6719b7 | 35 | |
s1604554 | 1:e7cf79380e24 | 36 | |
s1604554 | 0:eb47e42019a4 | 37 | |
s1604554 | 1:e7cf79380e24 | 38 | void Sample () |
s1604554 | 1:e7cf79380e24 | 39 | { |
s1604554 | 1:e7cf79380e24 | 40 | |
s1604554 | 1:e7cf79380e24 | 41 | double emgSignal = emg0.read(); |
s1604554 | 6:7223ff6719b7 | 42 | |
s1604554 | 1:e7cf79380e24 | 43 | |
s1604554 | 4:81f889cd0c2e | 44 | double emgFiltered1 = bqc.step(emgSignal); |
s1604554 | 4:81f889cd0c2e | 45 | double emgFiltered2 = fabs(emgFiltered1); |
s1604554 | 0:eb47e42019a4 | 46 | |
s1604554 | 6:7223ff6719b7 | 47 | scope.set(0, emgSignal); |
s1604554 | 6:7223ff6719b7 | 48 | scope.set(1, emgFiltered2); |
s1604554 | 6:7223ff6719b7 | 49 | scope.send(); |
s1604554 | 7:f99e7ca907f1 | 50 | |
s1604554 | 7:f99e7ca907f1 | 51 | if (emgFiltered2 >= 0.03) |
s1604554 | 7:f99e7ca907f1 | 52 | |
s1604554 | 7:f99e7ca907f1 | 53 | { |
s1604554 | 7:f99e7ca907f1 | 54 | led2 = !led2; |
s1604554 | 6:7223ff6719b7 | 55 | led1 = !led1; |
s1604554 | 7:f99e7ca907f1 | 56 | |
s1604554 | 7:f99e7ca907f1 | 57 | |
s1604554 | 6:7223ff6719b7 | 58 | } |
s1604554 | 6:7223ff6719b7 | 59 | } |
s1604554 | 6:7223ff6719b7 | 60 | |
s1604554 | 6:7223ff6719b7 | 61 | int main() |
s1604554 | 6:7223ff6719b7 | 62 | { |
s1604554 | 7:f99e7ca907f1 | 63 | |
s1604554 | 7:f99e7ca907f1 | 64 | led1 = 0; |
s1604554 | 6:7223ff6719b7 | 65 | led2 = 1; |
s1604554 | 7:f99e7ca907f1 | 66 | |
s1604554 | 7:f99e7ca907f1 | 67 | bqc.add( &bq1 ).add( &bq2 ).add( &bq3 ).add( &bq4 ).add( &bq5 ).add( &bq6 ).add( &bq7 ).add( &bq8 ).add( &bq9 ).add( &bq10 ); |
s1604554 | 6:7223ff6719b7 | 68 | emgticker.attach(&Sample, 0.002); |
s1604554 | 7:f99e7ca907f1 | 69 | |
s1604554 | 7:f99e7ca907f1 | 70 | |
s1604554 | 6:7223ff6719b7 | 71 | while (true) { |
s1604554 | 6:7223ff6719b7 | 72 | |
s1604554 | 6:7223ff6719b7 | 73 | } |
s1604554 | 6:7223ff6719b7 | 74 | } |
s1604554 | 6:7223ff6719b7 | 75 | |
s1604554 | 6:7223ff6719b7 | 76 | |
s1604554 | 6:7223ff6719b7 | 77 | |
s1604554 | 6:7223ff6719b7 | 78 | |
s1604554 | 6:7223ff6719b7 | 79 | |
s1604554 | 6:7223ff6719b7 | 80 | |
s1604554 | 6:7223ff6719b7 | 81 | |
s1604554 | 6:7223ff6719b7 | 82 | |
s1604554 | 6:7223ff6719b7 | 83 | |
s1604554 | 6:7223ff6719b7 | 84 | |
s1604554 | 6:7223ff6719b7 | 85 | |
s1604554 | 6:7223ff6719b7 | 86 | |
s1604554 | 6:7223ff6719b7 | 87 | |
s1604554 | 6:7223ff6719b7 | 88 | |
s1604554 | 1:e7cf79380e24 | 89 | //int N = 50; |
s1604554 | 1:e7cf79380e24 | 90 | //double x = 2; |
s1604554 | 1:e7cf79380e24 | 91 | //double average; |
s1604554 | 0:eb47e42019a4 | 92 | |
s1604554 | 1:e7cf79380e24 | 93 | //for (int i = N;i<=10000;i++) |
s1604554 | 1:e7cf79380e24 | 94 | //{ |
s1604554 | 1:e7cf79380e24 | 95 | // average = sqrt(( pow(abs(M[i-49]),x)+pow(abs(M[i-48]),x)+pow(abs(M[i-47]),x)+pow(abs(M[i-46]),x)+pow(abs(M[i-45]),x)+pow(abs(M[i-44]),x)+pow(abs(M[i-43]),x)+pow(abs(M[i-42]),x)+pow(abs(M[i-41]),x)+pow(abs(M[i-40]),x)+pow(abs(M[i-39]),x)+pow(abs(M[i-38]),x)+pow(abs(M[i-37]),x)+pow(abs(M[i-36]),x)+pow(abs(M[i-35]),x)+pow(abs(M[i-34]),x)+pow(abs(M[i-33]),x)+pow(abs(M[i-32]),x)+pow(abs(M[i-31]),x)+pow(abs(M[i-30]),x)+pow(abs(M[i-29]),x)+pow(abs(M[i-28]),x)+pow(abs(M[i-27]),x)+pow(abs(M[i-26]),x)+pow(abs(M[i-25]),x)+pow(abs(M[i-24]),x)+pow(abs(M[i-23]),x)+pow(abs(M[i-22]),x)+pow(abs(M[i-21]),x)+pow(abs(M[i-20]),x)+pow(abs(M[i-19]),x)+pow(abs(M[i-18]),x)+pow(abs(M[i-17]),x)+pow(abs(M[i-16]),x)+pow(abs(M[i-15]),x)+pow(abs(M[i-14]),x)+pow(abs(M[i-13]),x)+pow(abs(M[i-12]),x)+pow(abs(M[i-11]),x)+pow(abs(M[i-10]),x)+pow(abs(M[i-9]),x)+pow(abs(M[i-8]),x)+pow(abs(M[i-7]),x)+pow(abs(M[i-6]),x)+pow(abs(M[i-5]),x)+pow(abs(M[i-4]),x)+pow(abs(M[i-3]),x)+pow(abs(M[i-2]),x)+pow(abs(M[i-1]),x)+pow(abs(M[i]),x))/static_cast<double>(N)); |
s1604554 | 1:e7cf79380e24 | 96 | |
s1604554 | 1:e7cf79380e24 | 97 | // } |
s1604554 | 1:e7cf79380e24 | 98 | |
s1604554 | 1:e7cf79380e24 | 99 | |
s1604554 | 0:eb47e42019a4 | 100 | //Full wave rectifier, moving average, and RMS |
s1604554 | 0:eb47e42019a4 | 101 | |
s1604554 | 0:eb47e42019a4 | 102 | |
s1604554 | 0:eb47e42019a4 | 103 |