AM中波放送用SDR.CICフィルタと通常のFIRフィルタを組み合わせて使用.CQ出版社「トランジスタ技術」誌に掲載予定

Dependencies:   mbed

Committer:
tza
Date:
Sat Jul 31 09:11:29 2021 +0000
Revision:
1:ca43ee5ea802
Parent:
0:9c28f5905a1a
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:9c28f5905a1a 1 //----------------------------------------------------------------------------
MikamiUitOpen 0:9c28f5905a1a 2 // SDR で使う FIR フィルタ,係数:対称
MikamiUitOpen 0:9c28f5905a1a 3 // ● 処理の高速化のため,入力信号のバッファのサイズを 256,データを指す
MikamiUitOpen 0:9c28f5905a1a 4 // インデックスを uint8_t 型としてリング・バッファを実現している.
MikamiUitOpen 0:9c28f5905a1a 5 // ● さらに,係数が対称であることを利用して,先に x[k] + x[ORDER-k] と
MikamiUitOpen 0:9c28f5905a1a 6 // いう加算を行ってから,係数の乗算を行うようにした.
MikamiUitOpen 0:9c28f5905a1a 7 //
MikamiUitOpen 0:9c28f5905a1a 8 // 2020/07/28, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:9c28f5905a1a 9 //----------------------------------------------------------------------------
MikamiUitOpen 0:9c28f5905a1a 10
MikamiUitOpen 0:9c28f5905a1a 11 #include "mbed.h"
MikamiUitOpen 0:9c28f5905a1a 12
MikamiUitOpen 0:9c28f5905a1a 13 #ifndef FIR_DIRECT_FAST_SYMMETRY_HPP
MikamiUitOpen 0:9c28f5905a1a 14 #define FIR_DIRECT_FAST_SYMMETRY_HPP
MikamiUitOpen 0:9c28f5905a1a 15 namespace Mikami
MikamiUitOpen 0:9c28f5905a1a 16 {
MikamiUitOpen 0:9c28f5905a1a 17 class FirFastSymmetry
MikamiUitOpen 0:9c28f5905a1a 18 {
MikamiUitOpen 0:9c28f5905a1a 19 public:
MikamiUitOpen 0:9c28f5905a1a 20 // コンストラクタ
MikamiUitOpen 0:9c28f5905a1a 21 // order フィルタの次数,次数は偶数とする
MikamiUitOpen 0:9c28f5905a1a 22 // hk[] フィルタの係数
MikamiUitOpen 0:9c28f5905a1a 23 FirFastSymmetry(uint8_t order, const float hk[])
MikamiUitOpen 0:9c28f5905a1a 24 : ORDER_(order), ORDER2_(order/2), hm_(hk), index_(255)
MikamiUitOpen 0:9c28f5905a1a 25 { for (int k=0; k<SIZE_; k++) un_[k] = 0; }
MikamiUitOpen 0:9c28f5905a1a 26
MikamiUitOpen 0:9c28f5905a1a 27 // 入力信号をバッファへ書き込む
MikamiUitOpen 0:9c28f5905a1a 28 void Store(float xIn) { un_[++index_] = xIn; }
MikamiUitOpen 0:9c28f5905a1a 29
MikamiUitOpen 0:9c28f5905a1a 30 // FIR フィルタの実行
MikamiUitOpen 0:9c28f5905a1a 31 float Execute()
MikamiUitOpen 0:9c28f5905a1a 32 {
MikamiUitOpen 0:9c28f5905a1a 33 __IO uint8_t ptrM = index_;
MikamiUitOpen 0:9c28f5905a1a 34 __IO uint8_t ptrP = index_ - ORDER_;
MikamiUitOpen 0:9c28f5905a1a 35 float acc = 0;
MikamiUitOpen 0:9c28f5905a1a 36 for (int k=0; k<ORDER2_; k++)
MikamiUitOpen 0:9c28f5905a1a 37 acc += hm_[k]*(un_[ptrM--] + un_[ptrP++]);
MikamiUitOpen 0:9c28f5905a1a 38 acc += hm_[ORDER2_]*un_[ptrM];
MikamiUitOpen 0:9c28f5905a1a 39 return acc;
MikamiUitOpen 0:9c28f5905a1a 40 }
MikamiUitOpen 0:9c28f5905a1a 41
MikamiUitOpen 0:9c28f5905a1a 42 private:
MikamiUitOpen 0:9c28f5905a1a 43 static const int SIZE_ = 256; // 入力信号のバッファのサイズ
MikamiUitOpen 0:9c28f5905a1a 44 const uint8_t ORDER_; // フィルタの次数
MikamiUitOpen 0:9c28f5905a1a 45 const uint8_t ORDER2_; // フィルタの次数の半分
MikamiUitOpen 0:9c28f5905a1a 46 const float *const hm_; // フィルタの係数
MikamiUitOpen 0:9c28f5905a1a 47 float un_[SIZE_]; // 入力信号のバッファ
MikamiUitOpen 0:9c28f5905a1a 48 __IO uint8_t index_; // 最新の入力信号を示すインデックス
MikamiUitOpen 0:9c28f5905a1a 49
MikamiUitOpen 0:9c28f5905a1a 50 // コピー・コンストラクタ,代入演算子の禁止のため
MikamiUitOpen 0:9c28f5905a1a 51 FirFastSymmetry(const FirFastSymmetry&);
MikamiUitOpen 0:9c28f5905a1a 52 FirFastSymmetry& operator=(const FirFastSymmetry&);
MikamiUitOpen 0:9c28f5905a1a 53 };
MikamiUitOpen 0:9c28f5905a1a 54 }
MikamiUitOpen 0:9c28f5905a1a 55 #endif // FIR_DIRECT_FAST_SYMMETRY_HPP