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@1:f570067f3841, 2016-05-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |