No photo version of "F746_SpectralAnalysis_Example".
Dependencies: BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed
Diff: main.cpp
- Revision:
- 0:9d7f931c704a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Nov 24 12:34:55 2015 +0000 @@ -0,0 +1,91 @@ +//----------------------------------------------------------- +// Demo waveform and spectrum display +// Tap the screen to begin the spectrum analyzer +// No photo version of "F746_SpectralAnalysis_Example" +// +// 2015/11/24, Copyright (c) 2015 MIKAMI, Naoki +//----------------------------------------------------------- + +#include "vowel_data.hpp" +#include "button_group.hpp" +#include "waveform_display.hpp" +#include "FFT_Analysis.hpp" +#include "SpectrumDisplay.hpp" +#include "LPC_Analysis.hpp" + +using namespace Mikami; + +const int N_FFT_ = 512; // number of date for FFT +const int X0_ = 50; // Origin for x axis +const int Y0_ = 236; // Origin for y axis +const float DB1_ = 2.4f; // Pixels for 1 dB +const int BIN_ = 1; // Pixels per bin +const int W_DB = 60; // Width in dB to be displayed + +const int FS_ = 8000; // Sampling frequency: 8 kHz + +LCD_DISCO_F746NG lcd_; +TS_DISCO_F746NG ts_; + +FftAnalyzer fft_(N_DATA_, N_FFT_); // using FFT +LpcAnalyzer lpc_(N_DATA_, 10, N_FFT_); // using linear prediction + +int main() +{ + int16_t sn[N_DATA_]; + float sn_f[N_DATA_]; + float db1[N_FFT_/2+1]; // Log powerspectrum using FFT + float db2[N_FFT_/2+1]; // Log powerspectrum using linear prediction + + uint32_t backColor = 0xFF006A6C; // teal green + lcd_.Clear(backColor); + + const string AIUEO[5] = {"/a/", "/i/", "/u/", "/e/", "/o/"}; + ButtonGroup aiueo(lcd_, ts_, 430, 15, 50, 40, + LCD_COLOR_BLUE, backColor, + 5, AIUEO, 0, 10, 1, Font16); + + const string METHOD[3] = {"FFT (Bar)", "FFT (Line)", "LP"}; + ButtonGroup method(lcd_, ts_, 340, 15, 80, 40, + LCD_COLOR_BLUE, backColor, + 3, METHOD, 0, 10, 1, Font12); + uint32_t inActive = backColor & 0xD0FFFFFF; + for (int n=0; n<3; n++) method.Draw(n, inActive, LCD_COLOR_LIGHTGRAY); + + SpectrumDisplay disp(lcd_, N_FFT_, X0_, Y0_, DB1_, BIN_, W_DB, FS_); + bool dataOk = false; + while (true) + { + int vowel; + if (aiueo.GetTouchedNumber(vowel, 0xFF0000B0)) + { + for (int n=0; n<N_DATA_; n++) sn[n] = sn_[vowel][n]; + WaveformDisplay(lcd_, 50, 40, sn, N_DATA_, backColor); + + for (int n=0; n<N_DATA_; n++) sn_f[n] = sn[n]; + fft_.Execute(sn_f, db1); + lpc_.Execute(sn_f, db2); + dataOk = true; + disp.Clear(backColor); + for (int n=0; n<3; n++) method.Redraw(n); + } + + if (dataOk) + { + int k; + if (method.GetTouchedNumber(k, 0xFF0000B0)) + { + switch (k) + { + case 0: disp.BarChart(db1, backColor); + break; + case 1: disp.LineChart(db1, backColor); + break; + case 2: disp.LineChart(db2, backColor); + break; + } + } + } + wait(0.1); + } +}