縦続形 IIR フィルタ用ライブラリ. Library for cascade structure IIR filter.
Dependents: Demo_IIR_Filter UIT2_VariableIIR_LPF UIT2_VariableIIR_LPFHPF
IIR_Cascade.hpp@0:d2f279439aaf, 2015-09-03 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Sep 03 00:42:10 2015 +0000
- Revision:
- 0:d2f279439aaf
- Child:
- 1:69a8b728e8d2
1
Who changed what in which revision?
User | Revision | Line number | New 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 |