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

Revision:
4:3c5241f9fbf3
Parent:
3:ce2e8481790c
Child:
5:3da45b682898
--- a/main.cpp	Tue Nov 03 05:41:06 2015 +0000
+++ b/main.cpp	Mon Nov 23 10:36:09 2015 +0000
@@ -2,11 +2,11 @@
 //  Demo waveform and spectrum display
 //      Tap the screen to begin the spectrum analyzer 
 //
-//  2015/11/03, Copyright (c) 2015 MIKAMI, Naoki
+//  2015/11/23, Copyright (c) 2015 MIKAMI, Naoki
 //-----------------------------------------------------------
 
 #include "vowel_data.hpp"
-#include "button.hpp"
+#include "button_group.hpp"
 #include "waveform_display.hpp"
 #include "FFT_Analysis.hpp"
 #include "SpectrumDisplay.hpp"
@@ -32,13 +32,12 @@
 
 int main()
 {
-    const char AIUEO[5] = {'a', 'i', 'u', 'e', 'o'};
     int16_t sn[N_DATA_];
     float sn_f[N_DATA_];
     float db1[N_FFT_/2+1];  // Log powerspectrum using FFT
     float db2[N_FFT_/2+1];  // Log powerspectrum using linear prediction
 
-    uint32_t backColor = LCD_COLOR_LIGHTBLUE;
+    uint32_t backColor = 0xFF006A6C;            // teal green
 
     // Initial image
     lcd_.DrawBitmap(0, 0, (uint8_t *)hattatsurei);
@@ -54,71 +53,52 @@
 
     lcd_.Clear(backColor);
 
-    Button *buttons[5];     // for select /a/, /i/, /u/, /e/, /o/
-    for (int n=0; n<5; n++)
-    {
-        char strButton[8];
-        sprintf(strButton, "/%c/", AIUEO[n]);
-        buttons[n] = new Button(lcd_, ts_, 430, 15+50*n, 50, 40,
-                                LCD_COLOR_BLUE, strButton, Font16);
-    }
-    Button fftButtonBar(lcd_, ts_, 340, 15, 80, 40, LCD_COLOR_MAGENTA, "FFT (Bar)", Font12);
-    Button fftButtonLine(lcd_, ts_, 340, 65, 80, 40, LCD_COLOR_MAGENTA, "FFT (Line)", Font12);
-    Button lpButton(lcd_, ts_, 340, 115, 80, 40, LCD_COLOR_MAGENTA, "LP", Font12);
-    lcd_.SetBackColor(backColor);
+    const string AIUEO[5] = {"/a/", "/i/", "/u/", "/e/", "/o/"};
+    ButtonGroup aiueo(lcd_, ts_, 430, 15, 50, 40,
+                      LCD_COLOR_BLUE, backColor,
+                      5, AIUEO, 0, 10, 1, Font16);
+
+    const string METHOD[3] = {"FFT (Bar)", "FFT (Line)", "LP"};
+    ButtonGroup method(lcd_, ts_, 340, 15, 80, 40,
+                       LCD_COLOR_BLUE, backColor,
+                       3, METHOD, 0, 10, 1, Font12);
+    uint32_t inActive = backColor & 0xD0FFFFFF;
+    for (int n=0; n<3; n++) method.Draw(n, inActive, LCD_COLOR_LIGHTGRAY);
 
     SpectrumDisplay disp(lcd_, N_FFT_, X0_, Y0_, DB1_, BIN_, W_DB, FS_);
     bool dataOk = false;
-    int vowel = -1;
     while (true)
     {
-        for (int k=0; k<N_VOWEL_; k++)
+        int vowel;
+        if (aiueo.GetTouchedNumber(vowel, 0xFF0000B0))
         {
-            if (buttons[k]->Touched(0xFF0000B0))
-            {
-                for (int n=0; n<N_DATA_; n++) sn[n] = sn_[k][n];
+            for (int n=0; n<N_DATA_; n++) sn[n] = sn_[vowel][n];
                 WaveformDisplay(lcd_, 50, 40, sn, N_DATA_, backColor);
 
-                if ((vowel != -1) && (k != vowel))
-                    buttons[vowel]->ReDraw();
-                vowel = k;
+            for (int n=0; n<N_DATA_; n++) sn_f[n] = sn[n];
+            fft_.Execute(sn_f, db1);
+            lpc_.Execute(sn_f, db2);
+            dataOk = true;
+            disp.Clear(backColor);
+            for (int n=0; n<3; n++) method.Redraw(n);
+        }
 
-                for (int n=0; n<N_DATA_; n++) sn_f[n] = sn[n];
-                fft_.Execute(sn_f, db1);
-                lpc_.Execute(sn_f, db2);
-                dataOk = true;
-                disp.Clear(backColor);
-
-                fftButtonBar.Draw(LCD_COLOR_MAGENTA);
-                fftButtonLine.Draw(LCD_COLOR_MAGENTA);
-                lpButton.Draw(LCD_COLOR_MAGENTA);
+        if (dataOk)
+        {
+            int k;
+            if (method.GetTouchedNumber(k, 0xFF0000B0))
+            {
+                switch (k)
+                {
+                    case 0: disp.BarChart(db1, backColor);
+                            break;
+                    case 1: disp.LineChart(db1, backColor);
+                            break;
+                    case 2: disp.LineChart(db2, backColor);
+                            break;
+                }   
             }
         }
-
-        if (fftButtonBar.Touched() && dataOk)
-        {
-            fftButtonBar.Draw(0xFFD000D0);
-            fftButtonLine.Draw(LCD_COLOR_MAGENTA);
-            lpButton.Draw(LCD_COLOR_MAGENTA);
-            disp.BarChart(db1, backColor);
-        }
-
-        if (fftButtonLine.Touched() && dataOk)
-        {
-            fftButtonBar.Draw(LCD_COLOR_MAGENTA);
-            fftButtonLine.Draw(0xFFD000D0);
-            lpButton.Draw(LCD_COLOR_MAGENTA);
-            disp.LineChart(db1, backColor);
-        }
-
-        if (lpButton.Touched() && dataOk)
-        {
-            fftButtonBar.Draw(LCD_COLOR_MAGENTA);
-            fftButtonLine.Draw(LCD_COLOR_MAGENTA);
-            lpButton.Draw(0xFFD000D0);
-            disp.LineChart(db2, backColor);
-        }
-
         wait(0.1);
     }
 }