HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window
Dependents: TrG_FFT_Analyzer Demo_Window TrG_Spectrogram
Revision 1:d8673bf6f89c, committed 2021-11-10
- Comitter:
- MikamiUitOpen
- Date:
- Wed Nov 10 05:47:10 2021 +0000
- Parent:
- 0:823e9a4ab223
- Commit message:
- 2
Changed in this revision
diff -r 823e9a4ab223 -r d8673bf6f89c Blackman.hpp --- 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_)); } // コピー・コンストラクタおよび代入演算子の禁止のため
diff -r 823e9a4ab223 -r d8673bf6f89c Hamming.hpp --- 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_)); } // コピー・コンストラクタおよび代入演算子の禁止のため
diff -r 823e9a4ab223 -r d8673bf6f89c Hanning.hpp --- 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_)); } // コピー・コンストラクタおよび代入演算子の禁止のため
diff -r 823e9a4ab223 -r d8673bf6f89c WindowBase.hpp --- 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 の数を取得する命令に対応