HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window
Dependents: TrG_FFT_Analyzer Demo_Window TrG_Spectrogram
WindowBase.hpp@0:823e9a4ab223, 2021-05-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun May 23 06:25:26 2021 +0000
- Revision:
- 0:823e9a4ab223
- Child:
- 1:d8673bf6f89c
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:823e9a4ab223 | 1 | //------------------------------------------------------------------- |
MikamiUitOpen | 0:823e9a4ab223 | 2 | // 窓掛け処理の抽象基底クラス |
MikamiUitOpen | 0:823e9a4ab223 | 3 | // ゼロ詰め(zero-padding)の機能を持つ |
MikamiUitOpen | 0:823e9a4ab223 | 4 | // |
MikamiUitOpen | 0:823e9a4ab223 | 5 | // 2021/05/22, 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 "mbed.h" |
MikamiUitOpen | 0:823e9a4ab223 | 12 | #include "Array.hpp" |
MikamiUitOpen | 0:823e9a4ab223 | 13 | |
MikamiUitOpen | 0:823e9a4ab223 | 14 | namespace Mikami |
MikamiUitOpen | 0:823e9a4ab223 | 15 | { |
MikamiUitOpen | 0:823e9a4ab223 | 16 | class WindowBase |
MikamiUitOpen | 0:823e9a4ab223 | 17 | { |
MikamiUitOpen | 0:823e9a4ab223 | 18 | public: |
MikamiUitOpen | 0:823e9a4ab223 | 19 | // コンストラクタ |
MikamiUitOpen | 0:823e9a4ab223 | 20 | WindowBase(uint16_t nFft, uint16_t nData) |
MikamiUitOpen | 0:823e9a4ab223 | 21 | : NFFT_(nFft), N_(nData), y_(nFft), w_(nData) |
MikamiUitOpen | 0:823e9a4ab223 | 22 | { IsOk(); } |
MikamiUitOpen | 0:823e9a4ab223 | 23 | |
MikamiUitOpen | 0:823e9a4ab223 | 24 | WindowBase(uint16_t nFft) |
MikamiUitOpen | 0:823e9a4ab223 | 25 | : NFFT_(nFft), N_(nFft), y_(nFft), w_(nFft) |
MikamiUitOpen | 0:823e9a4ab223 | 26 | { IsOk(); } |
MikamiUitOpen | 0:823e9a4ab223 | 27 | |
MikamiUitOpen | 0:823e9a4ab223 | 28 | // 窓掛けを実行 |
MikamiUitOpen | 0:823e9a4ab223 | 29 | Array<float>& Execute(const Array<float> &x) |
MikamiUitOpen | 0:823e9a4ab223 | 30 | { |
MikamiUitOpen | 0:823e9a4ab223 | 31 | for (int n=0; n<N_; n++) y_[n] = x[n]*w_[n]; |
MikamiUitOpen | 0:823e9a4ab223 | 32 | for (int n=N_; n<NFFT_; n++) y_[n] = 0.0f; |
MikamiUitOpen | 0:823e9a4ab223 | 33 | return y_; |
MikamiUitOpen | 0:823e9a4ab223 | 34 | } |
MikamiUitOpen | 0:823e9a4ab223 | 35 | |
MikamiUitOpen | 0:823e9a4ab223 | 36 | protected: |
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 | 0:823e9a4ab223 | 46 | void IsOk() |
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 |