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@4:3c5241f9fbf3, 2015-11-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Nov 23 10:36:09 2015 +0000
- Revision:
- 4:3c5241f9fbf3
- Parent:
- 3:ce2e8481790c
- Child:
- 5:3da45b682898
5
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 | 4:3c5241f9fbf3 | 5 | // 2015/11/23, Copyright (c) 2015 MIKAMI, Naoki |
MikamiUitOpen | 0:c35b8a23a863 | 6 | //----------------------------------------------------------- |
MikamiUitOpen | 0:c35b8a23a863 | 7 | |
MikamiUitOpen | 0:c35b8a23a863 | 8 | #include "vowel_data.hpp" |
MikamiUitOpen | 4:3c5241f9fbf3 | 9 | #include "button_group.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 | int16_t sn[N_DATA_]; |
MikamiUitOpen | 0:c35b8a23a863 | 36 | float sn_f[N_DATA_]; |
MikamiUitOpen | 0:c35b8a23a863 | 37 | float db1[N_FFT_/2+1]; // Log powerspectrum using FFT |
MikamiUitOpen | 0:c35b8a23a863 | 38 | float db2[N_FFT_/2+1]; // Log powerspectrum using linear prediction |
MikamiUitOpen | 2:4e34945b5c00 | 39 | |
MikamiUitOpen | 4:3c5241f9fbf3 | 40 | uint32_t backColor = 0xFF006A6C; // teal green |
MikamiUitOpen | 2:4e34945b5c00 | 41 | |
MikamiUitOpen | 2:4e34945b5c00 | 42 | // Initial image |
MikamiUitOpen | 2:4e34945b5c00 | 43 | lcd_.DrawBitmap(0, 0, (uint8_t *)hattatsurei); |
MikamiUitOpen | 2:4e34945b5c00 | 44 | |
MikamiUitOpen | 2:4e34945b5c00 | 45 | bool ok = false; |
MikamiUitOpen | 2:4e34945b5c00 | 46 | while (!ok) // wait for tapped |
MikamiUitOpen | 2:4e34945b5c00 | 47 | { |
MikamiUitOpen | 2:4e34945b5c00 | 48 | TS_StateTypeDef state; |
MikamiUitOpen | 2:4e34945b5c00 | 49 | ts_.GetState(&state); |
MikamiUitOpen | 2:4e34945b5c00 | 50 | ok = state.touchDetected; |
MikamiUitOpen | 2:4e34945b5c00 | 51 | } |
MikamiUitOpen | 2:4e34945b5c00 | 52 | wait(0.5f); |
MikamiUitOpen | 2:4e34945b5c00 | 53 | |
MikamiUitOpen | 0:c35b8a23a863 | 54 | lcd_.Clear(backColor); |
MikamiUitOpen | 0:c35b8a23a863 | 55 | |
MikamiUitOpen | 4:3c5241f9fbf3 | 56 | const string AIUEO[5] = {"/a/", "/i/", "/u/", "/e/", "/o/"}; |
MikamiUitOpen | 4:3c5241f9fbf3 | 57 | ButtonGroup aiueo(lcd_, ts_, 430, 15, 50, 40, |
MikamiUitOpen | 4:3c5241f9fbf3 | 58 | LCD_COLOR_BLUE, backColor, |
MikamiUitOpen | 4:3c5241f9fbf3 | 59 | 5, AIUEO, 0, 10, 1, Font16); |
MikamiUitOpen | 4:3c5241f9fbf3 | 60 | |
MikamiUitOpen | 4:3c5241f9fbf3 | 61 | const string METHOD[3] = {"FFT (Bar)", "FFT (Line)", "LP"}; |
MikamiUitOpen | 4:3c5241f9fbf3 | 62 | ButtonGroup method(lcd_, ts_, 340, 15, 80, 40, |
MikamiUitOpen | 4:3c5241f9fbf3 | 63 | LCD_COLOR_BLUE, backColor, |
MikamiUitOpen | 4:3c5241f9fbf3 | 64 | 3, METHOD, 0, 10, 1, Font12); |
MikamiUitOpen | 4:3c5241f9fbf3 | 65 | uint32_t inActive = backColor & 0xD0FFFFFF; |
MikamiUitOpen | 4:3c5241f9fbf3 | 66 | for (int n=0; n<3; n++) method.Draw(n, inActive, LCD_COLOR_LIGHTGRAY); |
MikamiUitOpen | 2:4e34945b5c00 | 67 | |
MikamiUitOpen | 3:ce2e8481790c | 68 | SpectrumDisplay disp(lcd_, N_FFT_, X0_, Y0_, DB1_, BIN_, W_DB, FS_); |
MikamiUitOpen | 0:c35b8a23a863 | 69 | bool dataOk = false; |
MikamiUitOpen | 0:c35b8a23a863 | 70 | while (true) |
MikamiUitOpen | 0:c35b8a23a863 | 71 | { |
MikamiUitOpen | 4:3c5241f9fbf3 | 72 | int vowel; |
MikamiUitOpen | 4:3c5241f9fbf3 | 73 | if (aiueo.GetTouchedNumber(vowel, 0xFF0000B0)) |
MikamiUitOpen | 0:c35b8a23a863 | 74 | { |
MikamiUitOpen | 4:3c5241f9fbf3 | 75 | for (int n=0; n<N_DATA_; n++) sn[n] = sn_[vowel][n]; |
MikamiUitOpen | 0:c35b8a23a863 | 76 | WaveformDisplay(lcd_, 50, 40, sn, N_DATA_, backColor); |
MikamiUitOpen | 2:4e34945b5c00 | 77 | |
MikamiUitOpen | 4:3c5241f9fbf3 | 78 | for (int n=0; n<N_DATA_; n++) sn_f[n] = sn[n]; |
MikamiUitOpen | 4:3c5241f9fbf3 | 79 | fft_.Execute(sn_f, db1); |
MikamiUitOpen | 4:3c5241f9fbf3 | 80 | lpc_.Execute(sn_f, db2); |
MikamiUitOpen | 4:3c5241f9fbf3 | 81 | dataOk = true; |
MikamiUitOpen | 4:3c5241f9fbf3 | 82 | disp.Clear(backColor); |
MikamiUitOpen | 4:3c5241f9fbf3 | 83 | for (int n=0; n<3; n++) method.Redraw(n); |
MikamiUitOpen | 4:3c5241f9fbf3 | 84 | } |
MikamiUitOpen | 0:c35b8a23a863 | 85 | |
MikamiUitOpen | 4:3c5241f9fbf3 | 86 | if (dataOk) |
MikamiUitOpen | 4:3c5241f9fbf3 | 87 | { |
MikamiUitOpen | 4:3c5241f9fbf3 | 88 | int k; |
MikamiUitOpen | 4:3c5241f9fbf3 | 89 | if (method.GetTouchedNumber(k, 0xFF0000B0)) |
MikamiUitOpen | 4:3c5241f9fbf3 | 90 | { |
MikamiUitOpen | 4:3c5241f9fbf3 | 91 | switch (k) |
MikamiUitOpen | 4:3c5241f9fbf3 | 92 | { |
MikamiUitOpen | 4:3c5241f9fbf3 | 93 | case 0: disp.BarChart(db1, backColor); |
MikamiUitOpen | 4:3c5241f9fbf3 | 94 | break; |
MikamiUitOpen | 4:3c5241f9fbf3 | 95 | case 1: disp.LineChart(db1, backColor); |
MikamiUitOpen | 4:3c5241f9fbf3 | 96 | break; |
MikamiUitOpen | 4:3c5241f9fbf3 | 97 | case 2: disp.LineChart(db2, backColor); |
MikamiUitOpen | 4:3c5241f9fbf3 | 98 | break; |
MikamiUitOpen | 4:3c5241f9fbf3 | 99 | } |
MikamiUitOpen | 0:c35b8a23a863 | 100 | } |
MikamiUitOpen | 0:c35b8a23a863 | 101 | } |
MikamiUitOpen | 0:c35b8a23a863 | 102 | wait(0.1); |
MikamiUitOpen | 0:c35b8a23a863 | 103 | } |
MikamiUitOpen | 0:c35b8a23a863 | 104 | } |