Peter Incorvaja
/
FIR_Filter
Revision 0:76eeca7a361f, committed 2018-01-28
- Comitter:
- wavejumper
- Date:
- Sun Jan 28 12:38:34 2018 +0000
- Commit message:
- FIR_Filter mixed-c/asm (not working yet)
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 76eeca7a361f main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 28 12:38:34 2018 +0000 @@ -0,0 +1,90 @@ +#include "mbed.h" + +/*LPF cut off frequency 600Hz(3rd Order with 20kHz sampling frequency)*/ +AnalogIn Ain(p15); +AnalogOut Aout(p18); + +float data_in,data_out; + +Ticker s1_khz_tick; + +__ASM int addi(int a, int b) +{ + ADDS R0, R1 + BX LR +} + +__ASM int multi(int a, int b) +{ + MUL R0, R1 + BX LR +} + +__ASM int move(int a, int b) +{ + MOV R0, R1 + BX LR +} + +float LPF(float LPF_in) +{ + + //------------------------------FIR ---------------------------------------------------- + float fda_coeff[16] = {0.00028360651120682420830293457569837301, + 0.00822761997979659653879025427158921957, + 0.009652502067820697279065811358123028185, + -0.020505027860776389725394608376518590376, + -0.055082214281865632399259880003228317946, + 0.001759656378417649713608028605449362658, + 0.187202210776797661750947554537560790777, + 0.369320487034980882157242376706562936306, + 0.369320487034980882157242376706562936306, + 0.187202210776797661750947554537560790777, + 0.001759656378417649713608028605449362658, + -0.055082214281865632399259880003228317946, + -0.020505027860776389725394608376518590376, + 0.009652502067820697279065811358123028185, + 0.00822761997979659653879025427158921957, + 0.00028360651120682420830293457569837301 + }; + + static float LPF_out; //the return variable/outbput of filter + static float x[12], y, z[12]; + + for (int i = 10; i >= 0; i--) { + x[i+1] = move(x[i+1], x[i]); + } + + x[0] = move(x[0], LPF_in); + + for (int i = 0; i < 12; i++) { + z[i] = multi(fda_coeff[i], x[i]); + } + + for (int i = 0; i < 12; i++) { + y = addi(z[i], y); + } + + LPF_out = move(LPF_out, y); + return LPF_out; //output filtered value +} + +void s1khz_task(void) +{ + data_in = Ain - 0.5; //Note the embed can only accept positive voltage inputs, it is necessary to add a small coupling and biasing circuit to + //offset the signal midway of approx 1.65V. + //A DC offset is a frequency component at 0 Hz. This can cause signal to wander. + //Therefore the mean value of the signal is subtracted.This is also to normalize the signal to an average value of zero, + //and allows the filter algorithm to perform DSP with no DC offset in the data. + + data_out = LPF(data_in); + Aout = data_out + 0.5; +} + +int main() +{ + s1_khz_tick.attach_us(&s1khz_task,1000); //1kHz sampling + + while(1); + +} \ No newline at end of file
diff -r 000000000000 -r 76eeca7a361f mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Jan 28 12:38:34 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e \ No newline at end of file