No photo version of "F746_SpectralAnalysis_Example".
Dependencies: BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed
SpactrumAnalysisClasses/LPC_Analysis.cpp@0:9d7f931c704a, 2015-11-24 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Nov 24 12:34:55 2015 +0000
- Revision:
- 0:9d7f931c704a
1
Who changed what in which revision?
User | Revision | Line number | New 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 |