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 09 10:34:47 2018 +0000
Revision:
6:f385940fbdb1
Parent:
5:3da45b682898
7

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 3:ce2e8481790c 3 // Tap the screen to begin the spectrum analyzer
MikamiUitOpen 0:c35b8a23a863 4 //
MikamiUitOpen 6:f385940fbdb1 5 // 2018/10/09, Copyright (c) 2018 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 5:3da45b682898 14 #include "BadalingImage.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 }