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:
Wed Nov 10 05:47:10 2021 +0000
Parent:
0:823e9a4ab223
Commit message:
2

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
--- a/Blackman.hpp	Sun May 23 06:25:26 2021 +0000
+++ b/Blackman.hpp	Wed Nov 10 05:47:10 2021 +0000
@@ -2,7 +2,7 @@
 //  Blackman 窓による窓掛け
 //      ゼロ詰め(zero-padding)の機能を持つ
 //
-//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//  2021/11/10, Copyright (c) 2021 MIKAMI, Naoki
 //-------------------------------------------------------------------
 
 #ifndef BLACKMAN_WINDOW_HPP
@@ -17,17 +17,17 @@
     public:
         // コンストラクタ
         BlackmanWindow(uint16_t nFft, uint16_t nData)
-                : WindowBase(nFft, nData) { Generate(nData); }
-        BlackmanWindow(uint16_t nFft)
-                : WindowBase(nFft, nFft) { Generate(nFft); }
+            : WindowBase(nFft, nData) { Generate(nData); }
+        explicit BlackmanWindow(uint16_t nFft)
+            : WindowBase(nFft, nFft) { Generate(nFft); }
 
     private:
         // 窓関数を生成
         virtual void Generate(uint16_t nData)
         {
-            const float PI2L = 6.283185f/(float)nData;
+            // k = 0 で値が 0 になるようにするため,計算の順番を変えている
             for (int k=0; k<nData; k++)
-                Set(k, 0.42f - 0.5f*cosf(k*PI2L) + 0.08f*cosf(k*2*PI2L));
+                Set(k, 0.42f + 0.08f*cosf(2*k*PI2L_) - 0.5f*cosf(k*PI2L_));
         }
 
         // コピー・コンストラクタおよび代入演算子の禁止のため
--- a/Hamming.hpp	Sun May 23 06:25:26 2021 +0000
+++ b/Hamming.hpp	Wed Nov 10 05:47:10 2021 +0000
@@ -2,7 +2,7 @@
 //  Hamming 窓による窓掛け
 //      ゼロ詰め(zero-padding)の機能を持つ
 //
-//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//  2021/11/10, Copyright (c) 2021 MIKAMI, Naoki
 //-------------------------------------------------------------------
 
 #ifndef HAMMING_WINDOW_HPP
@@ -17,17 +17,16 @@
     public:
         // コンストラクタ
         HammingWindow(uint16_t nFft, uint16_t nData)
-                : WindowBase(nFft, nData) { Generate(nData); }
-        HammingWindow(uint16_t nFft)
-                : WindowBase(nFft, nFft) { Generate(nFft); }
+            : WindowBase(nFft, nData) { Generate(nData); }
+        explicit 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));
+                Set(k, 0.54f - 0.46f*cosf(k*PI2L_));
         }
 
         // コピー・コンストラクタおよび代入演算子の禁止のため
--- a/Hanning.hpp	Sun May 23 06:25:26 2021 +0000
+++ b/Hanning.hpp	Wed Nov 10 05:47:10 2021 +0000
@@ -2,7 +2,7 @@
 //  Hanning 窓による窓掛け
 //      ゼロ詰め(zero-padding)の機能を持つ
 //
-//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//  2021/11/10, Copyright (c) 2021 MIKAMI, Naoki
 //-------------------------------------------------------------------
 
 #ifndef HANNING_WINDOW_HPP
@@ -17,17 +17,16 @@
     public:
         // コンストラクタ
         HanningWindow(uint16_t nFft, uint16_t nData)
-                : WindowBase(nFft, nData) { Generate(nData); }
-        HanningWindow(uint16_t nFft)
-                : WindowBase(nFft, nFft) { Generate(nFft); }
+            : WindowBase(nFft, nData) { Generate(nData); }
+        explicit 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));
+                Set(k, 0.5f - 0.5f*cosf(k*PI2L_));
         }
 
         // コピー・コンストラクタおよび代入演算子の禁止のため
--- a/WindowBase.hpp	Sun May 23 06:25:26 2021 +0000
+++ b/WindowBase.hpp	Wed Nov 10 05:47:10 2021 +0000
@@ -1,14 +1,13 @@
 //-------------------------------------------------------------------
-//  窓掛け処理の抽象基底クラス
+//  FFT で使う場合の窓掛け処理の抽象基底クラス
 //      ゼロ詰め(zero-padding)の機能を持つ
 //
-//  2021/05/22, Copyright (c) 2021 MIKAMI, Naoki
+//  2021/11/10, Copyright (c) 2021 MIKAMI, Naoki
 //-------------------------------------------------------------------
 
 #ifndef WINDOW_BASE_HPP
 #define WINDOW_BASE_HPP
 
-#include "mbed.h"
 #include "Array.hpp"
 
 namespace Mikami
@@ -17,23 +16,24 @@
     {
     public:
         // コンストラクタ
+        //      nFft    使用する FFT の点数
+        //      nData   使用するデータ数,nData <= fFft
         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(); }
+            : PI2L_(6.283185f/nData), NFFT_(nFft), N_(nData),
+              y_(nFft), w_(nData) { 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:
+        const float PI2L_;      // 窓関数のデータを発生する計算で使用
+        // 窓関数のデータを設定する
         void Set(int n, float win) { w_[n] = win; }
 
     private:
@@ -43,7 +43,7 @@
         Array<float> w_;        // 窓関数のデータ
  
         // コンストラクタの引数をチェックする
-        void IsOk()
+        void IsOk() const
         {
             // nFft が2のべき乗であることをチェックする
             // __clz(): リーディング 0 の数を取得する命令に対応