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