Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real
MySpectrogram/SpectrogramMain.hpp@2:fcba17e3d573, 2016-09-26 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |