スペクトログラム このプログラムの説明は,CQ出版社「トランジスタ技術」の2021年10月号から開始された連載記事「STM32マイコンではじめるPC計測」の中にあります.このプログラムといっしょに使うPC側のプログラムについても同誌を参照してください.

Dependencies:   Array_Matrix mbed SerialTxRxIntr DSP_ADDA UIT_FFT_Real Window

Committer:
MikamiUitOpen
Date:
Wed Dec 08 03:15:17 2021 +0000
Revision:
1:d4e3f39ce206
Parent:
0:3bf11d2ab6ad
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:3bf11d2ab6ad 1 //-------------------------------------------------------
MikamiUitOpen 0:3bf11d2ab6ad 2 // スペクトログラムで使う FFT 解析用クラス
MikamiUitOpen 0:3bf11d2ab6ad 3 //
MikamiUitOpen 1:d4e3f39ce206 4 // 2021/11/17, Copyright (c) 2021 MIKAMI, Naoki
MikamiUitOpen 0:3bf11d2ab6ad 5 //-------------------------------------------------------
MikamiUitOpen 0:3bf11d2ab6ad 6
MikamiUitOpen 0:3bf11d2ab6ad 7 #include "FFT_Spectrogram.hpp"
MikamiUitOpen 0:3bf11d2ab6ad 8
MikamiUitOpen 0:3bf11d2ab6ad 9 namespace Mikami
MikamiUitOpen 0:3bf11d2ab6ad 10 {
MikamiUitOpen 1:d4e3f39ce206 11 FftSpectropgram::FftSpectropgram(int nFft)
MikamiUitOpen 1:d4e3f39ce206 12 : N_FFT_(nFft), fft_(nFft), wHm_(nFft),
MikamiUitOpen 1:d4e3f39ce206 13 xData_(nFft), wData_(nFft), yFft_(nFft/2+1)
MikamiUitOpen 1:d4e3f39ce206 14 { SwEmphasis(false); } // 最初は高域強調なし
MikamiUitOpen 0:3bf11d2ab6ad 15
MikamiUitOpen 1:d4e3f39ce206 16 void FftSpectropgram::Execute(const Array<float> &xn,
MikamiUitOpen 1:d4e3f39ce206 17 Array<float> &absFt)
MikamiUitOpen 0:3bf11d2ab6ad 18 {
MikamiUitOpen 1:d4e3f39ce206 19 // データのコピー,高域強調の有無は SwEmphasis() で切り替え
MikamiUitOpen 1:d4e3f39ce206 20 (this->*fp)(xn);
MikamiUitOpen 0:3bf11d2ab6ad 21
MikamiUitOpen 0:3bf11d2ab6ad 22 // 直流分を除去
MikamiUitOpen 0:3bf11d2ab6ad 23 float sum = 0;
MikamiUitOpen 0:3bf11d2ab6ad 24 for (int n=0; n<N_FFT_; n++) sum = sum + xData_[n];
MikamiUitOpen 0:3bf11d2ab6ad 25 float ave = sum/N_FFT_;
MikamiUitOpen 0:3bf11d2ab6ad 26 for (int n=0; n<N_FFT_; n++) xData_[n] = xData_[n] - ave;
MikamiUitOpen 0:3bf11d2ab6ad 27
MikamiUitOpen 1:d4e3f39ce206 28 wData_ = wHm_.Execute(xData_); // 窓掛け
MikamiUitOpen 1:d4e3f39ce206 29 fft_.Execute(wData_, yFft_); // FFT の実行
MikamiUitOpen 0:3bf11d2ab6ad 30 for (int n=0; n<=N_FFT_/2; n++) // 絶対値に変換
MikamiUitOpen 0:3bf11d2ab6ad 31 absFt[n] = 100.0f*abs(yFft_[n]);
MikamiUitOpen 0:3bf11d2ab6ad 32 }
MikamiUitOpen 1:d4e3f39ce206 33
MikamiUitOpen 1:d4e3f39ce206 34 // データを作業領域にコピーする際に高域強調処理を行う
MikamiUitOpen 1:d4e3f39ce206 35 void FftSpectropgram::CopyH(const Array<float> &xn)
MikamiUitOpen 1:d4e3f39ce206 36 {
MikamiUitOpen 1:d4e3f39ce206 37 // 差分の処理
MikamiUitOpen 1:d4e3f39ce206 38 for (int n=1; n<N_FFT_; n++) // n=1 から開始
MikamiUitOpen 1:d4e3f39ce206 39 xData_[n] = xn[n] - xn[n-1];
MikamiUitOpen 1:d4e3f39ce206 40 xData_[0] = xData_[1]; // n=0 に対応
MikamiUitOpen 1:d4e3f39ce206 41 }
MikamiUitOpen 0:3bf11d2ab6ad 42 }