CQ出版社セミナ,2021/12/07開催「実習・C++言語によるArmマイコンのプログラミング」で使うプログラム.
Dependencies: Array_Matrix mbed SerialTxRxIntr UIT_FFT_Real
MyFFT_Analyzer/FFT_Analyzer.cpp@0:a80f730d32a8, 2020-01-15 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Jan 15 12:43:11 2020 +0000
- Revision:
- 0:a80f730d32a8
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:a80f730d32a8 | 1 | //------------------------------------------------------- |
MikamiUitOpen | 0:a80f730d32a8 | 2 | // FFT を使ってスペクトル解析を行うクラス |
MikamiUitOpen | 0:a80f730d32a8 | 3 | // |
MikamiUitOpen | 0:a80f730d32a8 | 4 | // 2019/11/22, Copyright (c) 2019 MIKAMI, Naoki |
MikamiUitOpen | 0:a80f730d32a8 | 5 | //------------------------------------------------------- |
MikamiUitOpen | 0:a80f730d32a8 | 6 | |
MikamiUitOpen | 0:a80f730d32a8 | 7 | #include "FFT_Analyzer.hpp" |
MikamiUitOpen | 0:a80f730d32a8 | 8 | |
MikamiUitOpen | 0:a80f730d32a8 | 9 | namespace Mikami |
MikamiUitOpen | 0:a80f730d32a8 | 10 | { |
MikamiUitOpen | 0:a80f730d32a8 | 11 | FftAnalyzer::FftAnalyzer(int nFft) |
MikamiUitOpen | 0:a80f730d32a8 | 12 | : N_FFT_(nFft), fft_(nFft), wHm_(nFft, nFft), |
MikamiUitOpen | 0:a80f730d32a8 | 13 | xData_(nFft), wData_(nFft), yFft_(nFft/2+1) {} |
MikamiUitOpen | 0:a80f730d32a8 | 14 | |
MikamiUitOpen | 0:a80f730d32a8 | 15 | void FftAnalyzer::Execute(const Array<float> &xn, Array<float> &db) |
MikamiUitOpen | 0:a80f730d32a8 | 16 | { |
MikamiUitOpen | 0:a80f730d32a8 | 17 | xData_ = xn; // データを作業領域にコピー |
MikamiUitOpen | 0:a80f730d32a8 | 18 | |
MikamiUitOpen | 0:a80f730d32a8 | 19 | // 直流分を除去 |
MikamiUitOpen | 0:a80f730d32a8 | 20 | float sum = 0; |
MikamiUitOpen | 0:a80f730d32a8 | 21 | for (int n=0; n<N_FFT_; n++) sum = sum + xData_[n]; |
MikamiUitOpen | 0:a80f730d32a8 | 22 | float ave = sum/N_FFT_; |
MikamiUitOpen | 0:a80f730d32a8 | 23 | for (int n=0; n<N_FFT_; n++) xData_[n] = xData_[n] - ave; |
MikamiUitOpen | 0:a80f730d32a8 | 24 | |
MikamiUitOpen | 0:a80f730d32a8 | 25 | wHm_.Execute(xData_, wData_); // 窓掛け |
MikamiUitOpen | 0:a80f730d32a8 | 26 | |
MikamiUitOpen | 0:a80f730d32a8 | 27 | fft_.Execute(wData_, yFft_); // FFT の実行 |
MikamiUitOpen | 0:a80f730d32a8 | 28 | |
MikamiUitOpen | 0:a80f730d32a8 | 29 | for (int n=0; n<=N_FFT_/2; n++) // dB 値に変換 |
MikamiUitOpen | 0:a80f730d32a8 | 30 | { |
MikamiUitOpen | 0:a80f730d32a8 | 31 | float norm = Norm(yFft_[n]); |
MikamiUitOpen | 0:a80f730d32a8 | 32 | db[n] = (norm > 0) ? 10.0f*log10f(norm) : -40.0f; |
MikamiUitOpen | 0:a80f730d32a8 | 33 | } |
MikamiUitOpen | 0:a80f730d32a8 | 34 | } |
MikamiUitOpen | 0:a80f730d32a8 | 35 | } |
MikamiUitOpen | 0:a80f730d32a8 | 36 |