Integrated program of 4 different kinds of application programs for processing sound signal. 4種類のサウンド信号処理を統合したプログラム.

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Revision:
0:224dccbc4edd
Child:
11:5eb943ee9b91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MySpectrogram/MethodCollection.hpp	Mon Aug 15 07:18:07 2016 +0000
@@ -0,0 +1,104 @@
+//--------------------------------------------------------------
+//  スペクトログラムで使う大域関数
+//
+//  2016/08/11, Copyright (c) 2016 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#ifndef METHOD_COLLECTION_HPP
+#define METHOD_COLLECTION_HPP
+
+#include "mbed.h"
+#include "NumericLabel.hpp"
+#include "Matrix.hpp"
+#include "FFT_Analysis.hpp"
+
+namespace Mikami
+{
+    // 色相の違いで表示
+    //      0.0 <= x <= 1.0
+    uint32_t HueScale(float x)
+    {
+        if (x >= 1) return LCD_COLOR_WHITE;
+        int r = 0;
+        int b = 0;
+
+        if (x<0.5f) b = (x<0.33f) ? 255 : -(int)(1500.0f*x) + 750;
+        else        r = (0.67f<x) ? 255 :  (int)(1500.0f*x) - 750;
+        int g = 255 - (int)(1020.0f*(x - 0.5f)*(x - 0.5f));
+
+        return 0xFF000000 | (((r << 8) | g) << 8) | b;
+    }
+
+    // 座標軸
+    void DrawAxis(int x0, int y0, int w0, int h0, uint32_t axisColor,
+                  uint16_t ms100, uint16_t px1kHz, LCD_DISCO_F746NG *lcd)
+    {
+        const uint16_t TICK = 5;    // 目盛線の長さ
+        // 横標軸
+        lcd->SetTextColor(axisColor);
+        lcd->DrawHLine(x0, y0+TICK, w0);
+        for (int n=0; n<=w0/ms100; n++)
+            if ((n % 10)== 0) lcd->DrawVLine(x0+n*ms100, y0, 5);
+            else              lcd->DrawVLine(x0+n*ms100, y0+3, 2);
+        for (int n=0; n<=w0/ms100; n+=10)
+            NumericLabel<int> num(x0+n*ms100, y0+TICK+3,
+                                  "%1d", (int)(n*0.1f), Label::CENTER);
+        Label time(x0+w0/2, y0+22, "TIME [s]", Label::CENTER);
+    
+        // 縦標軸
+        lcd->SetTextColor(axisColor);
+        lcd->DrawVLine(x0-TICK, y0-h0, h0);
+        for (int n=0; n<=h0/px1kHz; n++)
+            lcd->DrawHLine(x0-TICK, y0-n*px1kHz, TICK);
+        for (int n=0; n<=h0/px1kHz; n++)
+            NumericLabel<int> num(x0-TICK-12, y0-n*px1kHz-5, "%1d", n);
+        Label hz(x0-32, y0-5*px1kHz-20, "[kHz]");
+    }
+
+    // 色と dB の関係の表示
+    void ColorDb(int y0, uint32_t axisColor, LCD_DISCO_F746NG *lcd)
+    {
+        lcd->SetTextColor(axisColor);
+        lcd->DrawVLine(455, y0-100, 100);
+        for (int n=0; n<=8; n++)
+            lcd->DrawHLine(455, y0-(n*100)/8, 4);
+        for (int n=0; n<=4; n++)
+            NumericLabel<int> num(440, y0-(n*100)/4-5, "%2d", n*20);
+        Label dB(432, y0-120, "[dB]");
+
+        for (int n=0; n<=100; n++)
+        {
+            lcd->SetTextColor(HueScale(n/100.0f));
+            lcd->DrawHLine(460, y0-n, 16);
+        }
+    }
+
+    // スペクトルの更新
+    void SpectrumUpdate(Matrix<uint32_t> &x, FftAnalyzer &analyzer,
+                        const Array<float> &sn, const Array<float> &db)
+    {
+        // 過去のスペクトルを一つずらす
+        for (int n=0; n<x.Rows()-1; n++)
+            for (int k=0; k<x.Cols(); k++)
+                x[n][k] = x[n+1][k];
+
+        // 新しいスペクトル
+        analyzer.Execute(sn, db);
+        const float FACTOR = 1.0f/80.0f;    // 表示範囲: 0 ~ 80 dB
+        for (int k=0; k<=x.Cols(); k++)
+            x[x.Rows()-1][k] = HueScale(FACTOR*((db[k] > 20) ? db[k]-20 : 0));
+    }
+
+    // スペクトルの表示
+    void DisplaySpectrum(const Matrix<uint32_t> &x, int x0, int y0,
+                         int hBar, LCD_DISCO_F746NG *lcd)
+    {
+        for (int n=0; n<x.Rows(); n++)
+            for (int k=0; k<x.Cols(); k++)
+            {
+                lcd->SetTextColor(x[n][k]);
+                lcd->DrawHLine(x0+n*hBar, y0-k, hBar);
+            }
+    }
+}
+#endif  // METHOD_COLLECTION_HPP