Real-time spectrum analyzer for ST Nucleo F401RE using Seeed Studio 2.8'' TFT Touch Shield V2.0.
Dependencies: SeeedStudioTFTv2 UITDSP_ADDA UIT_FFT_Real mbed
FFT_Analysis.cpp
00001 //------------------------------------------------------- 00002 // Class for spectrum analysis using FFT 00003 // Copyright (c) 2014 MIKAMI, Naoki, 2014/12/30 00004 //------------------------------------------------------- 00005 00006 #include "FFT_Analysis.hpp" 00007 00008 namespace Mikami 00009 { 00010 FftAnalyzer::FftAnalyzer(int nData, int nFft) 00011 : N_DATA_(nData), N_FFT_(nFft), 00012 hm_(nData-1, nFft), fft_(nFft) 00013 { 00014 pkHolder_ = new PeakHolder[nFft/2+1]; 00015 for (int n=0; n<=nFft/2; n++) 00016 pkHolder_[n].SetCoefs(0.2f); 00017 00018 xData = new float[nData]; // Data to be analyzed 00019 xFft = new float[nFft]; // Input for FFT 00020 yFft = new Complex[nFft/2+1]; // Output of FFT 00021 normY = new float[nFft/2+1]; // Powerspectrum 00022 } 00023 00024 FftAnalyzer::~FftAnalyzer() 00025 { 00026 delete[] pkHolder_; 00027 delete[] xData; 00028 delete[] xFft; 00029 delete[] yFft; 00030 delete[] normY; 00031 } 00032 00033 void FftAnalyzer::Execute(float xn[], float db[]) 00034 { 00035 // Differencing 00036 for (int n=0; n<N_DATA_-1; n++) 00037 xData[n] = xn[n+1] - xn[n]; 00038 00039 hm_.Execute(xData, xFft); // Windowing and zero-padding 00040 fft_.Execute(xFft, yFft); // Execute FFT 00041 00042 // Smoothing 00043 for (int n=0; n<=N_FFT_/2; n++) 00044 normY[n] = pkHolder_[n].Execute(Sqr(yFft[n].real()) 00045 + Sqr(yFft[n].imag())); 00046 00047 // Translate to dB 00048 for (int n=0; n<=N_FFT_/2; n++) 00049 db[n] = 10.0f*log10f(normY[n]); 00050 } 00051 }
Generated on Wed Jul 13 2022 10:14:59 by 1.7.2