No photo version of "F746_SpectralAnalysis_Example".
Dependencies: BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed
main.cpp@0:9d7f931c704a, 2015-11-24 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Nov 24 12:34:55 2015 +0000
- Revision:
- 0:9d7f931c704a
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:9d7f931c704a | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:9d7f931c704a | 2 | // Demo waveform and spectrum display |
MikamiUitOpen | 0:9d7f931c704a | 3 | // Tap the screen to begin the spectrum analyzer |
MikamiUitOpen | 0:9d7f931c704a | 4 | // No photo version of "F746_SpectralAnalysis_Example" |
MikamiUitOpen | 0:9d7f931c704a | 5 | // |
MikamiUitOpen | 0:9d7f931c704a | 6 | // 2015/11/24, Copyright (c) 2015 MIKAMI, Naoki |
MikamiUitOpen | 0:9d7f931c704a | 7 | //----------------------------------------------------------- |
MikamiUitOpen | 0:9d7f931c704a | 8 | |
MikamiUitOpen | 0:9d7f931c704a | 9 | #include "vowel_data.hpp" |
MikamiUitOpen | 0:9d7f931c704a | 10 | #include "button_group.hpp" |
MikamiUitOpen | 0:9d7f931c704a | 11 | #include "waveform_display.hpp" |
MikamiUitOpen | 0:9d7f931c704a | 12 | #include "FFT_Analysis.hpp" |
MikamiUitOpen | 0:9d7f931c704a | 13 | #include "SpectrumDisplay.hpp" |
MikamiUitOpen | 0:9d7f931c704a | 14 | #include "LPC_Analysis.hpp" |
MikamiUitOpen | 0:9d7f931c704a | 15 | |
MikamiUitOpen | 0:9d7f931c704a | 16 | using namespace Mikami; |
MikamiUitOpen | 0:9d7f931c704a | 17 | |
MikamiUitOpen | 0:9d7f931c704a | 18 | const int N_FFT_ = 512; // number of date for FFT |
MikamiUitOpen | 0:9d7f931c704a | 19 | const int X0_ = 50; // Origin for x axis |
MikamiUitOpen | 0:9d7f931c704a | 20 | const int Y0_ = 236; // Origin for y axis |
MikamiUitOpen | 0:9d7f931c704a | 21 | const float DB1_ = 2.4f; // Pixels for 1 dB |
MikamiUitOpen | 0:9d7f931c704a | 22 | const int BIN_ = 1; // Pixels per bin |
MikamiUitOpen | 0:9d7f931c704a | 23 | const int W_DB = 60; // Width in dB to be displayed |
MikamiUitOpen | 0:9d7f931c704a | 24 | |
MikamiUitOpen | 0:9d7f931c704a | 25 | const int FS_ = 8000; // Sampling frequency: 8 kHz |
MikamiUitOpen | 0:9d7f931c704a | 26 | |
MikamiUitOpen | 0:9d7f931c704a | 27 | LCD_DISCO_F746NG lcd_; |
MikamiUitOpen | 0:9d7f931c704a | 28 | TS_DISCO_F746NG ts_; |
MikamiUitOpen | 0:9d7f931c704a | 29 | |
MikamiUitOpen | 0:9d7f931c704a | 30 | FftAnalyzer fft_(N_DATA_, N_FFT_); // using FFT |
MikamiUitOpen | 0:9d7f931c704a | 31 | LpcAnalyzer lpc_(N_DATA_, 10, N_FFT_); // using linear prediction |
MikamiUitOpen | 0:9d7f931c704a | 32 | |
MikamiUitOpen | 0:9d7f931c704a | 33 | int main() |
MikamiUitOpen | 0:9d7f931c704a | 34 | { |
MikamiUitOpen | 0:9d7f931c704a | 35 | int16_t sn[N_DATA_]; |
MikamiUitOpen | 0:9d7f931c704a | 36 | float sn_f[N_DATA_]; |
MikamiUitOpen | 0:9d7f931c704a | 37 | float db1[N_FFT_/2+1]; // Log powerspectrum using FFT |
MikamiUitOpen | 0:9d7f931c704a | 38 | float db2[N_FFT_/2+1]; // Log powerspectrum using linear prediction |
MikamiUitOpen | 0:9d7f931c704a | 39 | |
MikamiUitOpen | 0:9d7f931c704a | 40 | uint32_t backColor = 0xFF006A6C; // teal green |
MikamiUitOpen | 0:9d7f931c704a | 41 | lcd_.Clear(backColor); |
MikamiUitOpen | 0:9d7f931c704a | 42 | |
MikamiUitOpen | 0:9d7f931c704a | 43 | const string AIUEO[5] = {"/a/", "/i/", "/u/", "/e/", "/o/"}; |
MikamiUitOpen | 0:9d7f931c704a | 44 | ButtonGroup aiueo(lcd_, ts_, 430, 15, 50, 40, |
MikamiUitOpen | 0:9d7f931c704a | 45 | LCD_COLOR_BLUE, backColor, |
MikamiUitOpen | 0:9d7f931c704a | 46 | 5, AIUEO, 0, 10, 1, Font16); |
MikamiUitOpen | 0:9d7f931c704a | 47 | |
MikamiUitOpen | 0:9d7f931c704a | 48 | const string METHOD[3] = {"FFT (Bar)", "FFT (Line)", "LP"}; |
MikamiUitOpen | 0:9d7f931c704a | 49 | ButtonGroup method(lcd_, ts_, 340, 15, 80, 40, |
MikamiUitOpen | 0:9d7f931c704a | 50 | LCD_COLOR_BLUE, backColor, |
MikamiUitOpen | 0:9d7f931c704a | 51 | 3, METHOD, 0, 10, 1, Font12); |
MikamiUitOpen | 0:9d7f931c704a | 52 | uint32_t inActive = backColor & 0xD0FFFFFF; |
MikamiUitOpen | 0:9d7f931c704a | 53 | for (int n=0; n<3; n++) method.Draw(n, inActive, LCD_COLOR_LIGHTGRAY); |
MikamiUitOpen | 0:9d7f931c704a | 54 | |
MikamiUitOpen | 0:9d7f931c704a | 55 | SpectrumDisplay disp(lcd_, N_FFT_, X0_, Y0_, DB1_, BIN_, W_DB, FS_); |
MikamiUitOpen | 0:9d7f931c704a | 56 | bool dataOk = false; |
MikamiUitOpen | 0:9d7f931c704a | 57 | while (true) |
MikamiUitOpen | 0:9d7f931c704a | 58 | { |
MikamiUitOpen | 0:9d7f931c704a | 59 | int vowel; |
MikamiUitOpen | 0:9d7f931c704a | 60 | if (aiueo.GetTouchedNumber(vowel, 0xFF0000B0)) |
MikamiUitOpen | 0:9d7f931c704a | 61 | { |
MikamiUitOpen | 0:9d7f931c704a | 62 | for (int n=0; n<N_DATA_; n++) sn[n] = sn_[vowel][n]; |
MikamiUitOpen | 0:9d7f931c704a | 63 | WaveformDisplay(lcd_, 50, 40, sn, N_DATA_, backColor); |
MikamiUitOpen | 0:9d7f931c704a | 64 | |
MikamiUitOpen | 0:9d7f931c704a | 65 | for (int n=0; n<N_DATA_; n++) sn_f[n] = sn[n]; |
MikamiUitOpen | 0:9d7f931c704a | 66 | fft_.Execute(sn_f, db1); |
MikamiUitOpen | 0:9d7f931c704a | 67 | lpc_.Execute(sn_f, db2); |
MikamiUitOpen | 0:9d7f931c704a | 68 | dataOk = true; |
MikamiUitOpen | 0:9d7f931c704a | 69 | disp.Clear(backColor); |
MikamiUitOpen | 0:9d7f931c704a | 70 | for (int n=0; n<3; n++) method.Redraw(n); |
MikamiUitOpen | 0:9d7f931c704a | 71 | } |
MikamiUitOpen | 0:9d7f931c704a | 72 | |
MikamiUitOpen | 0:9d7f931c704a | 73 | if (dataOk) |
MikamiUitOpen | 0:9d7f931c704a | 74 | { |
MikamiUitOpen | 0:9d7f931c704a | 75 | int k; |
MikamiUitOpen | 0:9d7f931c704a | 76 | if (method.GetTouchedNumber(k, 0xFF0000B0)) |
MikamiUitOpen | 0:9d7f931c704a | 77 | { |
MikamiUitOpen | 0:9d7f931c704a | 78 | switch (k) |
MikamiUitOpen | 0:9d7f931c704a | 79 | { |
MikamiUitOpen | 0:9d7f931c704a | 80 | case 0: disp.BarChart(db1, backColor); |
MikamiUitOpen | 0:9d7f931c704a | 81 | break; |
MikamiUitOpen | 0:9d7f931c704a | 82 | case 1: disp.LineChart(db1, backColor); |
MikamiUitOpen | 0:9d7f931c704a | 83 | break; |
MikamiUitOpen | 0:9d7f931c704a | 84 | case 2: disp.LineChart(db2, backColor); |
MikamiUitOpen | 0:9d7f931c704a | 85 | break; |
MikamiUitOpen | 0:9d7f931c704a | 86 | } |
MikamiUitOpen | 0:9d7f931c704a | 87 | } |
MikamiUitOpen | 0:9d7f931c704a | 88 | } |
MikamiUitOpen | 0:9d7f931c704a | 89 | wait(0.1); |
MikamiUitOpen | 0:9d7f931c704a | 90 | } |
MikamiUitOpen | 0:9d7f931c704a | 91 | } |