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

Dependents:   TrG_FFT_Analyzer Demo_Window TrG_Spectrogram

Files at this revision

API Documentation at this revision

Comitter:
MikamiUitOpen
Date:
Sun May 23 06:25:26 2021 +0000
Child:
1:d8673bf6f89c
Commit message:
1

Changed in this revision

Blackman.hpp Show annotated file Show diff for this revision Revisions of this file
Hamming.hpp Show annotated file Show diff for this revision Revisions of this file
Hanning.hpp Show annotated file Show diff for this revision Revisions of this file
WindowBase.hpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Blackman.hpp	Sun May 23 06:25:26 2021 +0000
@@ -0,0 +1,38 @@
+//-------------------------------------------------------------------
+//  Blackman 窓による窓掛け
+//      ゼロ詰め(zero-padding)の機能を持つ
+//
+//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//-------------------------------------------------------------------
+
+#ifndef BLACKMAN_WINDOW_HPP
+#define BLACKMAN_WINDOW_HPP
+
+#include "WindowBase.hpp"
+
+namespace Mikami
+{
+    class BlackmanWindow : public WindowBase
+    {
+    public:
+        // コンストラクタ
+        BlackmanWindow(uint16_t nFft, uint16_t nData)
+                : WindowBase(nFft, nData) { Generate(nData); }
+        BlackmanWindow(uint16_t nFft)
+                : WindowBase(nFft, nFft) { Generate(nFft); }
+
+    private:
+        // 窓関数を生成
+        virtual void Generate(uint16_t nData)
+        {
+            const float PI2L = 6.283185f/(float)nData;
+            for (int k=0; k<nData; k++)
+                Set(k, 0.42f - 0.5f*cosf(k*PI2L) + 0.08f*cosf(k*2*PI2L));
+        }
+
+        // コピー・コンストラクタおよび代入演算子の禁止のため
+        BlackmanWindow(const BlackmanWindow& );
+        BlackmanWindow& operator=(const BlackmanWindow& );
+    };
+}
+#endif  // BLACKMAN_WINDOW_HPP
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Hamming.hpp	Sun May 23 06:25:26 2021 +0000
@@ -0,0 +1,38 @@
+//-------------------------------------------------------------------
+//  Hamming 窓による窓掛け
+//      ゼロ詰め(zero-padding)の機能を持つ
+//
+//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//-------------------------------------------------------------------
+
+#ifndef HAMMING_WINDOW_HPP
+#define HAMMING_WINDOW_HPP
+
+#include "WindowBase.hpp"
+
+namespace Mikami
+{
+    class HammingWindow : public WindowBase
+    {
+    public:
+        // コンストラクタ
+        HammingWindow(uint16_t nFft, uint16_t nData)
+                : WindowBase(nFft, nData) { Generate(nData); }
+        HammingWindow(uint16_t nFft)
+                : WindowBase(nFft, nFft) { Generate(nFft); }
+
+    private:
+        // 窓関数を生成
+        virtual void Generate(uint16_t nData)
+        {
+            const float PI2L = 6.283185f/(float)nData;
+            for (int k=0; k<nData; k++)
+                Set(k, 0.54f - 0.46f*cosf(k*PI2L));
+        }
+
+        // コピー・コンストラクタおよび代入演算子の禁止のため
+        HammingWindow(const HammingWindow& );
+        HammingWindow& operator=(const HammingWindow& );
+    };
+}
+#endif  // HAMMING_WINDOW_HPP
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Hanning.hpp	Sun May 23 06:25:26 2021 +0000
@@ -0,0 +1,38 @@
+//-------------------------------------------------------------------
+//  Hanning 窓による窓掛け
+//      ゼロ詰め(zero-padding)の機能を持つ
+//
+//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//-------------------------------------------------------------------
+
+#ifndef HANNING_WINDOW_HPP
+#define HANNING_WINDOW_HPP
+
+#include "WindowBase.hpp"
+
+namespace Mikami
+{
+    class HanningWindow : public WindowBase
+    {
+    public:
+        // コンストラクタ
+        HanningWindow(uint16_t nFft, uint16_t nData)
+                : WindowBase(nFft, nData) { Generate(nData); }
+        HanningWindow(uint16_t nFft)
+                : WindowBase(nFft, nFft) { Generate(nFft); }
+
+    private:
+        // 窓関数を生成
+        virtual void Generate(uint16_t nData)
+        {
+            const float PI2L = 6.283185f/(float)nData;
+            for (int k=0; k<nData; k++)
+                Set(k, 0.5f - 0.5f*cosf(k*PI2L));
+        }
+
+        // コピー・コンストラクタおよび代入演算子の禁止のため
+        HanningWindow(const HanningWindow& );
+        HanningWindow& operator=(const HanningWindow& );
+    };
+}
+#endif  // HANNING_WINDOW_HPP
\ No newline at end of file
--- /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