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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers FFT_Analysis.cpp Source File

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 }