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

Dependencies:   mbed

Committer:
MikamiUitOpen
Date:
Wed Dec 01 00:37:44 2021 +0000
Revision:
3:878a48f15e89
Parent:
2:4bec6b2be809
4

Who changed what in which revision?

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