HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window
Dependents: TrG_FFT_Analyzer Demo_Window TrG_Spectrogram
Revision 0:823e9a4ab223, committed 2021-05-23
- Comitter:
- MikamiUitOpen
- Date:
- Sun May 23 06:25:26 2021 +0000
- Child:
- 1:d8673bf6f89c
- Commit message:
- 1
Changed in this revision
--- /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