不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
SDR_Library/FirFastSymmetry.hpp
- Committer:
- MikamiUitOpen
- Date:
- 2019-09-23
- Revision:
- 1:30d9fb51dec1
- Child:
- 2:4bec6b2be809
File content as of revision 1:30d9fb51dec1:
//----------------------------------------------------------------- // SDR で使う FIR フィルタ,係数:対称 // ● 処理の高速化のため,入力信号のバッファのサイズを 256,データを指す // インデックスを uint8_t 型としてリング・バッファを実現している. // ● さらに,係数が対称であることを利用して,先に x[k] + x[ORDER-k] と // いう加算を行ってから,係数の乗算を行うようにした. // // 2019/03/03, Copyright (c) 2019 MIKAMI, Naoki //----------------------------------------------------------------- #include "mbed.h" #ifndef FIR_DIRECT_FAST_SYMMETRY_HPP #define FIR_DIRECT_FAST_SYMMETRY_HPP namespace Mikami { class FirFastSymmetry { public: // コンストラクタ // order フィルタの次数 // hk[] フィルタの係数 FirFastSymmetry(int order, const float hk[]) : ORDER_(order), hm_(hk), index_(255) { for (int k=0; k<SIZE_; k++) un_[k] = 0; } // 入力信号をバッファへ書き込む void Store(float xIn) { un_[++index_] = xIn; } // FIR フィルタの実行 float Execute() { __IO uint8_t ptrM = index_; __IO uint8_t ptrP = index_ - ORDER_; float acc = 0; for (int k=0; k<ORDER_/2; k++) acc += hm_[k]*(un_[ptrM--] + un_[ptrP++]); acc += hm_[ORDER_/2]*un_[ptrM]; return acc; } private: static const int SIZE_ = 256; // 入力信号のバッファのサイズ const int ORDER_; // フィルタの次数 const float *const hm_; // フィルタの係数 float un_[SIZE_]; // 入力信号のバッファ __IO uint8_t index_; // 最新の入力信号を示すインデックス // コピー・コンストラクタ禁止のため FirFastSymmetry(const FirFastSymmetry&); // 代入演算子禁止のため FirFastSymmetry& operator=(const FirFastSymmetry&); }; } #endif // FIR_DIRECT_FAST_SYMMETRY_HPP