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:
Sun May 22 06:49:25 2016 +0000
Revision:
1:f570067f3841
Parent:
0:9470a174c910
Child:
2:1f092ac020e1
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:9470a174c910 1 //------------------------------------------------
MikamiUitOpen 0:9470a174c910 2 // Realtime spectrogram
MikamiUitOpen 0:9470a174c910 3 // Input: MEMS microphone
MikamiUitOpen 0:9470a174c910 4 //
MikamiUitOpen 0:9470a174c910 5 // 2016/05/22, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:9470a174c910 6 //------------------------------------------------
MikamiUitOpen 0:9470a174c910 7
MikamiUitOpen 0:9470a174c910 8 #include "SAI_InOut.hpp"
MikamiUitOpen 0:9470a174c910 9 #include "ButtonGroup.hpp"
MikamiUitOpen 0:9470a174c910 10 #include "Label.hpp"
MikamiUitOpen 0:9470a174c910 11 #include "MethodCollection.hpp"
MikamiUitOpen 0:9470a174c910 12
MikamiUitOpen 0:9470a174c910 13 #include "Matrix.hpp"
MikamiUitOpen 0:9470a174c910 14
MikamiUitOpen 0:9470a174c910 15 using namespace Mikami;
MikamiUitOpen 0:9470a174c910 16
MikamiUitOpen 0:9470a174c910 17 int main()
MikamiUitOpen 0:9470a174c910 18 {
MikamiUitOpen 0:9470a174c910 19 const int FS = I2S_AUDIOFREQ_16K; // 標本化周波数: 16 kHz
MikamiUitOpen 0:9470a174c910 20 const int N_FFT = 512; // FFT の点数
MikamiUitOpen 0:9470a174c910 21 const float FRAME = (N_FFT/(float)FS)*1000.0f; // 1 フレームに対応する時間(単位:ms)
MikamiUitOpen 0:9470a174c910 22
MikamiUitOpen 0:9470a174c910 23 const int X0 = 40; // 表示領域の x 座標の原点
MikamiUitOpen 0:9470a174c910 24 const int Y0 = 200; // 表示領域の y 座標の原点
MikamiUitOpen 0:9470a174c910 25 const int H0 = 160; // 表示する際の周波数軸の長さ(5 kHz に対応)
MikamiUitOpen 0:9470a174c910 26 const uint16_t PX_1KHZ = H0/5; // 1 kHz に対応するピクセル数
MikamiUitOpen 0:9470a174c910 27 const int W0 = 360; // 横方向の全体の表示の幅(単位:ピクセル)
MikamiUitOpen 0:9470a174c910 28 const int H_BAR = 2; // 表示する際の 1 フレームに対応する横方向のピクセル数
MikamiUitOpen 0:9470a174c910 29 const int SIZE_X = W0/H_BAR;
MikamiUitOpen 0:9470a174c910 30 const uint16_t MS100 = 100*H_BAR/FRAME; // 100 ms に対応するピクセル数
MikamiUitOpen 0:9470a174c910 31 const uint32_t AXIS_COLOR = LCD_COLOR_WHITE;//0xFFCCFFFF;
MikamiUitOpen 0:9470a174c910 32
MikamiUitOpen 0:9470a174c910 33 Matrix<uint32_t> spectra(SIZE_X, H0+1, GuiBase::ENUM_BACK);
MikamiUitOpen 0:9470a174c910 34
MikamiUitOpen 0:9470a174c910 35 SaiIO mySai(SaiIO::INPUT, N_FFT+1, FS,
MikamiUitOpen 0:9470a174c910 36 INPUT_DEVICE_DIGITAL_MICROPHONE_2);
MikamiUitOpen 1:f570067f3841 37 // INPUT_DEVICE_INPUT_LINE_1);
MikamiUitOpen 0:9470a174c910 38
MikamiUitOpen 0:9470a174c910 39 LCD_DISCO_F746NG *lcd = GuiBase::GetLcdPtr(); // LCD 表示器のオブジェクト
MikamiUitOpen 0:9470a174c910 40 lcd->Clear(GuiBase::ENUM_BACK);
MikamiUitOpen 1:f570067f3841 41 Label myLabel1(240, 2, "Real-time spectrogram 15:47", Label::CENTER, Font16);
MikamiUitOpen 0:9470a174c910 42
MikamiUitOpen 0:9470a174c910 43 // ButtonGroup の設定
MikamiUitOpen 0:9470a174c910 44 const uint16_t B_W = 50;
MikamiUitOpen 0:9470a174c910 45 const uint16_t B_Y = 242;
MikamiUitOpen 0:9470a174c910 46 const uint16_t B_H = 30;
MikamiUitOpen 0:9470a174c910 47 const string RUN_STOP[2] = {"RUN", "STOP"};
MikamiUitOpen 0:9470a174c910 48 ButtonGroup runStop(325, B_Y, B_W, B_H, 2, RUN_STOP, 0, 0, 2, 1);
MikamiUitOpen 0:9470a174c910 49
MikamiUitOpen 0:9470a174c910 50 Button clear(430, B_Y, B_W, B_H, "CLEAR");
MikamiUitOpen 0:9470a174c910 51 // ButtonGroup の設定(ここまで)
MikamiUitOpen 0:9470a174c910 52
MikamiUitOpen 0:9470a174c910 53 // 座標軸
MikamiUitOpen 0:9470a174c910 54 DrawAxis(X0, Y0, W0, H0, AXIS_COLOR, MS100, PX_1KHZ, lcd);
MikamiUitOpen 0:9470a174c910 55
MikamiUitOpen 0:9470a174c910 56 Array<float> sn(N_FFT+1);
MikamiUitOpen 0:9470a174c910 57 Array<float> db(N_FFT/2+1);
MikamiUitOpen 0:9470a174c910 58
MikamiUitOpen 0:9470a174c910 59 // 色と dB の関係の表示
MikamiUitOpen 0:9470a174c910 60 ColorDb(Y0, AXIS_COLOR, lcd);
MikamiUitOpen 0:9470a174c910 61
MikamiUitOpen 0:9470a174c910 62 FftAnalyzer fftAnalyzer(N_FFT+1, N_FFT);
MikamiUitOpen 0:9470a174c910 63
MikamiUitOpen 0:9470a174c910 64 // ループ内で使う変数の初期化
MikamiUitOpen 0:9470a174c910 65 int stop = 1; // 0: run, 1: stop
MikamiUitOpen 0:9470a174c910 66
MikamiUitOpen 0:9470a174c910 67 // データ読み込み開始
MikamiUitOpen 0:9470a174c910 68 mySai.RecordIn();
MikamiUitOpen 0:9470a174c910 69
MikamiUitOpen 0:9470a174c910 70 while (true)
MikamiUitOpen 0:9470a174c910 71 {
MikamiUitOpen 0:9470a174c910 72 runStop.GetTouchedNumber(stop);
MikamiUitOpen 0:9470a174c910 73
MikamiUitOpen 0:9470a174c910 74 if (stop == 0)
MikamiUitOpen 0:9470a174c910 75 {
MikamiUitOpen 0:9470a174c910 76 if (mySai.IsCaptured())
MikamiUitOpen 0:9470a174c910 77 {
MikamiUitOpen 0:9470a174c910 78 // 1フレーム分の信号の入力
MikamiUitOpen 0:9470a174c910 79 for (int n=0; n<mySai.GetLength(); n++)
MikamiUitOpen 0:9470a174c910 80 {
MikamiUitOpen 0:9470a174c910 81 int16_t xL, xR;
MikamiUitOpen 0:9470a174c910 82 mySai.Input(xL, xR);
MikamiUitOpen 0:9470a174c910 83 sn[n] = (float)xL;
MikamiUitOpen 0:9470a174c910 84 }
MikamiUitOpen 0:9470a174c910 85 mySai.ResetCaptured();
MikamiUitOpen 0:9470a174c910 86
MikamiUitOpen 0:9470a174c910 87 // スペクトルの更新
MikamiUitOpen 0:9470a174c910 88 SpectrumUpdate(spectra, fftAnalyzer, sn, db);
MikamiUitOpen 0:9470a174c910 89 // スペクトルの表示
MikamiUitOpen 0:9470a174c910 90 DisplaySpectrum(spectra, X0, Y0, H_BAR, lcd);
MikamiUitOpen 0:9470a174c910 91 }
MikamiUitOpen 0:9470a174c910 92 }
MikamiUitOpen 0:9470a174c910 93 else
MikamiUitOpen 0:9470a174c910 94 {
MikamiUitOpen 0:9470a174c910 95 if (clear.Touched())
MikamiUitOpen 0:9470a174c910 96 {
MikamiUitOpen 0:9470a174c910 97 spectra.Fill(GuiBase::ENUM_BACK); // スペクトルの表示をクリア
MikamiUitOpen 0:9470a174c910 98 DisplaySpectrum(spectra, X0, Y0, H_BAR, lcd);
MikamiUitOpen 0:9470a174c910 99 clear.Draw();
MikamiUitOpen 0:9470a174c910 100 }
MikamiUitOpen 0:9470a174c910 101 }
MikamiUitOpen 0:9470a174c910 102 }
MikamiUitOpen 0:9470a174c910 103 }