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 linear prediction
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 "LPC_Analysis.hpp"
MikamiUitOpen 0:9d7f931c704a 7
MikamiUitOpen 0:9d7f931c704a 8 namespace Mikami
MikamiUitOpen 0:9d7f931c704a 9 {
MikamiUitOpen 0:9d7f931c704a 10 LpcAnalyzer::LpcAnalyzer(int nData, int order, int nFft)
MikamiUitOpen 0:9d7f931c704a 11 : N_DATA_(nData), ORDER_(order), N_FFT_(nFft),
MikamiUitOpen 0:9d7f931c704a 12 hm_(nData-1, nData-1), lp_(nData-1, order),
MikamiUitOpen 0:9d7f931c704a 13 fft_(nFft)
MikamiUitOpen 0:9d7f931c704a 14 {
MikamiUitOpen 0:9d7f931c704a 15 xData_ = new float[nData]; // Data to be analyzed
MikamiUitOpen 0:9d7f931c704a 16 an_ = new float[order]; // Linear-predictive coefficients
MikamiUitOpen 0:9d7f931c704a 17 xFft_ = new float[nFft]; // Input for FFT
MikamiUitOpen 0:9d7f931c704a 18 yFft_ = new Complex[nFft/2+1]; // Output of FFT
MikamiUitOpen 0:9d7f931c704a 19 normY_ = new float[nFft/2+1]; // Powerspectrum
MikamiUitOpen 0:9d7f931c704a 20 }
MikamiUitOpen 0:9d7f931c704a 21
MikamiUitOpen 0:9d7f931c704a 22 LpcAnalyzer::~LpcAnalyzer()
MikamiUitOpen 0:9d7f931c704a 23 {
MikamiUitOpen 0:9d7f931c704a 24 delete[] xData_;
MikamiUitOpen 0:9d7f931c704a 25 delete[] an_;
MikamiUitOpen 0:9d7f931c704a 26 delete[] xFft_;
MikamiUitOpen 0:9d7f931c704a 27 delete[] yFft_;
MikamiUitOpen 0:9d7f931c704a 28 delete[] normY_;
MikamiUitOpen 0:9d7f931c704a 29 }
MikamiUitOpen 0:9d7f931c704a 30
MikamiUitOpen 0:9d7f931c704a 31 void LpcAnalyzer::Execute(float xn[], float db[])
MikamiUitOpen 0:9d7f931c704a 32 {
MikamiUitOpen 0:9d7f931c704a 33 // Differencing
MikamiUitOpen 0:9d7f931c704a 34 for (int n=0; n<N_DATA_-1; n++)
MikamiUitOpen 0:9d7f931c704a 35 xData_[n] = xn[n+1] - xn[n];
MikamiUitOpen 0:9d7f931c704a 36
MikamiUitOpen 0:9d7f931c704a 37 hm_.Execute(xData_, xData_); // Windowing
MikamiUitOpen 0:9d7f931c704a 38 float em;
MikamiUitOpen 0:9d7f931c704a 39 lp_.Execute(xData_, an_, em);
MikamiUitOpen 0:9d7f931c704a 40
MikamiUitOpen 0:9d7f931c704a 41 // To spectrum
MikamiUitOpen 0:9d7f931c704a 42 xFft_[0] = 1.0f;
MikamiUitOpen 0:9d7f931c704a 43 for (int n=0; n<ORDER_; n++) xFft_[n+1] = -an_[n];
MikamiUitOpen 0:9d7f931c704a 44 for (int n=ORDER_+1; n<N_FFT_; n++) xFft_[n] = 0.0f;
MikamiUitOpen 0:9d7f931c704a 45 fft_.Execute(xFft_, yFft_); // Execute FFT
MikamiUitOpen 0:9d7f931c704a 46
MikamiUitOpen 0:9d7f931c704a 47 // Squared magnitude
MikamiUitOpen 0:9d7f931c704a 48 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:9d7f931c704a 49 normY_[n] = 1.0f/(Sqr(yFft_[n].real()) + Sqr(yFft_[n].imag()));
MikamiUitOpen 0:9d7f931c704a 50
MikamiUitOpen 0:9d7f931c704a 51 // Search maximum
MikamiUitOpen 0:9d7f931c704a 52 float max = 0;
MikamiUitOpen 0:9d7f931c704a 53 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:9d7f931c704a 54 max = (max > normY_[n]) ? max : normY_[n];
MikamiUitOpen 0:9d7f931c704a 55 float invMax = 1.0f/max;
MikamiUitOpen 0:9d7f931c704a 56
MikamiUitOpen 0:9d7f931c704a 57 // Translate to dB
MikamiUitOpen 0:9d7f931c704a 58 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:9d7f931c704a 59 db[n] = 10.0f*log10f(invMax*normY_[n]);
MikamiUitOpen 0:9d7f931c704a 60 }
MikamiUitOpen 0:9d7f931c704a 61 }
MikamiUitOpen 0:9d7f931c704a 62