No photo version of "F746_SpectralAnalysis_Example".

Dependencies:   BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed

Committer:
MikamiUitOpen
Date:
Tue Nov 24 12:34:55 2015 +0000
Revision:
0:9d7f931c704a
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:9d7f931c704a 1 //-------------------------------------------------------
MikamiUitOpen 0:9d7f931c704a 2 // Class for spectrum analysis using FFT
MikamiUitOpen 0:9d7f931c704a 3 // Copyright (c) 2015 MIKAMI, Naoki, 2015/10/26
MikamiUitOpen 0:9d7f931c704a 4 //-------------------------------------------------------
MikamiUitOpen 0:9d7f931c704a 5
MikamiUitOpen 0:9d7f931c704a 6 #include "FFT_Analysis.hpp"
MikamiUitOpen 0:9d7f931c704a 7
MikamiUitOpen 0:9d7f931c704a 8 namespace Mikami
MikamiUitOpen 0:9d7f931c704a 9 {
MikamiUitOpen 0:9d7f931c704a 10 FftAnalyzer::FftAnalyzer(int nData, int nFft)
MikamiUitOpen 0:9d7f931c704a 11 : N_DATA_(nData), N_FFT_(nFft),
MikamiUitOpen 0:9d7f931c704a 12 hm_(nData-1, nFft), fft_(nFft)
MikamiUitOpen 0:9d7f931c704a 13 {
MikamiUitOpen 0:9d7f931c704a 14 xData = new float[nData]; // Data to be analyzed
MikamiUitOpen 0:9d7f931c704a 15 xFft = new float[nFft]; // Input for FFT
MikamiUitOpen 0:9d7f931c704a 16 yFft = new Complex[nFft/2+1]; // Output of FFT
MikamiUitOpen 0:9d7f931c704a 17 normY = new float[nFft/2+1]; // Powerspectrum
MikamiUitOpen 0:9d7f931c704a 18 }
MikamiUitOpen 0:9d7f931c704a 19
MikamiUitOpen 0:9d7f931c704a 20 FftAnalyzer::~FftAnalyzer()
MikamiUitOpen 0:9d7f931c704a 21 {
MikamiUitOpen 0:9d7f931c704a 22 delete[] xData;
MikamiUitOpen 0:9d7f931c704a 23 delete[] xFft;
MikamiUitOpen 0:9d7f931c704a 24 delete[] yFft;
MikamiUitOpen 0:9d7f931c704a 25 delete[] normY;
MikamiUitOpen 0:9d7f931c704a 26 }
MikamiUitOpen 0:9d7f931c704a 27
MikamiUitOpen 0:9d7f931c704a 28 void FftAnalyzer::Execute(float xn[], float db[])
MikamiUitOpen 0:9d7f931c704a 29 {
MikamiUitOpen 0:9d7f931c704a 30 // Differencing
MikamiUitOpen 0:9d7f931c704a 31 for (int n=0; n<N_DATA_-1; n++)
MikamiUitOpen 0:9d7f931c704a 32 xData[n] = xn[n+1] - xn[n];
MikamiUitOpen 0:9d7f931c704a 33
MikamiUitOpen 0:9d7f931c704a 34 hm_.Execute(xData, xFft); // Windowing and zero-padding
MikamiUitOpen 0:9d7f931c704a 35 fft_.Execute(xFft, yFft); // Execute FFT
MikamiUitOpen 0:9d7f931c704a 36
MikamiUitOpen 0:9d7f931c704a 37 // Squared magnitude
MikamiUitOpen 0:9d7f931c704a 38 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:9d7f931c704a 39 normY[n] = Sqr(yFft[n].real()) + Sqr(yFft[n].imag());
MikamiUitOpen 0:9d7f931c704a 40
MikamiUitOpen 0:9d7f931c704a 41 // Search maximum
MikamiUitOpen 0:9d7f931c704a 42 float max = 0;
MikamiUitOpen 0:9d7f931c704a 43 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:9d7f931c704a 44 max = (max > normY[n]) ? max : normY[n];
MikamiUitOpen 0:9d7f931c704a 45 float invMax = 1.0f/max;
MikamiUitOpen 0:9d7f931c704a 46
MikamiUitOpen 0:9d7f931c704a 47 // Translate to dB
MikamiUitOpen 0:9d7f931c704a 48 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:9d7f931c704a 49 db[n] = 10.0f*log10f(invMax*normY[n]);
MikamiUitOpen 0:9d7f931c704a 50 }
MikamiUitOpen 0:9d7f931c704a 51 }
MikamiUitOpen 0:9d7f931c704a 52
MikamiUitOpen 0:9d7f931c704a 53