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
main.cpp@3:ce2e8481790c, 2015-11-03 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Nov 03 05:41:06 2015 +0000
- Revision:
- 3:ce2e8481790c
- Parent:
- 2:4e34945b5c00
- Child:
- 4:3c5241f9fbf3
4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:c35b8a23a863 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:c35b8a23a863 | 2 | // Demo waveform and spectrum display |
MikamiUitOpen | 3:ce2e8481790c | 3 | // Tap the screen to begin the spectrum analyzer |
MikamiUitOpen | 0:c35b8a23a863 | 4 | // |
MikamiUitOpen | 3:ce2e8481790c | 5 | // 2015/11/03, Copyright (c) 2015 MIKAMI, Naoki |
MikamiUitOpen | 0:c35b8a23a863 | 6 | //----------------------------------------------------------- |
MikamiUitOpen | 0:c35b8a23a863 | 7 | |
MikamiUitOpen | 0:c35b8a23a863 | 8 | #include "vowel_data.hpp" |
MikamiUitOpen | 0:c35b8a23a863 | 9 | #include "button.hpp" |
MikamiUitOpen | 0:c35b8a23a863 | 10 | #include "waveform_display.hpp" |
MikamiUitOpen | 0:c35b8a23a863 | 11 | #include "FFT_Analysis.hpp" |
MikamiUitOpen | 0:c35b8a23a863 | 12 | #include "SpectrumDisplay.hpp" |
MikamiUitOpen | 0:c35b8a23a863 | 13 | #include "LPC_Analysis.hpp" |
MikamiUitOpen | 3:ce2e8481790c | 14 | #include "PadalingImage.h" |
MikamiUitOpen | 0:c35b8a23a863 | 15 | |
MikamiUitOpen | 0:c35b8a23a863 | 16 | using namespace Mikami; |
MikamiUitOpen | 0:c35b8a23a863 | 17 | |
MikamiUitOpen | 0:c35b8a23a863 | 18 | const int N_FFT_ = 512; // number of date for FFT |
MikamiUitOpen | 0:c35b8a23a863 | 19 | const int X0_ = 50; // Origin for x axis |
MikamiUitOpen | 0:c35b8a23a863 | 20 | const int Y0_ = 236; // Origin for y axis |
MikamiUitOpen | 0:c35b8a23a863 | 21 | const float DB1_ = 2.4f; // Pixels for 1 dB |
MikamiUitOpen | 0:c35b8a23a863 | 22 | const int BIN_ = 1; // Pixels per bin |
MikamiUitOpen | 3:ce2e8481790c | 23 | const int W_DB = 60; // Width in dB to be displayed |
MikamiUitOpen | 0:c35b8a23a863 | 24 | |
MikamiUitOpen | 3:ce2e8481790c | 25 | const int FS_ = 8000; // Sampling frequency: 8 kHz |
MikamiUitOpen | 0:c35b8a23a863 | 26 | |
MikamiUitOpen | 0:c35b8a23a863 | 27 | LCD_DISCO_F746NG lcd_; |
MikamiUitOpen | 0:c35b8a23a863 | 28 | TS_DISCO_F746NG ts_; |
MikamiUitOpen | 0:c35b8a23a863 | 29 | |
MikamiUitOpen | 0:c35b8a23a863 | 30 | FftAnalyzer fft_(N_DATA_, N_FFT_); // using FFT |
MikamiUitOpen | 0:c35b8a23a863 | 31 | LpcAnalyzer lpc_(N_DATA_, 10, N_FFT_); // using linear prediction |
MikamiUitOpen | 0:c35b8a23a863 | 32 | |
MikamiUitOpen | 0:c35b8a23a863 | 33 | int main() |
MikamiUitOpen | 0:c35b8a23a863 | 34 | { |
MikamiUitOpen | 0:c35b8a23a863 | 35 | const char AIUEO[5] = {'a', 'i', 'u', 'e', 'o'}; |
MikamiUitOpen | 0:c35b8a23a863 | 36 | int16_t sn[N_DATA_]; |
MikamiUitOpen | 0:c35b8a23a863 | 37 | float sn_f[N_DATA_]; |
MikamiUitOpen | 0:c35b8a23a863 | 38 | float db1[N_FFT_/2+1]; // Log powerspectrum using FFT |
MikamiUitOpen | 0:c35b8a23a863 | 39 | float db2[N_FFT_/2+1]; // Log powerspectrum using linear prediction |
MikamiUitOpen | 2:4e34945b5c00 | 40 | |
MikamiUitOpen | 0:c35b8a23a863 | 41 | uint32_t backColor = LCD_COLOR_LIGHTBLUE; |
MikamiUitOpen | 2:4e34945b5c00 | 42 | |
MikamiUitOpen | 2:4e34945b5c00 | 43 | // Initial image |
MikamiUitOpen | 2:4e34945b5c00 | 44 | lcd_.DrawBitmap(0, 0, (uint8_t *)hattatsurei); |
MikamiUitOpen | 2:4e34945b5c00 | 45 | |
MikamiUitOpen | 2:4e34945b5c00 | 46 | bool ok = false; |
MikamiUitOpen | 2:4e34945b5c00 | 47 | while (!ok) // wait for tapped |
MikamiUitOpen | 2:4e34945b5c00 | 48 | { |
MikamiUitOpen | 2:4e34945b5c00 | 49 | TS_StateTypeDef state; |
MikamiUitOpen | 2:4e34945b5c00 | 50 | ts_.GetState(&state); |
MikamiUitOpen | 2:4e34945b5c00 | 51 | ok = state.touchDetected; |
MikamiUitOpen | 2:4e34945b5c00 | 52 | } |
MikamiUitOpen | 2:4e34945b5c00 | 53 | wait(0.5f); |
MikamiUitOpen | 2:4e34945b5c00 | 54 | |
MikamiUitOpen | 0:c35b8a23a863 | 55 | lcd_.Clear(backColor); |
MikamiUitOpen | 0:c35b8a23a863 | 56 | |
MikamiUitOpen | 2:4e34945b5c00 | 57 | Button *buttons[5]; // for select /a/, /i/, /u/, /e/, /o/ |
MikamiUitOpen | 0:c35b8a23a863 | 58 | for (int n=0; n<5; n++) |
MikamiUitOpen | 0:c35b8a23a863 | 59 | { |
MikamiUitOpen | 0:c35b8a23a863 | 60 | char strButton[8]; |
MikamiUitOpen | 0:c35b8a23a863 | 61 | sprintf(strButton, "/%c/", AIUEO[n]); |
MikamiUitOpen | 0:c35b8a23a863 | 62 | buttons[n] = new Button(lcd_, ts_, 430, 15+50*n, 50, 40, |
MikamiUitOpen | 0:c35b8a23a863 | 63 | LCD_COLOR_BLUE, strButton, Font16); |
MikamiUitOpen | 0:c35b8a23a863 | 64 | } |
MikamiUitOpen | 0:c35b8a23a863 | 65 | Button fftButtonBar(lcd_, ts_, 340, 15, 80, 40, LCD_COLOR_MAGENTA, "FFT (Bar)", Font12); |
MikamiUitOpen | 0:c35b8a23a863 | 66 | Button fftButtonLine(lcd_, ts_, 340, 65, 80, 40, LCD_COLOR_MAGENTA, "FFT (Line)", Font12); |
MikamiUitOpen | 0:c35b8a23a863 | 67 | Button lpButton(lcd_, ts_, 340, 115, 80, 40, LCD_COLOR_MAGENTA, "LP", Font12); |
MikamiUitOpen | 0:c35b8a23a863 | 68 | lcd_.SetBackColor(backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 69 | |
MikamiUitOpen | 3:ce2e8481790c | 70 | SpectrumDisplay disp(lcd_, N_FFT_, X0_, Y0_, DB1_, BIN_, W_DB, FS_); |
MikamiUitOpen | 0:c35b8a23a863 | 71 | bool dataOk = false; |
MikamiUitOpen | 1:2ef356b500f2 | 72 | int vowel = -1; |
MikamiUitOpen | 0:c35b8a23a863 | 73 | while (true) |
MikamiUitOpen | 0:c35b8a23a863 | 74 | { |
MikamiUitOpen | 0:c35b8a23a863 | 75 | for (int k=0; k<N_VOWEL_; k++) |
MikamiUitOpen | 0:c35b8a23a863 | 76 | { |
MikamiUitOpen | 3:ce2e8481790c | 77 | if (buttons[k]->Touched(0xFF0000B0)) |
MikamiUitOpen | 0:c35b8a23a863 | 78 | { |
MikamiUitOpen | 0:c35b8a23a863 | 79 | for (int n=0; n<N_DATA_; n++) sn[n] = sn_[k][n]; |
MikamiUitOpen | 0:c35b8a23a863 | 80 | WaveformDisplay(lcd_, 50, 40, sn, N_DATA_, backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 81 | |
MikamiUitOpen | 1:2ef356b500f2 | 82 | if ((vowel != -1) && (k != vowel)) |
MikamiUitOpen | 3:ce2e8481790c | 83 | buttons[vowel]->ReDraw(); |
MikamiUitOpen | 1:2ef356b500f2 | 84 | vowel = k; |
MikamiUitOpen | 0:c35b8a23a863 | 85 | |
MikamiUitOpen | 0:c35b8a23a863 | 86 | for (int n=0; n<N_DATA_; n++) sn_f[n] = sn[n]; |
MikamiUitOpen | 0:c35b8a23a863 | 87 | fft_.Execute(sn_f, db1); |
MikamiUitOpen | 0:c35b8a23a863 | 88 | lpc_.Execute(sn_f, db2); |
MikamiUitOpen | 0:c35b8a23a863 | 89 | dataOk = true; |
MikamiUitOpen | 0:c35b8a23a863 | 90 | disp.Clear(backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 91 | |
MikamiUitOpen | 3:ce2e8481790c | 92 | fftButtonBar.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 3:ce2e8481790c | 93 | fftButtonLine.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 3:ce2e8481790c | 94 | lpButton.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 0:c35b8a23a863 | 95 | } |
MikamiUitOpen | 0:c35b8a23a863 | 96 | } |
MikamiUitOpen | 2:4e34945b5c00 | 97 | |
MikamiUitOpen | 0:c35b8a23a863 | 98 | if (fftButtonBar.Touched() && dataOk) |
MikamiUitOpen | 2:4e34945b5c00 | 99 | { |
MikamiUitOpen | 3:ce2e8481790c | 100 | fftButtonBar.Draw(0xFFD000D0); |
MikamiUitOpen | 3:ce2e8481790c | 101 | fftButtonLine.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 3:ce2e8481790c | 102 | lpButton.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 0:c35b8a23a863 | 103 | disp.BarChart(db1, backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 104 | } |
MikamiUitOpen | 0:c35b8a23a863 | 105 | |
MikamiUitOpen | 0:c35b8a23a863 | 106 | if (fftButtonLine.Touched() && dataOk) |
MikamiUitOpen | 2:4e34945b5c00 | 107 | { |
MikamiUitOpen | 3:ce2e8481790c | 108 | fftButtonBar.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 3:ce2e8481790c | 109 | fftButtonLine.Draw(0xFFD000D0); |
MikamiUitOpen | 3:ce2e8481790c | 110 | lpButton.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 0:c35b8a23a863 | 111 | disp.LineChart(db1, backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 112 | } |
MikamiUitOpen | 0:c35b8a23a863 | 113 | |
MikamiUitOpen | 0:c35b8a23a863 | 114 | if (lpButton.Touched() && dataOk) |
MikamiUitOpen | 2:4e34945b5c00 | 115 | { |
MikamiUitOpen | 3:ce2e8481790c | 116 | fftButtonBar.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 3:ce2e8481790c | 117 | fftButtonLine.Draw(LCD_COLOR_MAGENTA); |
MikamiUitOpen | 3:ce2e8481790c | 118 | lpButton.Draw(0xFFD000D0); |
MikamiUitOpen | 0:c35b8a23a863 | 119 | disp.LineChart(db2, backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 120 | } |
MikamiUitOpen | 0:c35b8a23a863 | 121 | |
MikamiUitOpen | 0:c35b8a23a863 | 122 | wait(0.1); |
MikamiUitOpen | 0:c35b8a23a863 | 123 | } |
MikamiUitOpen | 0:c35b8a23a863 | 124 | } |