Realtime spectrogram for DISCO-F746NG. On-board MEMS microphone is used for input sound signal. リアルタイムスペクトログラム.入力:MEMSマイク

Dependencies:   F746_GUI F746_SAI_IO UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Fri Mar 17 02:06:23 2017 +0000
Revision:
5:c0877670b0ac
Parent:
3:6a2c8ff46f73
Child:
6:b3885567877c
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:9470a174c910 1 //--------------------------------------------------------------
MikamiUitOpen 0:9470a174c910 2 // スペクトログラムで使う大域関数
MikamiUitOpen 0:9470a174c910 3 //
MikamiUitOpen 5:c0877670b0ac 4 // 2017/03/17, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:9470a174c910 5 //--------------------------------------------------------------
MikamiUitOpen 0:9470a174c910 6
MikamiUitOpen 0:9470a174c910 7 #ifndef METHOD_COLLECTION_HPP
MikamiUitOpen 0:9470a174c910 8 #define METHOD_COLLECTION_HPP
MikamiUitOpen 0:9470a174c910 9
MikamiUitOpen 0:9470a174c910 10 #include "mbed.h"
MikamiUitOpen 0:9470a174c910 11 #include "NumericLabel.hpp"
MikamiUitOpen 0:9470a174c910 12 #include "Matrix.hpp"
MikamiUitOpen 0:9470a174c910 13 #include "FFT_Analysis.hpp"
MikamiUitOpen 0:9470a174c910 14
MikamiUitOpen 0:9470a174c910 15 namespace Mikami
MikamiUitOpen 0:9470a174c910 16 {
MikamiUitOpen 0:9470a174c910 17 // 色相の違いで表示
MikamiUitOpen 0:9470a174c910 18 // 0.0 <= x <= 1.0
MikamiUitOpen 0:9470a174c910 19 uint32_t HueScale(float x)
MikamiUitOpen 0:9470a174c910 20 {
MikamiUitOpen 3:6a2c8ff46f73 21 if (x >= 1) return LCD_COLOR_WHITE;
MikamiUitOpen 0:9470a174c910 22 int r = 0;
MikamiUitOpen 0:9470a174c910 23 int b = 0;
MikamiUitOpen 0:9470a174c910 24
MikamiUitOpen 0:9470a174c910 25 if (x<0.5f) b = (x<0.33f) ? 255 : -(int)(1500.0f*x) + 750;
MikamiUitOpen 0:9470a174c910 26 else r = (0.67f<x) ? 255 : (int)(1500.0f*x) - 750;
MikamiUitOpen 0:9470a174c910 27 int g = 255 - (int)(1020.0f*(x - 0.5f)*(x - 0.5f));
MikamiUitOpen 0:9470a174c910 28
MikamiUitOpen 0:9470a174c910 29 return 0xFF000000 | (((r << 8) | g) << 8) | b;
MikamiUitOpen 0:9470a174c910 30 }
MikamiUitOpen 0:9470a174c910 31
MikamiUitOpen 0:9470a174c910 32 // 座標軸
MikamiUitOpen 0:9470a174c910 33 void DrawAxis(int x0, int y0, int w0, int h0, uint32_t axisColor,
MikamiUitOpen 5:c0877670b0ac 34 uint16_t ms100, uint16_t px1kHz, LCD_DISCO_F746NG &lcd)
MikamiUitOpen 0:9470a174c910 35 {
MikamiUitOpen 0:9470a174c910 36 const uint16_t TICK = 5; // 目盛線の長さ
MikamiUitOpen 0:9470a174c910 37 // 横標軸
MikamiUitOpen 5:c0877670b0ac 38 lcd.SetTextColor(axisColor);
MikamiUitOpen 5:c0877670b0ac 39 lcd.DrawHLine(x0, y0+TICK, w0);
MikamiUitOpen 0:9470a174c910 40 for (int n=0; n<=w0/ms100; n++)
MikamiUitOpen 5:c0877670b0ac 41 if ((n % 10)== 0) lcd.DrawVLine(x0+n*ms100, y0, 5);
MikamiUitOpen 5:c0877670b0ac 42 else lcd.DrawVLine(x0+n*ms100, y0+3, 2);
MikamiUitOpen 0:9470a174c910 43 for (int n=0; n<=w0/ms100; n+=10)
MikamiUitOpen 0:9470a174c910 44 NumericLabel<int> num(x0+n*ms100, y0+TICK+3,
MikamiUitOpen 0:9470a174c910 45 "%1d", (int)(n*0.1f), Label::CENTER);
MikamiUitOpen 0:9470a174c910 46 Label time(x0+w0/2, y0+22, "TIME [s]", Label::CENTER);
MikamiUitOpen 0:9470a174c910 47
MikamiUitOpen 0:9470a174c910 48 // 縦標軸
MikamiUitOpen 5:c0877670b0ac 49 lcd.SetTextColor(axisColor);
MikamiUitOpen 5:c0877670b0ac 50 lcd.DrawVLine(x0-TICK, y0-h0, h0);
MikamiUitOpen 0:9470a174c910 51 for (int n=0; n<=h0/px1kHz; n++)
MikamiUitOpen 5:c0877670b0ac 52 lcd.DrawHLine(x0-TICK, y0-n*px1kHz, TICK);
MikamiUitOpen 0:9470a174c910 53 for (int n=0; n<=h0/px1kHz; n++)
MikamiUitOpen 0:9470a174c910 54 NumericLabel<int> num(x0-TICK-12, y0-n*px1kHz-5, "%1d", n);
MikamiUitOpen 0:9470a174c910 55 Label hz(x0-32, y0-5*px1kHz-20, "[kHz]");
MikamiUitOpen 0:9470a174c910 56 }
MikamiUitOpen 0:9470a174c910 57
MikamiUitOpen 0:9470a174c910 58 // 色と dB の関係の表示
MikamiUitOpen 5:c0877670b0ac 59 void ColorDb(int y0, uint32_t axisColor, LCD_DISCO_F746NG &lcd)
MikamiUitOpen 0:9470a174c910 60 {
MikamiUitOpen 5:c0877670b0ac 61 lcd.SetTextColor(axisColor);
MikamiUitOpen 5:c0877670b0ac 62 lcd.DrawVLine(455, y0-100, 100);
MikamiUitOpen 0:9470a174c910 63 for (int n=0; n<=8; n++)
MikamiUitOpen 5:c0877670b0ac 64 lcd.DrawHLine(455, y0-(n*100)/8, 4);
MikamiUitOpen 0:9470a174c910 65 for (int n=0; n<=4; n++)
MikamiUitOpen 0:9470a174c910 66 NumericLabel<int> num(440, y0-(n*100)/4-5, "%2d", n*20);
MikamiUitOpen 0:9470a174c910 67 Label dB(432, y0-120, "[dB]");
MikamiUitOpen 0:9470a174c910 68
MikamiUitOpen 0:9470a174c910 69 for (int n=0; n<=100; n++)
MikamiUitOpen 0:9470a174c910 70 {
MikamiUitOpen 5:c0877670b0ac 71 lcd.SetTextColor(HueScale(n/100.0f));
MikamiUitOpen 5:c0877670b0ac 72 lcd.DrawHLine(460, y0-n, 16);
MikamiUitOpen 0:9470a174c910 73 }
MikamiUitOpen 0:9470a174c910 74 }
MikamiUitOpen 0:9470a174c910 75
MikamiUitOpen 0:9470a174c910 76 // スペクトルの更新
MikamiUitOpen 0:9470a174c910 77 void SpectrumUpdate(Matrix<uint32_t> &x, FftAnalyzer &analyzer,
MikamiUitOpen 0:9470a174c910 78 const Array<float> &sn, const Array<float> &db)
MikamiUitOpen 0:9470a174c910 79 {
MikamiUitOpen 0:9470a174c910 80 // 過去のスペクトルを一つずらす
MikamiUitOpen 0:9470a174c910 81 for (int n=0; n<x.Rows()-1; n++)
MikamiUitOpen 0:9470a174c910 82 for (int k=0; k<x.Cols(); k++)
MikamiUitOpen 0:9470a174c910 83 x[n][k] = x[n+1][k];
MikamiUitOpen 0:9470a174c910 84
MikamiUitOpen 0:9470a174c910 85 // 新しいスペクトル
MikamiUitOpen 0:9470a174c910 86 analyzer.Execute(sn, db);
MikamiUitOpen 0:9470a174c910 87 const float FACTOR = 1.0f/80.0f; // 表示範囲: 0 ~ 80 dB
MikamiUitOpen 0:9470a174c910 88 for (int k=0; k<=x.Cols(); k++)
MikamiUitOpen 0:9470a174c910 89 x[x.Rows()-1][k] = HueScale(FACTOR*((db[k] > 20) ? db[k]-20 : 0));
MikamiUitOpen 0:9470a174c910 90 }
MikamiUitOpen 0:9470a174c910 91
MikamiUitOpen 0:9470a174c910 92 // スペクトルの表示
MikamiUitOpen 0:9470a174c910 93 void DisplaySpectrum(const Matrix<uint32_t> &x, int x0, int y0,
MikamiUitOpen 5:c0877670b0ac 94 int hBar, LCD_DISCO_F746NG &lcd)
MikamiUitOpen 0:9470a174c910 95 {
MikamiUitOpen 0:9470a174c910 96 for (int n=0; n<x.Rows(); n++)
MikamiUitOpen 0:9470a174c910 97 for (int k=0; k<x.Cols(); k++)
MikamiUitOpen 0:9470a174c910 98 {
MikamiUitOpen 5:c0877670b0ac 99 lcd.SetTextColor(x[n][k]);
MikamiUitOpen 5:c0877670b0ac 100 lcd.DrawHLine(x0+n*hBar, y0-k, hBar);
MikamiUitOpen 0:9470a174c910 101 }
MikamiUitOpen 0:9470a174c910 102 }
MikamiUitOpen 0:9470a174c910 103 }
MikamiUitOpen 0:9470a174c910 104 #endif // METHOD_COLLECTION_HPP