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

Dependencies:   mbed

Revision:
1:30d9fb51dec1
Child:
2:4bec6b2be809
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDR_Library/FirFastSymmetry.hpp	Mon Sep 23 07:32:10 2019 +0000
@@ -0,0 +1,55 @@
+//-----------------------------------------------------------------
+// SDR で使う FIR フィルタ,係数:対称
+//      ● 処理の高速化のため,入力信号のバッファのサイズを 256,データを指す
+//        インデックスを uint8_t 型としてリング・バッファを実現している.
+//      ● さらに,係数が対称であることを利用して,先に x[k] + x[ORDER-k] と
+//        いう加算を行ってから,係数の乗算を行うようにした.
+//
+// 2019/03/03, Copyright (c) 2019 MIKAMI, Naoki
+//-----------------------------------------------------------------
+
+#include "mbed.h"
+
+#ifndef FIR_DIRECT_FAST_SYMMETRY_HPP
+#define FIR_DIRECT_FAST_SYMMETRY_HPP
+namespace Mikami
+{
+    class FirFastSymmetry
+    {
+    public:
+        // コンストラクタ
+        //      order   フィルタの次数
+        //      hk[]    フィルタの係数
+        FirFastSymmetry(int order, const float hk[])
+            : ORDER_(order), hm_(hk), index_(255)
+        {   for (int k=0; k<SIZE_; k++) un_[k] = 0; }
+
+        // 入力信号をバッファへ書き込む
+        void Store(float xIn) { un_[++index_] = xIn; }
+
+        // FIR フィルタの実行
+        float Execute()
+        {
+            __IO uint8_t ptrM = index_;
+            __IO uint8_t ptrP = index_ - ORDER_;
+            float acc = 0;
+            for (int k=0; k<ORDER_/2; k++)
+                acc += hm_[k]*(un_[ptrM--] + un_[ptrP++]);
+            acc += hm_[ORDER_/2]*un_[ptrM];
+            return acc;
+        }
+
+    private:
+        static const int SIZE_ = 256;   // 入力信号のバッファのサイズ
+        const int ORDER_;               // フィルタの次数
+        const float *const hm_;         // フィルタの係数
+        float un_[SIZE_];               // 入力信号のバッファ
+        __IO uint8_t index_;            // 最新の入力信号を示すインデックス
+
+        // コピー・コンストラクタ禁止のため
+        FirFastSymmetry(const FirFastSymmetry&);
+        // 代入演算子禁止のため
+        FirFastSymmetry& operator=(const FirFastSymmetry&);
+    };
+}
+#endif  // FIR_DIRECT_FAST_SYMMETRY_HPP