不韋 呂 / F746_MySoundMachine

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Mon Sep 26 07:07:05 2016 +0000
Revision:
2:fcba17e3d573
Parent:
0:224dccbc4edd
Child:
7:2735829e6657
3

Who changed what in which revision?

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