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

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers FirFastSymmetry.hpp Source File

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