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

Dependents:   TrG_FFT_Analyzer Demo_Window TrG_Spectrogram

Committer:
MikamiUitOpen
Date:
Sun May 23 06:25:26 2021 +0000
Revision:
0:823e9a4ab223
Child:
1:d8673bf6f89c
1

Who changed what in which revision?

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