Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope MODSERIAL mbed
Fork of Signal Filter by
main.cpp@7:7493a0c5c6aa, 2015-09-28 (annotated)
- Committer:
- fredwsl
- Date:
- Mon Sep 28 08:41:32 2015 +0000
- Revision:
- 7:7493a0c5c6aa
- Parent:
- 6:c20a8c0f90ed
- Child:
- 8:a1ea1bf49944
Moving Average
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Peasofcake | 0:c8a6e00fbdc3 | 1 | #include "mbed.h" |
Peasofcake | 1:f6110f80fa45 | 2 | #include "MODSERIAL.h" |
Peasofcake | 2:e30dbfec6d1e | 3 | #include "math.h" |
Peasofcake | 1:f6110f80fa45 | 4 | #include "HIDScope.h" |
Peasofcake | 2:e30dbfec6d1e | 5 | |
Peasofcake | 2:e30dbfec6d1e | 6 | |
Peasofcake | 2:e30dbfec6d1e | 7 | AnalogIn EMG(A0); |
Peasofcake | 1:f6110f80fa45 | 8 | MODSERIAL pc(USBTX, USBRX); |
Peasofcake | 0:c8a6e00fbdc3 | 9 | |
Peasofcake | 2:e30dbfec6d1e | 10 | //const int baudrate = 115200; |
Peasofcake | 1:f6110f80fa45 | 11 | //const int ms_wait = 100; |
Peasofcake | 0:c8a6e00fbdc3 | 12 | |
Peasofcake | 1:f6110f80fa45 | 13 | // Define the HIDScope and Ticker objects |
Peasofcake | 2:e30dbfec6d1e | 14 | HIDScope scope(1); |
Peasofcake | 2:e30dbfec6d1e | 15 | Ticker scopeTimer; |
Peasofcake | 2:e30dbfec6d1e | 16 | |
fredwsl | 6:c20a8c0f90ed | 17 | // Define moving average variables |
fredwsl | 6:c20a8c0f90ed | 18 | const int N = 150; |
fredwsl | 6:c20a8c0f90ed | 19 | double a; |
Peasofcake | 2:e30dbfec6d1e | 20 | |
Peasofcake | 2:e30dbfec6d1e | 21 | // Define the storage variables and filter coeicients for two filters |
Peasofcake | 2:e30dbfec6d1e | 22 | double f1_v1 = 0, f1_v2 = 0, f2_v1 = 0, f2_v2 = 0; |
fredwsl | 6:c20a8c0f90ed | 23 | const double f1_a1 = -1.998222847291842, f1_a2 = 0.998224425026401, f1_b0 = 0.999111818079561, f1_b1 = -1.998223636159122, f1_b2 = 0.999111818079561; |
fredwsl | 6:c20a8c0f90ed | 24 | // const double f1_a1 = 0.25071442433, f1_a2 = 0.21711875780, f1_b0 = 1.0, f1_b1 = -1.62432585007, f1_b2 = 1.0; |
fredwsl | 6:c20a8c0f90ed | 25 | // const double f2_a1 = -1.77682226139, f2_a2 = 0.80213897411, f2_b0 = 1.0, f2_b1 = -1.62432585007, f2_b2 = 1.0; |
Peasofcake | 2:e30dbfec6d1e | 26 | |
Peasofcake | 3:04f3cca82b22 | 27 | double biquad( double u, double &v1, double &v2, const double a1, const double a2, const double b0, const double b1, const double b2 ) |
Peasofcake | 3:04f3cca82b22 | 28 | { |
Peasofcake | 3:04f3cca82b22 | 29 | double v = u-a1*v1-a2*v2; |
Peasofcake | 3:04f3cca82b22 | 30 | double y = b0*v + b1*v1 + b2*v2; |
Peasofcake | 2:e30dbfec6d1e | 31 | v2 = v1; v1 = v; |
Peasofcake | 2:e30dbfec6d1e | 32 | return y; |
Peasofcake | 2:e30dbfec6d1e | 33 | } |
Peasofcake | 2:e30dbfec6d1e | 34 | |
fredwsl | 6:c20a8c0f90ed | 35 | double sliding_average(double u,const int f_N) |
fredwsl | 6:c20a8c0f90ed | 36 | { |
fredwsl | 6:c20a8c0f90ed | 37 | double f_x[f_N]; |
fredwsl | 6:c20a8c0f90ed | 38 | double f_sum=0; |
fredwsl | 7:7493a0c5c6aa | 39 | f_x[1]=fabs(u); |
fredwsl | 6:c20a8c0f90ed | 40 | for (int i=f_N; i>=1; i--){ |
fredwsl | 6:c20a8c0f90ed | 41 | f_x[i]=f_x[i-1]; |
fredwsl | 6:c20a8c0f90ed | 42 | } |
fredwsl | 6:c20a8c0f90ed | 43 | |
fredwsl | 6:c20a8c0f90ed | 44 | |
fredwsl | 6:c20a8c0f90ed | 45 | for (int i=f_N; i>=0; i--){ |
fredwsl | 6:c20a8c0f90ed | 46 | f_sum=f_x[i]+f_sum; |
fredwsl | 6:c20a8c0f90ed | 47 | } |
fredwsl | 7:7493a0c5c6aa | 48 | a=f_sum/double(f_N); |
fredwsl | 6:c20a8c0f90ed | 49 | f_sum=0; |
fredwsl | 6:c20a8c0f90ed | 50 | return a; |
fredwsl | 6:c20a8c0f90ed | 51 | } |
fredwsl | 6:c20a8c0f90ed | 52 | |
fredwsl | 6:c20a8c0f90ed | 53 | |
fredwsl | 6:c20a8c0f90ed | 54 | |
fredwsl | 6:c20a8c0f90ed | 55 | |
fredwsl | 6:c20a8c0f90ed | 56 | |
fredwsl | 6:c20a8c0f90ed | 57 | |
fredwsl | 6:c20a8c0f90ed | 58 | |
fredwsl | 6:c20a8c0f90ed | 59 | |
Peasofcake | 2:e30dbfec6d1e | 60 | // This is your controller, call it using a Ticker |
Peasofcake | 3:04f3cca82b22 | 61 | // void myController() { |
Peasofcake | 3:04f3cca82b22 | 62 | //double u1 = EMG, u2 = y1 ; |
Peasofcake | 3:04f3cca82b22 | 63 | //double y1 = biquad( u1, f1_v1, f1_v2, f1_a1, f1_a2, f1_b0, f1_b1, f1_b2 ); |
Peasofcake | 3:04f3cca82b22 | 64 | //double y2 = biquad( u2, f2_v1, f2_v2, f2_a1, f2_a2, f2_b0, f2_b1, f2_b2 ); |
Peasofcake | 3:04f3cca82b22 | 65 | //} |
Peasofcake | 2:e30dbfec6d1e | 66 | |
Peasofcake | 2:e30dbfec6d1e | 67 | |
Peasofcake | 2:e30dbfec6d1e | 68 | |
Peasofcake | 2:e30dbfec6d1e | 69 | |
Peasofcake | 2:e30dbfec6d1e | 70 | void scopeSend(){ |
fredwsl | 6:c20a8c0f90ed | 71 | double u1 = EMG.read() ; //filter 1 input |
fredwsl | 6:c20a8c0f90ed | 72 | |
Peasofcake | 3:04f3cca82b22 | 73 | double y1 = biquad( u1, f1_v1, f1_v2, f1_a1, f1_a2, f1_b0, f1_b1, f1_b2 ); |
fredwsl | 6:c20a8c0f90ed | 74 | //double u2 = y1; //filter 2 input |
fredwsl | 6:c20a8c0f90ed | 75 | //double y2 = biquad( u2, f2_v1, f2_v2, f2_a1, f2_a2, f2_b0, f2_b1, f2_b2 ); |
fredwsl | 6:c20a8c0f90ed | 76 | double z1 = sliding_average(y1, N); |
fredwsl | 6:c20a8c0f90ed | 77 | scope.set(0,z1); |
fredwsl | 7:7493a0c5c6aa | 78 | //scope.set(1,u1); |
Peasofcake | 2:e30dbfec6d1e | 79 | scope.send(); |
Peasofcake | 2:e30dbfec6d1e | 80 | } |
Peasofcake | 3:04f3cca82b22 | 81 | |
Peasofcake | 0:c8a6e00fbdc3 | 82 | int main() |
Peasofcake | 3:04f3cca82b22 | 83 | { |
fredwsl | 6:c20a8c0f90ed | 84 | scopeTimer.attach(&scopeSend,0.002); |
Peasofcake | 2:e30dbfec6d1e | 85 | while(1){} |
Peasofcake | 1:f6110f80fa45 | 86 | |
Peasofcake | 0:c8a6e00fbdc3 | 87 | } |