CQ出版社セミナ,2021/12/07開催「実習・C++言語によるArmマイコンのプログラミング」で使うプログラム.

Dependencies:   Array_Matrix mbed SerialTxRxIntr UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Thu Apr 02 01:12:34 2020 +0000
Revision:
5:5e55a5f440c0
Parent:
0:a80f730d32a8
6

Who changed what in which revision?

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