縦続形 IIR フィルタ用ライブラリ. Library for cascade structure IIR filter.

Dependents:   Demo_IIR_Filter UIT2_VariableIIR_LPF UIT2_VariableIIR_LPFHPF

Committer:
MikamiUitOpen
Date:
Thu Sep 03 00:42:10 2015 +0000
Revision:
0:d2f279439aaf
Child:
1:69a8b728e8d2
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:d2f279439aaf 1 //----------------------------------------------------------------
MikamiUitOpen 0:d2f279439aaf 2 // 縦続形 IIR フィルタ(Biquad クラスを使用)
MikamiUitOpen 0:d2f279439aaf 3 // Class for IIR filter of cascade structure using Biquad class
MikamiUitOpen 0:d2f279439aaf 4 // 2015/09/03, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 0:d2f279439aaf 5 //----------------------------------------------------------------
MikamiUitOpen 0:d2f279439aaf 6
MikamiUitOpen 0:d2f279439aaf 7 #ifndef IIR_CASCADE_HPP
MikamiUitOpen 0:d2f279439aaf 8 #define IIR_CASCADE_HPP
MikamiUitOpen 0:d2f279439aaf 9
MikamiUitOpen 0:d2f279439aaf 10 #include "Biquad.hpp"
MikamiUitOpen 0:d2f279439aaf 11
MikamiUitOpen 0:d2f279439aaf 12 namespace Mikami
MikamiUitOpen 0:d2f279439aaf 13 {
MikamiUitOpen 0:d2f279439aaf 14 template<int order> class IirCascade
MikamiUitOpen 0:d2f279439aaf 15 {
MikamiUitOpen 0:d2f279439aaf 16 public:
MikamiUitOpen 0:d2f279439aaf 17
MikamiUitOpen 0:d2f279439aaf 18 // constructor
MikamiUitOpen 0:d2f279439aaf 19 IirCascade(const Biquad::Coefs ck[], float g0) : g0_(g0)
MikamiUitOpen 0:d2f279439aaf 20 {
MikamiUitOpen 0:d2f279439aaf 21 for (int n=0; n<order/2; n++)
MikamiUitOpen 0:d2f279439aaf 22 hk_[n] = new Biquad(ck[n]);
MikamiUitOpen 0:d2f279439aaf 23 Clear();
MikamiUitOpen 0:d2f279439aaf 24 }
MikamiUitOpen 0:d2f279439aaf 25
MikamiUitOpen 0:d2f279439aaf 26 // destructor
MikamiUitOpen 0:d2f279439aaf 27 ~IirCascade()
MikamiUitOpen 0:d2f279439aaf 28 {
MikamiUitOpen 0:d2f279439aaf 29 for (int n=0; n<order/2; n++) delete hk_[n];
MikamiUitOpen 0:d2f279439aaf 30 }
MikamiUitOpen 0:d2f279439aaf 31
MikamiUitOpen 0:d2f279439aaf 32 // clear internal buffer
MikamiUitOpen 0:d2f279439aaf 33 void Clear()
MikamiUitOpen 0:d2f279439aaf 34 {
MikamiUitOpen 0:d2f279439aaf 35 for (int k=0; k<order/2; k++) hk_[k]->Clear();
MikamiUitOpen 0:d2f279439aaf 36 }
MikamiUitOpen 0:d2f279439aaf 37
MikamiUitOpen 0:d2f279439aaf 38 // execute filter
MikamiUitOpen 0:d2f279439aaf 39 float Execute(float xn)
MikamiUitOpen 0:d2f279439aaf 40 {
MikamiUitOpen 0:d2f279439aaf 41 float yn = g0_*xn;
MikamiUitOpen 0:d2f279439aaf 42 for (int k=0; k<order/2; k++) yn = hk_[k]->Execute(yn);
MikamiUitOpen 0:d2f279439aaf 43 return yn;
MikamiUitOpen 0:d2f279439aaf 44 }
MikamiUitOpen 0:d2f279439aaf 45
MikamiUitOpen 0:d2f279439aaf 46 private:
MikamiUitOpen 0:d2f279439aaf 47 Biquad* hk_[order/2]; // biquad IIR filter
MikamiUitOpen 0:d2f279439aaf 48 const float g0_; // gain factor
MikamiUitOpen 0:d2f279439aaf 49
MikamiUitOpen 0:d2f279439aaf 50 // disallow copy constructor and assignment operator
MikamiUitOpen 0:d2f279439aaf 51 IirCascade(const IirCascade&);
MikamiUitOpen 0:d2f279439aaf 52 IirCascade& operator = (const IirCascade&);
MikamiUitOpen 0:d2f279439aaf 53 };
MikamiUitOpen 0:d2f279439aaf 54 }
MikamiUitOpen 0:d2f279439aaf 55 #endif // IIR_CASCADE_HPP