No photo version of "F746_SpectralAnalysis_Example".

Dependencies:   BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed

Committer:
MikamiUitOpen
Date:
Tue Nov 24 12:34:55 2015 +0000
Revision:
0:9d7f931c704a
1

Who changed what in which revision?

UserRevisionLine numberNew 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 }