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

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?

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