Spectrum analyzer using DISCO-F746NG. Spectrum is calculated by FFT or linear prediction. The vowel data is in "vowel_data.hpp"
Dependencies: BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed BUTTON_GROUP
Diff: main.cpp
- Revision:
- 4:3c5241f9fbf3
- Parent:
- 3:ce2e8481790c
- Child:
- 5:3da45b682898
--- a/main.cpp Tue Nov 03 05:41:06 2015 +0000 +++ b/main.cpp Mon Nov 23 10:36:09 2015 +0000 @@ -2,11 +2,11 @@ // Demo waveform and spectrum display // Tap the screen to begin the spectrum analyzer // -// 2015/11/03, Copyright (c) 2015 MIKAMI, Naoki +// 2015/11/23, Copyright (c) 2015 MIKAMI, Naoki //----------------------------------------------------------- #include "vowel_data.hpp" -#include "button.hpp" +#include "button_group.hpp" #include "waveform_display.hpp" #include "FFT_Analysis.hpp" #include "SpectrumDisplay.hpp" @@ -32,13 +32,12 @@ int main() { - const char AIUEO[5] = {'a', 'i', 'u', 'e', 'o'}; 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 = LCD_COLOR_LIGHTBLUE; + uint32_t backColor = 0xFF006A6C; // teal green // Initial image lcd_.DrawBitmap(0, 0, (uint8_t *)hattatsurei); @@ -54,71 +53,52 @@ lcd_.Clear(backColor); - Button *buttons[5]; // for select /a/, /i/, /u/, /e/, /o/ - for (int n=0; n<5; n++) - { - char strButton[8]; - sprintf(strButton, "/%c/", AIUEO[n]); - buttons[n] = new Button(lcd_, ts_, 430, 15+50*n, 50, 40, - LCD_COLOR_BLUE, strButton, Font16); - } - Button fftButtonBar(lcd_, ts_, 340, 15, 80, 40, LCD_COLOR_MAGENTA, "FFT (Bar)", Font12); - Button fftButtonLine(lcd_, ts_, 340, 65, 80, 40, LCD_COLOR_MAGENTA, "FFT (Line)", Font12); - Button lpButton(lcd_, ts_, 340, 115, 80, 40, LCD_COLOR_MAGENTA, "LP", Font12); - lcd_.SetBackColor(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; - int vowel = -1; while (true) { - for (int k=0; k<N_VOWEL_; k++) + int vowel; + if (aiueo.GetTouchedNumber(vowel, 0xFF0000B0)) { - if (buttons[k]->Touched(0xFF0000B0)) - { - for (int n=0; n<N_DATA_; n++) sn[n] = sn_[k][n]; + for (int n=0; n<N_DATA_; n++) sn[n] = sn_[vowel][n]; WaveformDisplay(lcd_, 50, 40, sn, N_DATA_, backColor); - if ((vowel != -1) && (k != vowel)) - buttons[vowel]->ReDraw(); - vowel = k; + 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); + } - 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); - - fftButtonBar.Draw(LCD_COLOR_MAGENTA); - fftButtonLine.Draw(LCD_COLOR_MAGENTA); - lpButton.Draw(LCD_COLOR_MAGENTA); + 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; + } } } - - if (fftButtonBar.Touched() && dataOk) - { - fftButtonBar.Draw(0xFFD000D0); - fftButtonLine.Draw(LCD_COLOR_MAGENTA); - lpButton.Draw(LCD_COLOR_MAGENTA); - disp.BarChart(db1, backColor); - } - - if (fftButtonLine.Touched() && dataOk) - { - fftButtonBar.Draw(LCD_COLOR_MAGENTA); - fftButtonLine.Draw(0xFFD000D0); - lpButton.Draw(LCD_COLOR_MAGENTA); - disp.LineChart(db1, backColor); - } - - if (lpButton.Touched() && dataOk) - { - fftButtonBar.Draw(LCD_COLOR_MAGENTA); - fftButtonLine.Draw(LCD_COLOR_MAGENTA); - lpButton.Draw(0xFFD000D0); - disp.LineChart(db2, backColor); - } - wait(0.1); } }