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@6:b3885567877c, 2017-04-10 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Apr 10 13:43:07 2017 +0000
- Revision:
- 6:b3885567877c
- Parent:
- 5:c0877670b0ac
7
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 | 6:b3885567877c | 5 | // 2017/04/10, Copyright (c) 2017 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 | using namespace Mikami; |
MikamiUitOpen | 0:9470a174c910 | 12 | |
MikamiUitOpen | 0:9470a174c910 | 13 | int main() |
MikamiUitOpen | 0:9470a174c910 | 14 | { |
MikamiUitOpen | 6:b3885567877c | 15 | const int FS = AUDIO_FREQUENCY_16K; // 標本化周波数:16 kHz |
MikamiUitOpen | 0:9470a174c910 | 16 | const int N_FFT = 512; // FFT の点数 |
MikamiUitOpen | 6:b3885567877c | 17 | SaiIO mySai(SaiIO::INPUT, N_FFT+1, FS, // 入力用 |
MikamiUitOpen | 6:b3885567877c | 18 | INPUT_DEVICE_DIGITAL_MICROPHONE_2); // 入力デバイス:MEMS マイク |
MikamiUitOpen | 0:9470a174c910 | 19 | |
MikamiUitOpen | 6:b3885567877c | 20 | LCD_DISCO_F746NG &lcd = GuiBase::GetLcd(); // LCD 表示器のオブジェクトの参照を取得 |
MikamiUitOpen | 5:c0877670b0ac | 21 | lcd.Clear(GuiBase::ENUM_BACK); |
MikamiUitOpen | 2:1f092ac020e1 | 22 | Label myLabel1(240, 2, "Real-time spectrogram", Label::CENTER, Font16); |
MikamiUitOpen | 0:9470a174c910 | 23 | |
MikamiUitOpen | 0:9470a174c910 | 24 | // ButtonGroup の設定 |
MikamiUitOpen | 0:9470a174c910 | 25 | const uint16_t B_W = 50; |
MikamiUitOpen | 0:9470a174c910 | 26 | const uint16_t B_Y = 242; |
MikamiUitOpen | 0:9470a174c910 | 27 | const uint16_t B_H = 30; |
MikamiUitOpen | 0:9470a174c910 | 28 | const string RUN_STOP[2] = {"RUN", "STOP"}; |
MikamiUitOpen | 0:9470a174c910 | 29 | ButtonGroup runStop(325, B_Y, B_W, B_H, 2, RUN_STOP, 0, 0, 2, 1); |
MikamiUitOpen | 6:b3885567877c | 30 | |
MikamiUitOpen | 6:b3885567877c | 31 | Button clearButton(430, B_Y, B_W, B_H, "CLEAR"); |
MikamiUitOpen | 6:b3885567877c | 32 | clearButton.Inactivate(); |
MikamiUitOpen | 0:9470a174c910 | 33 | |
MikamiUitOpen | 0:9470a174c910 | 34 | // 座標軸 |
MikamiUitOpen | 6:b3885567877c | 35 | const uint16_t X0 = 40; // 表示領域の x 座標の原点 |
MikamiUitOpen | 6:b3885567877c | 36 | const uint16_t Y0 = 200; // 表示領域の y 座標の原点 |
MikamiUitOpen | 6:b3885567877c | 37 | const uint16_t PX_1KHZ = 32; // 1 kHz に対応するピクセル数 |
MikamiUitOpen | 6:b3885567877c | 38 | const uint16_t H0 = PX_1KHZ*5; // 周波数軸の長さ(5 kHz に対応)に対応するピクセル数 |
MikamiUitOpen | 6:b3885567877c | 39 | const uint16_t W0 = 360; // 横方向の全体の表示の幅(単位:ピクセル) |
MikamiUitOpen | 6:b3885567877c | 40 | const float FRAME = (N_FFT/(float)FS)*1000.0f; // 1 フレームに対応する時間(単位:ms) |
MikamiUitOpen | 6:b3885567877c | 41 | const uint16_t H_BAR = 2; // 表示する際の 1 フレームに対応する横方向のピクセル数 |
MikamiUitOpen | 6:b3885567877c | 42 | const uint16_t MS100 = 100*H_BAR/FRAME; // 100 ms に対応するピクセル数 |
MikamiUitOpen | 6:b3885567877c | 43 | const uint32_t AXIS_COLOR = LCD_COLOR_WHITE; |
MikamiUitOpen | 0:9470a174c910 | 44 | DrawAxis(X0, Y0, W0, H0, AXIS_COLOR, MS100, PX_1KHZ, lcd); |
MikamiUitOpen | 0:9470a174c910 | 45 | |
MikamiUitOpen | 0:9470a174c910 | 46 | // 色と dB の関係の表示 |
MikamiUitOpen | 0:9470a174c910 | 47 | ColorDb(Y0, AXIS_COLOR, lcd); |
MikamiUitOpen | 6:b3885567877c | 48 | |
MikamiUitOpen | 6:b3885567877c | 49 | Array<float> sn(N_FFT+1); // スペクトル解析する信号を格納するバッファ |
MikamiUitOpen | 6:b3885567877c | 50 | Array<float> db(N_FFT/2+1); // 計算された対数スペクトルを格納するバッファ |
MikamiUitOpen | 6:b3885567877c | 51 | // スペクトルの大きさに対応する色データを格納する2次元配列 |
MikamiUitOpen | 6:b3885567877c | 52 | Matrix<uint32_t> spectra(W0/H_BAR, H0+1, GuiBase::ENUM_BACK); |
MikamiUitOpen | 0:9470a174c910 | 53 | FftAnalyzer fftAnalyzer(N_FFT+1, N_FFT); |
MikamiUitOpen | 0:9470a174c910 | 54 | |
MikamiUitOpen | 0:9470a174c910 | 55 | // ループ内で使う変数の初期化 |
MikamiUitOpen | 6:b3885567877c | 56 | int stop = 0; // 0: run, 1: stop |
MikamiUitOpen | 3:6a2c8ff46f73 | 57 | |
MikamiUitOpen | 6:b3885567877c | 58 | while(!runStop.Touched(0)) {} // "RUN" をタッチするまで待つ |
MikamiUitOpen | 0:9470a174c910 | 59 | // データ読み込み開始 |
MikamiUitOpen | 0:9470a174c910 | 60 | mySai.RecordIn(); |
MikamiUitOpen | 6:b3885567877c | 61 | while(!mySai.IsCaptured()) {} |
MikamiUitOpen | 6:b3885567877c | 62 | |
MikamiUitOpen | 0:9470a174c910 | 63 | while (true) |
MikamiUitOpen | 0:9470a174c910 | 64 | { |
MikamiUitOpen | 0:9470a174c910 | 65 | runStop.GetTouchedNumber(stop); |
MikamiUitOpen | 0:9470a174c910 | 66 | if (stop == 0) |
MikamiUitOpen | 0:9470a174c910 | 67 | { |
MikamiUitOpen | 6:b3885567877c | 68 | clearButton.Inactivate(); |
MikamiUitOpen | 0:9470a174c910 | 69 | if (mySai.IsCaptured()) |
MikamiUitOpen | 0:9470a174c910 | 70 | { |
MikamiUitOpen | 0:9470a174c910 | 71 | // 1フレーム分の信号の入力 |
MikamiUitOpen | 0:9470a174c910 | 72 | for (int n=0; n<mySai.GetLength(); n++) |
MikamiUitOpen | 0:9470a174c910 | 73 | { |
MikamiUitOpen | 0:9470a174c910 | 74 | int16_t xL, xR; |
MikamiUitOpen | 0:9470a174c910 | 75 | mySai.Input(xL, xR); |
MikamiUitOpen | 0:9470a174c910 | 76 | sn[n] = (float)xL; |
MikamiUitOpen | 0:9470a174c910 | 77 | } |
MikamiUitOpen | 0:9470a174c910 | 78 | |
MikamiUitOpen | 0:9470a174c910 | 79 | // スペクトルの更新 |
MikamiUitOpen | 0:9470a174c910 | 80 | SpectrumUpdate(spectra, fftAnalyzer, sn, db); |
MikamiUitOpen | 0:9470a174c910 | 81 | // スペクトルの表示 |
MikamiUitOpen | 0:9470a174c910 | 82 | DisplaySpectrum(spectra, X0, Y0, H_BAR, lcd); |
MikamiUitOpen | 0:9470a174c910 | 83 | } |
MikamiUitOpen | 0:9470a174c910 | 84 | } |
MikamiUitOpen | 0:9470a174c910 | 85 | else |
MikamiUitOpen | 0:9470a174c910 | 86 | { |
MikamiUitOpen | 6:b3885567877c | 87 | clearButton.Activate(); |
MikamiUitOpen | 6:b3885567877c | 88 | if (clearButton.Touched()) |
MikamiUitOpen | 0:9470a174c910 | 89 | { |
MikamiUitOpen | 6:b3885567877c | 90 | spectra.Fill(GuiBase::ENUM_BACK); // スペクトルの表示をクリアするための処理 |
MikamiUitOpen | 6:b3885567877c | 91 | DisplaySpectrum(spectra, X0, Y0, H_BAR, lcd); // スペクトルの表示をクリア |
MikamiUitOpen | 6:b3885567877c | 92 | clearButton.Draw(); |
MikamiUitOpen | 0:9470a174c910 | 93 | } |
MikamiUitOpen | 0:9470a174c910 | 94 | } |
MikamiUitOpen | 0:9470a174c910 | 95 | } |
MikamiUitOpen | 0:9470a174c910 | 96 | } |
MikamiUitOpen | 6:b3885567877c | 97 |