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

Dependencies:   UIT_ADDA mbed

Committer:
MikamiUitOpen
Date:
Mon Oct 20 23:24:25 2014 +0000
Revision:
0:3f57c7540719
Child:
1:5016cbf30cd0
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:3f57c7540719 1 //--------------------------------------------------------------
MikamiUitOpen 0:3f57c7540719 2 // IIR フィルタ,直接形,double で演算
MikamiUitOpen 0:3f57c7540719 3 // Analog Input : A0
MikamiUitOpen 0:3f57c7540719 4 // Analog Output: MCP4922 using SPI
MikamiUitOpen 0:3f57c7540719 5 // 2014/10/20, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 0:3f57c7540719 6 //--------------------------------------------------------------
MikamiUitOpen 0:3f57c7540719 7
MikamiUitOpen 0:3f57c7540719 8 #include "mbed.h"
MikamiUitOpen 0:3f57c7540719 9
MikamiUitOpen 0:3f57c7540719 10 #include "ADC_Interrupt.hpp" // for ADC using interrupt
MikamiUitOpen 0:3f57c7540719 11 #include "DAC_MCP4922.hpp" // for DAC MCP4922
MikamiUitOpen 0:3f57c7540719 12 #include "ScfClockTim3.hpp" // for clock supplied to SCF
MikamiUitOpen 0:3f57c7540719 13
MikamiUitOpen 0:3f57c7540719 14 using namespace Mikami;
MikamiUitOpen 0:3f57c7540719 15
MikamiUitOpen 0:3f57c7540719 16 const int ORDER_ = 6; // order
MikamiUitOpen 0:3f57c7540719 17 // 低域通過フィルタ
MikamiUitOpen 0:3f57c7540719 18 // 連立チェビシェフ特性
MikamiUitOpen 0:3f57c7540719 19 // 次数    :6 次
MikamiUitOpen 0:3f57c7540719 20 // 標本化周波数: 12.00 kHz
MikamiUitOpen 0:3f57c7540719 21 // 遮断周波数 : 0.40 kHz
MikamiUitOpen 0:3f57c7540719 22 // 通過域のリップル: 0.50 dB
MikamiUitOpen 0:3f57c7540719 23 // 阻止域の減衰量 :40.00 dB
MikamiUitOpen 0:3f57c7540719 24 const double am_[ORDER_] = {
MikamiUitOpen 0:3f57c7540719 25 5.684787115202E+00, -1.354501388127E+01, 1.731054054746E+01,
MikamiUitOpen 0:3f57c7540719 26 -1.251297336508E+01, 4.850124049778E+00, -7.874837248679E-01};
MikamiUitOpen 0:3f57c7540719 27 const double bm_[ORDER_+1] = {
MikamiUitOpen 0:3f57c7540719 28 1.000028097647E-02, -5.466081078904E-02, 1.292315717890E-01,
MikamiUitOpen 0:3f57c7540719 29 -1.691239024945E-01, 1.292315717890E-01, -5.466081078904E-02,
MikamiUitOpen 0:3f57c7540719 30 1.000028097647E-02};
MikamiUitOpen 0:3f57c7540719 31
MikamiUitOpen 0:3f57c7540719 32 const int FS_ = 12000; // Sampling frequency: 12 kHz
MikamiUitOpen 0:3f57c7540719 33 ADC_Base adc_(A0, FS_); // for AD
MikamiUitOpen 0:3f57c7540719 34 DAC_MCP4922 myDac_(DAC_MCP4922::DAC_A); // for DA
MikamiUitOpen 0:3f57c7540719 35
MikamiUitOpen 0:3f57c7540719 36 int main()
MikamiUitOpen 0:3f57c7540719 37 {
MikamiUitOpen 0:3f57c7540719 38 ScfClockTim3(500000); // cutoff frequency: 5 kHz
MikamiUitOpen 0:3f57c7540719 39
MikamiUitOpen 0:3f57c7540719 40 double un[ORDER_]; // 過去の計算結果を格納する配列
MikamiUitOpen 0:3f57c7540719 41 for (int k=0; k<ORDER_; k++) un[k] = 0;
MikamiUitOpen 0:3f57c7540719 42
MikamiUitOpen 0:3f57c7540719 43 while (true)
MikamiUitOpen 0:3f57c7540719 44 {
MikamiUitOpen 0:3f57c7540719 45 float xn = adc_.Read(); // Read from A0
MikamiUitOpen 0:3f57c7540719 46 //-----------------------------------------------
MikamiUitOpen 0:3f57c7540719 47
MikamiUitOpen 0:3f57c7540719 48 double u0 = xn;
MikamiUitOpen 0:3f57c7540719 49 for (int k=0; k<ORDER_; k++) u0 = u0 + am_[k]*un[k];
MikamiUitOpen 0:3f57c7540719 50 double yn = bm_[0]*u0;
MikamiUitOpen 0:3f57c7540719 51 for (int k=0; k<ORDER_; k++) yn = yn + bm_[k+1]*un[k];
MikamiUitOpen 0:3f57c7540719 52
MikamiUitOpen 0:3f57c7540719 53 // 計算結果の移動
MikamiUitOpen 0:3f57c7540719 54 for (int k=ORDER_-1; k>0; k--) un[k] = un[k-1];
MikamiUitOpen 0:3f57c7540719 55 un[0] = u0;
MikamiUitOpen 0:3f57c7540719 56
MikamiUitOpen 0:3f57c7540719 57 //-----------------------------------------------
MikamiUitOpen 0:3f57c7540719 58 myDac_.Write((float)yn); // Write to DAC
MikamiUitOpen 0:3f57c7540719 59 }
MikamiUitOpen 0:3f57c7540719 60 }
MikamiUitOpen 0:3f57c7540719 61