AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年5月号に掲載

Dependencies:   mbed

Committer:
MikamiUitOpen
Date:
Wed Mar 03 01:20:09 2021 +0000
Revision:
1:32d6e3f7df30
Parent:
0:7a653530c8ce
2

Who changed what in which revision?

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