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

Committer:
MikamiUitOpen
Date:
Sun Jul 26 02:48:23 2015 +0000
Revision:
0:c5b026c2d07e
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:c5b026c2d07e 1 //-------------------------------------------------------
MikamiUitOpen 0:c5b026c2d07e 2 // Class for spectrum analysis using linear prediction
MikamiUitOpen 0:c5b026c2d07e 3 // Copyright (c) 2014 MIKAMI, Naoki, 2014/12/30
MikamiUitOpen 0:c5b026c2d07e 4 //-------------------------------------------------------
MikamiUitOpen 0:c5b026c2d07e 5
MikamiUitOpen 0:c5b026c2d07e 6 #include "LPC_Analysis.hpp"
MikamiUitOpen 0:c5b026c2d07e 7
MikamiUitOpen 0:c5b026c2d07e 8 namespace Mikami
MikamiUitOpen 0:c5b026c2d07e 9 {
MikamiUitOpen 0:c5b026c2d07e 10 LpcAnalyzer::LpcAnalyzer(int nData, int order, int nFft)
MikamiUitOpen 0:c5b026c2d07e 11 : N_DATA_(nData), ORDER_(order), N_FFT_(nFft),
MikamiUitOpen 0:c5b026c2d07e 12 hm_(nData-1, nData-1), lp_(nData-1, order),
MikamiUitOpen 0:c5b026c2d07e 13 fft_(nFft)
MikamiUitOpen 0:c5b026c2d07e 14 {
MikamiUitOpen 0:c5b026c2d07e 15 pkHolder_ = new PeakHolder[nFft/2+1];
MikamiUitOpen 0:c5b026c2d07e 16 for (int n=0; n<=nFft/2; n++)
MikamiUitOpen 0:c5b026c2d07e 17 pkHolder_[n].SetCoefs(0.2f);
MikamiUitOpen 0:c5b026c2d07e 18
MikamiUitOpen 0:c5b026c2d07e 19 xData_ = new float[nData]; // Data to be analyzed
MikamiUitOpen 0:c5b026c2d07e 20 an_ = new float[order]; // Linear-predictive coefficients
MikamiUitOpen 0:c5b026c2d07e 21 xFft_ = new float[nFft]; // Input for FFT
MikamiUitOpen 0:c5b026c2d07e 22 yFft_ = new Complex[nFft/2+1]; // Output of FFT
MikamiUitOpen 0:c5b026c2d07e 23 normY_ = new float[nFft/2+1]; // Powerspectrum
MikamiUitOpen 0:c5b026c2d07e 24 }
MikamiUitOpen 0:c5b026c2d07e 25
MikamiUitOpen 0:c5b026c2d07e 26 LpcAnalyzer::~LpcAnalyzer()
MikamiUitOpen 0:c5b026c2d07e 27 {
MikamiUitOpen 0:c5b026c2d07e 28 delete[] pkHolder_;
MikamiUitOpen 0:c5b026c2d07e 29 delete[] xData_;
MikamiUitOpen 0:c5b026c2d07e 30 delete[] an_;
MikamiUitOpen 0:c5b026c2d07e 31 delete[] xFft_;
MikamiUitOpen 0:c5b026c2d07e 32 delete[] yFft_;
MikamiUitOpen 0:c5b026c2d07e 33 delete[] normY_;
MikamiUitOpen 0:c5b026c2d07e 34 }
MikamiUitOpen 0:c5b026c2d07e 35
MikamiUitOpen 0:c5b026c2d07e 36 void LpcAnalyzer::Execute(float xn[], float db[])
MikamiUitOpen 0:c5b026c2d07e 37 {
MikamiUitOpen 0:c5b026c2d07e 38 // Differencing
MikamiUitOpen 0:c5b026c2d07e 39 for (int n=0; n<N_DATA_-1; n++)
MikamiUitOpen 0:c5b026c2d07e 40 xData_[n] = xn[n+1] - xn[n];
MikamiUitOpen 0:c5b026c2d07e 41
MikamiUitOpen 0:c5b026c2d07e 42 hm_.Execute(xData_, xData_); // Windowing
MikamiUitOpen 0:c5b026c2d07e 43 float em;
MikamiUitOpen 0:c5b026c2d07e 44 lp_.Execute(xData_, an_, em);
MikamiUitOpen 0:c5b026c2d07e 45
MikamiUitOpen 0:c5b026c2d07e 46 // To spectrum
MikamiUitOpen 0:c5b026c2d07e 47 xFft_[0] = 1.0f;
MikamiUitOpen 0:c5b026c2d07e 48 for (int n=0; n<ORDER_; n++) xFft_[n+1] = -an_[n];
MikamiUitOpen 0:c5b026c2d07e 49 for (int n=ORDER_+1; n<N_FFT_; n++) xFft_[n] = 0.0f;
MikamiUitOpen 0:c5b026c2d07e 50 fft_.Execute(xFft_, yFft_); // Execute FFT
MikamiUitOpen 0:c5b026c2d07e 51
MikamiUitOpen 0:c5b026c2d07e 52 // Smoothing
MikamiUitOpen 0:c5b026c2d07e 53 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:c5b026c2d07e 54 normY_[n] = pkHolder_[n].Execute(Sqr(yFft_[n].real())
MikamiUitOpen 0:c5b026c2d07e 55 + Sqr(yFft_[n].imag()));
MikamiUitOpen 0:c5b026c2d07e 56
MikamiUitOpen 0:c5b026c2d07e 57 // Translate to dB
MikamiUitOpen 0:c5b026c2d07e 58 float b0Db = 20.0f*log10f(em); // b0 to dB
MikamiUitOpen 0:c5b026c2d07e 59 for (int n=0; n<=N_FFT_/2; n++)
MikamiUitOpen 0:c5b026c2d07e 60 db[n] = -10.0f*log10f(normY_[n]) + b0Db + 30;
MikamiUitOpen 0:c5b026c2d07e 61 }
MikamiUitOpen 0:c5b026c2d07e 62 }