HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window
Dependents: TrG_FFT_Analyzer Demo_Window TrG_Spectrogram
Diff: WindowBase.hpp
- 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