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