IIR filter of direct form using double type operations and coefficients for ST Nucleo F401RE.

Dependencies:   UIT_ADDA mbed

Revision:
7:3889dd456ffa
Parent:
5:41b9b4f4e6c0
--- a/main.cpp	Sat Nov 15 06:22:19 2014 +0000
+++ b/main.cpp	Thu Nov 20 07:54:20 2014 +0000
@@ -2,7 +2,7 @@
 // IIR フィルタ,直接形,double で演算
 //      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
 
-    double un[ORDER_];          // 過去の計算結果を格納する配列
-    for (int k=0; k<ORDER_; k++) un[k] = 0; 
+    double 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
         //-----------------------------------------------
 
-        double u0 = xn;
-        for (int k=0; k<ORDER_; k++) u0 = u0 + am_[k]*un[k];
-        double 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];
+        double 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((float)yn);    // Write to DAC