HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window
Dependents: TrG_FFT_Analyzer Demo_Window TrG_Spectrogram
WindowBase.hpp@1:d8673bf6f89c, 2021-11-10 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Nov 10 05:47:10 2021 +0000
- Revision:
- 1:d8673bf6f89c
- Parent:
- 0:823e9a4ab223
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:823e9a4ab223 | 1 | //------------------------------------------------------------------- |
MikamiUitOpen | 1:d8673bf6f89c | 2 | // FFT で使う場合の窓掛け処理の抽象基底クラス |
MikamiUitOpen | 0:823e9a4ab223 | 3 | // ゼロ詰め(zero-padding)の機能を持つ |
MikamiUitOpen | 0:823e9a4ab223 | 4 | // |
MikamiUitOpen | 1:d8673bf6f89c | 5 | // 2021/11/10, Copyright (c) 2021 MIKAMI, Naoki |
MikamiUitOpen | 0:823e9a4ab223 | 6 | //------------------------------------------------------------------- |
MikamiUitOpen | 0:823e9a4ab223 | 7 | |
MikamiUitOpen | 0:823e9a4ab223 | 8 | #ifndef WINDOW_BASE_HPP |
MikamiUitOpen | 0:823e9a4ab223 | 9 | #define WINDOW_BASE_HPP |
MikamiUitOpen | 0:823e9a4ab223 | 10 | |
MikamiUitOpen | 0:823e9a4ab223 | 11 | #include "Array.hpp" |
MikamiUitOpen | 0:823e9a4ab223 | 12 | |
MikamiUitOpen | 0:823e9a4ab223 | 13 | namespace Mikami |
MikamiUitOpen | 0:823e9a4ab223 | 14 | { |
MikamiUitOpen | 0:823e9a4ab223 | 15 | class WindowBase |
MikamiUitOpen | 0:823e9a4ab223 | 16 | { |
MikamiUitOpen | 0:823e9a4ab223 | 17 | public: |
MikamiUitOpen | 0:823e9a4ab223 | 18 | // コンストラクタ |
MikamiUitOpen | 1:d8673bf6f89c | 19 | // nFft 使用する FFT の点数 |
MikamiUitOpen | 1:d8673bf6f89c | 20 | // nData 使用するデータ数,nData <= fFft |
MikamiUitOpen | 0:823e9a4ab223 | 21 | WindowBase(uint16_t nFft, uint16_t nData) |
MikamiUitOpen | 1:d8673bf6f89c | 22 | : PI2L_(6.283185f/nData), NFFT_(nFft), N_(nData), |
MikamiUitOpen | 1:d8673bf6f89c | 23 | y_(nFft), w_(nData) { IsOk(); } |
MikamiUitOpen | 0:823e9a4ab223 | 24 | |
MikamiUitOpen | 0:823e9a4ab223 | 25 | // 窓掛けを実行 |
MikamiUitOpen | 0:823e9a4ab223 | 26 | Array<float>& Execute(const Array<float> &x) |
MikamiUitOpen | 0:823e9a4ab223 | 27 | { |
MikamiUitOpen | 0:823e9a4ab223 | 28 | for (int n=0; n<N_; n++) y_[n] = x[n]*w_[n]; |
MikamiUitOpen | 1:d8673bf6f89c | 29 | // ゼロ詰めの処理 |
MikamiUitOpen | 0:823e9a4ab223 | 30 | for (int n=N_; n<NFFT_; n++) y_[n] = 0.0f; |
MikamiUitOpen | 0:823e9a4ab223 | 31 | return y_; |
MikamiUitOpen | 0:823e9a4ab223 | 32 | } |
MikamiUitOpen | 0:823e9a4ab223 | 33 | |
MikamiUitOpen | 0:823e9a4ab223 | 34 | protected: |
MikamiUitOpen | 1:d8673bf6f89c | 35 | const float PI2L_; // 窓関数のデータを発生する計算で使用 |
MikamiUitOpen | 1:d8673bf6f89c | 36 | // 窓関数のデータを設定する |
MikamiUitOpen | 0:823e9a4ab223 | 37 | void Set(int n, float win) { w_[n] = win; } |
MikamiUitOpen | 0:823e9a4ab223 | 38 | |
MikamiUitOpen | 0:823e9a4ab223 | 39 | private: |
MikamiUitOpen | 0:823e9a4ab223 | 40 | const uint16_t NFFT_; // この窓掛けを使う FFT の点数 |
MikamiUitOpen | 0:823e9a4ab223 | 41 | const uint16_t N_; // 解析に使うデータ数 |
MikamiUitOpen | 0:823e9a4ab223 | 42 | Array<float> y_; // 窓掛けされたデータ |
MikamiUitOpen | 0:823e9a4ab223 | 43 | Array<float> w_; // 窓関数のデータ |
MikamiUitOpen | 0:823e9a4ab223 | 44 | |
MikamiUitOpen | 0:823e9a4ab223 | 45 | // コンストラクタの引数をチェックする |
MikamiUitOpen | 1:d8673bf6f89c | 46 | void IsOk() const |
MikamiUitOpen | 0:823e9a4ab223 | 47 | { |
MikamiUitOpen | 0:823e9a4ab223 | 48 | // nFft が2のべき乗であることをチェックする |
MikamiUitOpen | 0:823e9a4ab223 | 49 | // __clz(): リーディング 0 の数を取得する命令に対応 |
MikamiUitOpen | 0:823e9a4ab223 | 50 | uint32_t shifted = NFFT_ << (__clz(NFFT_)+1); |
MikamiUitOpen | 0:823e9a4ab223 | 51 | MBED_ASSERT(shifted == 0); |
MikamiUitOpen | 0:823e9a4ab223 | 52 | |
MikamiUitOpen | 0:823e9a4ab223 | 53 | // nData <= nFft であることをチェックする |
MikamiUitOpen | 0:823e9a4ab223 | 54 | MBED_ASSERT(N_ <= NFFT_); |
MikamiUitOpen | 0:823e9a4ab223 | 55 | } |
MikamiUitOpen | 0:823e9a4ab223 | 56 | |
MikamiUitOpen | 0:823e9a4ab223 | 57 | // 窓関数を生成 |
MikamiUitOpen | 0:823e9a4ab223 | 58 | virtual void Generate(uint16_t nData) = 0; |
MikamiUitOpen | 0:823e9a4ab223 | 59 | |
MikamiUitOpen | 0:823e9a4ab223 | 60 | // コピー・コンストラクタおよび代入演算子の禁止のため |
MikamiUitOpen | 0:823e9a4ab223 | 61 | WindowBase(const WindowBase& ); |
MikamiUitOpen | 0:823e9a4ab223 | 62 | WindowBase& operator=(const WindowBase& ); |
MikamiUitOpen | 0:823e9a4ab223 | 63 | }; |
MikamiUitOpen | 0:823e9a4ab223 | 64 | } |
MikamiUitOpen | 0:823e9a4ab223 | 65 | #endif // WINDOW_BASE_HPP |