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:
0:c35b8a23a863
Child:
2:4e34945b5c00
diff -r 000000000000 -r c35b8a23a863 SpactrumAnalysisClasses/SpectrumDisplay.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpactrumAnalysisClasses/SpectrumDisplay.cpp	Mon Oct 26 08:06:57 2015 +0000
@@ -0,0 +1,106 @@
+//-------------------------------------------------------
+// Class for display spectrum
+// Copyright (c) 2015 MIKAMI, Naoki,  2015/10/26
+//-------------------------------------------------------
+
+#include "SpectrumDisplay.hpp"
+
+namespace Mikami
+{
+    SpectrumDisplay::SpectrumDisplay(
+            LCD_DISCO_F746NG &lcd,
+            int nFft, int x0, int y0,
+            float db1, int bin, float maxDb, int fs)
+        : N_FFT_(nFft), X0_(x0), Y0_(y0),
+          DB1_(db1), BIN_(bin), MAX_DB_(maxDb), FS_(fs),
+          LCD_(&lcd)
+    {
+        AxisX();
+        AxisY();
+    }
+
+    void SpectrumDisplay::BarChart(float db[], uint32_t backColor)
+    {
+        const float OFFSET = 60.0f;
+        for (int n=1; n<=N_FFT_/2; n++)
+        {
+            float h = ((db[n] + OFFSET) >= 0)? db[n] + OFFSET : 0;
+            
+            int y = Y0_ - (int)(h*DB1_);
+            LCD_->SetTextColor(LCD_COLOR_CYAN);
+            LCD_->DrawLine(X0_+n, Y0_-1, X0_+n, y);
+            LCD_->SetTextColor(backColor);
+            LCD_->DrawLine(X0_+n, y-1, X0_+n, Y0_-(int)(MAX_DB_*DB1_));
+        }
+        LCD_->SetTextColor(LCD_COLOR_YELLOW);
+        LCD_->DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_);
+    }
+
+    void SpectrumDisplay::LineChart(float db[], uint32_t backColor)
+    {
+        const float OFFSET = 60.0f;
+        LCD_->SetTextColor(backColor);
+        LCD_->FillRect(X0_+1, Y0_-(int)(MAX_DB_*DB1_),
+                       N_FFT_*BIN_/2, MAX_DB_*DB1_);
+
+        float h = ((db[1] + OFFSET) > 0)? db[1] + OFFSET : 0;
+        int y1 = Y0_ - (int)(h*DB1_);
+        for (int n=1; n<N_FFT_/2; n++)
+        {
+            float h2 = ((db[n+1] + OFFSET) > 0)? db[n+1] + OFFSET : 0;
+            if (h2 > MAX_DB_) h2 = MAX_DB_;
+            int y2 = Y0_ - (int)(h2*DB1_);
+            LCD_->SetTextColor(LCD_COLOR_CYAN);
+            LCD_->DrawLine(X0_+n, y1, X0_+n+1, y2);
+            y1 = y2;
+        }
+        LCD_->SetTextColor(LCD_COLOR_YELLOW);
+        LCD_->DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_);
+    }
+
+    // Clear Spectrum
+    void SpectrumDisplay::Clear(uint32_t backColor)
+    {
+        LCD_->SetTextColor(backColor);
+        LCD_->FillRect(X0_+1, Y0_-(int)(MAX_DB_*DB1_),
+                       N_FFT_*BIN_/2, MAX_DB_*DB1_);
+    }
+
+    // x-axis
+    void SpectrumDisplay::AxisX()
+    {
+        LCD_->SetFont(&Font12);
+
+        LCD_->SetTextColor(LCD_COLOR_YELLOW);
+        LCD_->DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_);
+        float dx = BIN_*(N_FFT_*1000.0f)/(float)FS_;
+        for (int n=0; n<=(FS_/1000)/2; n++)
+        {
+            int xTick = X0_ + (int)(dx*n + 0.5f);
+            char s[5];
+            sprintf(s, "%d", n);
+            LCD_->DisplayStringAt(xTick-4, Y0_+10, (uint8_t *)s, LEFT_MODE);
+            LCD_->DrawLine(xTick, Y0_, xTick, Y0_+5);
+        }
+        LCD_->DisplayStringAt(X0_+74, Y0_+24, (uint8_t *)"Frequency [kHz]", LEFT_MODE);
+    }
+
+    // y-axis
+    void SpectrumDisplay::AxisY()
+    {
+        LCD_->SetFont(&Font12);
+        
+        LCD_->SetTextColor(LCD_COLOR_YELLOW);
+        LCD_->DrawLine(X0_, Y0_+5, X0_, Y0_-(int)(MAX_DB_*DB1_));
+        for (int n=0; n<=(int)MAX_DB_; n+=20)
+        {
+            int yTick = Y0_-(int)(DB1_*n);
+            char s[5];
+            sprintf(s, "%3d", n-60);
+            LCD_->DisplayStringAt(X0_-30, yTick-5, (uint8_t *)s, LEFT_MODE);
+            LCD_->DrawLine(X0_-5, yTick, X0_, yTick);
+        }
+        LCD_->DisplayStringAt(X0_-27, Y0_-(int)(DB1_*MAX_DB_)-18, (uint8_t *)"[dB]", LEFT_MODE);
+    }
+}
+