HanningWindow, HammingWindow, BlackmanWindow の各クラス. このライブラリを登録した際のプログラム: Demo_Window

Dependents:   TrG_FFT_Analyzer Demo_Window TrG_Spectrogram

Committer:
MikamiUitOpen
Date:
Wed Nov 10 05:47:10 2021 +0000
Revision:
1:d8673bf6f89c
Parent:
0:823e9a4ab223
2

Who changed what in which revision?

UserRevisionLine numberNew 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