不韋 呂
/
UIT2_IIR_Direct_float
IIR filter of direct form using float type operations and coefficients for ST Nucleo F401RE.
Diff: main.cpp
- Revision:
- 7:f9711acfaedf
- Parent:
- 5:5709a56ac600
--- a/main.cpp Sat Nov 15 06:26:22 2014 +0000 +++ b/main.cpp Thu Nov 20 07:49:14 2014 +0000 @@ -2,7 +2,7 @@ // IIR フィルタ,直接形,float で演算 // Analog Input : A0 // Analog Output: MCP4922 using SPI -// 2014/11/12, Copyright (c) 2014 MIKAMI, Naoki +// 2014/11/20, Copyright (c) 2014 MIKAMI, Naoki //-------------------------------------------------------------- #include "mbed.h" @@ -36,22 +36,21 @@ { myDac_.ScfClockTim3(500000); // cutoff frequency: 5 kHz - float un[ORDER_]; // 過去の計算結果を格納する配列 - for (int k=0; k<ORDER_; k++) un[k] = 0; + float un[ORDER_+1]; // Buffer corresponding to delays + for (int k=0; k<=ORDER_; k++) un[k] = 0; while (true) { float xn = adc_.Read(); // Read from A0 //----------------------------------------------- - float u0 = xn; - for (int k=0; k<ORDER_; k++) u0 = u0 + am_[k]*un[k]; - float yn = bm_[0]*u0; - for (int k=0; k<ORDER_; k++) yn = yn + bm_[k+1]*un[k]; + un[0] = xn; + for (int k=0; k<ORDER_; k++) un[0] = un[0] + am_[k]*un[k+1]; + float yn = 0; + for (int k=0; k<=ORDER_; k++) yn = yn + bm_[k]*un[k]; // 計算結果の移動 - for (int k=ORDER_-1; k>0; k--) un[k] = un[k-1]; - un[0] = u0; + for (int k=ORDER_; k>0; k--) un[k] = un[k-1]; //----------------------------------------------- myDac_.Write(yn); // Write to DAC