不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
Embed:
(wiki syntax)
Show/hide line numbers
FirFastSymmetry.hpp
00001 //---------------------------------------------------------------------------- 00002 // SDR で使う FIR フィルタ,係数:対称 00003 // ● 処理の高速化のため,入力信号のバッファのサイズを 256,データを指す 00004 // インデックスを uint8_t 型としてリング・バッファを実現している. 00005 // ● さらに,係数が対称であることを利用して,先に x[k] + x[ORDER-k] と 00006 // いう加算を行ってから,係数の乗算を行うようにした. 00007 // 00008 // 2020/07/28, Copyright (c) 2020 MIKAMI, Naoki 00009 //---------------------------------------------------------------------------- 00010 00011 #include "mbed.h" 00012 00013 #ifndef FIR_DIRECT_FAST_SYMMETRY_HPP 00014 #define FIR_DIRECT_FAST_SYMMETRY_HPP 00015 namespace Mikami 00016 { 00017 class FirFastSymmetry 00018 { 00019 public: 00020 // コンストラクタ 00021 // order フィルタの次数,次数は偶数とする 00022 // hk[] フィルタの係数 00023 FirFastSymmetry(uint8_t order, const float hk[]) 00024 : ORDER_(order), ORDER2_(order/2), hm_(hk), index_(255) 00025 { for (int k=0; k<SIZE_; k++) un_[k] = 0; } 00026 00027 // 入力信号をバッファへ書き込む 00028 void Store(float xIn) { un_[++index_] = xIn; } 00029 00030 // FIR フィルタの実行 00031 float Execute() 00032 { 00033 __IO uint8_t ptrM = index_; 00034 __IO uint8_t ptrP = index_ - ORDER_; 00035 float acc = 0; 00036 for (int k=0; k<ORDER2_; k++) 00037 acc += hm_[k]*(un_[ptrM--] + un_[ptrP++]); 00038 acc += hm_[ORDER2_]*un_[ptrM]; 00039 return acc; 00040 } 00041 00042 private: 00043 static const int SIZE_ = 256; // 入力信号のバッファのサイズ 00044 const uint8_t ORDER_; // フィルタの次数 00045 const uint8_t ORDER2_; // フィルタの次数の半分 00046 const float *const hm_; // フィルタの係数 00047 float un_[SIZE_]; // 入力信号のバッファ 00048 __IO uint8_t index_; // 最新の入力信号を示すインデックス 00049 00050 // コピー・コンストラクタ,代入演算子の禁止のため 00051 FirFastSymmetry(const FirFastSymmetry&); 00052 FirFastSymmetry& operator=(const FirFastSymmetry&); 00053 }; 00054 } 00055 #endif // FIR_DIRECT_FAST_SYMMETRY_HPP
Generated on Fri Jul 22 2022 13:23:29 by 1.7.2