HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window

Dependents:   TrG_FFT_Analyzer Demo_Window TrG_Spectrogram

Revision:
0:823e9a4ab223
Child:
1:d8673bf6f89c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WindowBase.hpp	Sun May 23 06:25:26 2021 +0000
@@ -0,0 +1,65 @@
+//-------------------------------------------------------------------
+//  窓掛け処理の抽象基底クラス
+//      ゼロ詰め(zero-padding)の機能を持つ
+//
+//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//-------------------------------------------------------------------
+
+#ifndef WINDOW_BASE_HPP
+#define WINDOW_BASE_HPP
+
+#include "mbed.h"
+#include "Array.hpp"
+
+namespace Mikami
+{
+    class WindowBase
+    {
+    public:
+        // コンストラクタ
+        WindowBase(uint16_t nFft, uint16_t nData)
+                : NFFT_(nFft), N_(nData), y_(nFft), w_(nData)
+        { IsOk(); }
+
+        WindowBase(uint16_t nFft)
+                : NFFT_(nFft), N_(nFft), y_(nFft), w_(nFft)
+        { IsOk(); }
+
+        // 窓掛けを実行
+        Array<float>& Execute(const Array<float> &x)
+        {
+            for (int n=0; n<N_; n++) y_[n] = x[n]*w_[n];
+            for (int n=N_; n<NFFT_; n++) y_[n] = 0.0f;
+            return y_;
+        }
+
+    protected:
+        void Set(int n, float win) { w_[n] = win; }
+
+    private:
+        const uint16_t NFFT_;   // この窓掛けを使う FFT の点数
+        const uint16_t N_;      // 解析に使うデータ数
+        Array<float> y_;        // 窓掛けされたデータ
+        Array<float> w_;        // 窓関数のデータ
+ 
+        // コンストラクタの引数をチェックする
+        void IsOk()
+        {
+            // nFft が2のべき乗であることをチェックする
+            // __clz(): リーディング 0 の数を取得する命令に対応
+            uint32_t shifted = NFFT_ << (__clz(NFFT_)+1);
+            MBED_ASSERT(shifted == 0);
+            
+            // nData <= nFft であることをチェックする
+            MBED_ASSERT(N_ <= NFFT_);
+        }
+
+        // 窓関数を生成
+        virtual void Generate(uint16_t nData) = 0;
+
+        // コピー・コンストラクタおよび代入演算子の禁止のため
+        WindowBase(const WindowBase& );
+        WindowBase& operator=(const WindowBase& );
+    };
+}
+#endif  // WINDOW_BASE_HPP
\ No newline at end of file