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

Dependencies:   Array_Matrix mbed SerialTxRxIntr DSP_ADDA UIT_FFT_Real Window

MySpectrogram/FFT_Spectrogram.cpp

Committer:
MikamiUitOpen
Date:
2021-12-08
Revision:
1:d4e3f39ce206
Parent:
0:3bf11d2ab6ad

File content as of revision 1:d4e3f39ce206:

//-------------------------------------------------------
//  スペクトログラムで使う FFT 解析用クラス
//
//  2021/11/17, Copyright (c) 2021 MIKAMI, Naoki
//-------------------------------------------------------

#include "FFT_Spectrogram.hpp"

namespace Mikami
{
    FftSpectropgram::FftSpectropgram(int nFft)
        : N_FFT_(nFft), fft_(nFft), wHm_(nFft),
          xData_(nFft), wData_(nFft), yFft_(nFft/2+1)
    { SwEmphasis(false); }	 // 最初は高域強調なし

    void FftSpectropgram::Execute(const Array<float> &xn,
    							  Array<float> &absFt)
    {
		// データのコピー,高域強調の有無は SwEmphasis() で切り替え
		(this->*fp)(xn);

        // 直流分を除去
        float sum = 0;
        for (int n=0; n<N_FFT_; n++) sum = sum + xData_[n];
        float ave = sum/N_FFT_;
        for (int n=0; n<N_FFT_; n++) xData_[n] = xData_[n] - ave;

        wData_ = wHm_.Execute(xData_);  // 窓掛け
        fft_.Execute(wData_, yFft_);    // FFT の実行
        for (int n=0; n<=N_FFT_/2; n++) // 絶対値に変換
            absFt[n] = 100.0f*abs(yFft_[n]);
    }

    // データを作業領域にコピーする際に高域強調処理を行う
    void FftSpectropgram::CopyH(const Array<float> &xn)
    {
        // 差分の処理
        for (int n=1; n<N_FFT_; n++)	// n=1 から開始
            xData_[n] = xn[n] - xn[n-1];
		xData_[0] = xData_[1];			// n=0 に対応
    }
}