
Realtime sound spectrogram using FFT or linear prediction. Spectrogram is displayed on the display of PC. リアルタイム・スペクトログラム.解析の手法:FFT,線形予測法.スペクトログラムは PC のディスプレー装置に表示される.PC 側のプログラム:F446_Spectrogram.
Dependencies: Array_Matrix mbed SerialTxRxIntr F446_AD_DA UIT_FFT_Real
Revision 2:acc16e3f91ac, committed 2017-03-08
- Comitter:
- MikamiUitOpen
- Date:
- Wed Mar 08 09:46:11 2017 +0000
- Parent:
- 1:cc596a8d40c9
- Child:
- 3:74a50c14d3fd
- Commit message:
- 3
Changed in this revision
--- a/main.cpp Tue Feb 21 13:25:58 2017 +0000 +++ b/main.cpp Wed Mar 08 09:46:11 2017 +0000 @@ -10,7 +10,7 @@ // ● ボーレート: 460800 baud // ● 受信データの文字列の終了マーク: "\r" // -// 2017/02/21, 三上 直樹 +// 2017/03/08, 三上 直樹 //--------------------------------------------------------------------- #include "mbed.h" @@ -49,16 +49,15 @@ FftAnalyzer *fftAnlz_ = new FftAnalyzer(N_DATA_, N_FFT_); // 線形予測法 によるスペクトル解析オブジェクトの生成 LpcAnalyzer *lpcAnlz_ = new LpcAnalyzer(N_DATA_, N_FFT_, 20); -AnalyzerBase *analyzer_ = fftAnlz_; +AnalyzerBase *analyzer_ = fftAnlz_; // 最初は FFT を使う Serial pc_(USBTX, USBRX); // PC との通信で使うオブジェクト DigitalOut myLed_(D10, 1); // LED1 が使えないので D10 を使う -DigitalOut pulse(D2, 0); // 時間測定用 +const int DATA_SIZE_ = N_FFT_/2 + 1; +Array<uint16_t> txData_(DATA_SIZE_); // 送信用データ +string rxBuffer_; // 受信バッファ -const int DATA_SIZE_ = N_FFT_/2 + 1; -Array<int16_t> txData_(DATA_SIZE_); // 送信用データ -string rxBuffer_; // 受信バッファ float levelShift_ = 20; // dB 計算の際のシフト量の初期値 float empha_ = 1.0f; // 高域強調器の係数 @@ -170,12 +169,13 @@ analyzer_->Execute(sn, db); // スペクトル解析の実行 - const float FACTOR = 4095.0f/60.0f; // 表示範囲: 0 ~ 60 dB + const float FACTOR = 10000.0f/80.0f; // 表示範囲: 0 ~ 80 dB for (int n=0; n<DATA_SIZE_; n++) { - int16_t spc = (int16_t)(FACTOR*(db[n] + 30.0f + levelShift_)); - if (spc > 4095) spc = 4095; - if (spc < 0) spc = 0; + float xDb = FACTOR*(db[n] + 30.0f + levelShift_); + if (xDb > 10000.0f) xDb = 10000.0f; + if (xDb < 0.0f) xDb = 0.0f; + uint16_t spc = (uint16_t)xDb; txData_[n] = spc; } ready = true; // スペクトル解析終了
--- a/myFunctions.cpp Tue Feb 21 13:25:58 2017 +0000 +++ b/myFunctions.cpp Wed Mar 08 09:46:11 2017 +0000 @@ -18,13 +18,15 @@ } } -// データを PC へ転送(12 ビットを 2 文字で表すコード化を利用) -void Xfer(Array<int16_t> &xn) +// データを PC へ転送(0 ~ 10,000 の範囲の値を 2 文字で表すコード化を利用) +void Xfer(Array<uint16_t> &xn) { for (int n=0; n<xn.Length(); n++) - pc_.printf("%c%c", ((xn[n] & 0xFC0) >> 6) + ' ', - (xn[n] & 0x3F) + ' '); - + { + div_t a = div(xn[n], 100); + pc_.putc(a.quot + 0x10); + pc_.putc(a.rem + 0x10); + } pc_.printf("\n"); // データの最後を通知 wait_ms(1); // これは必須 pc_.printf("EOT\n"); // 転送終了であることを送信
--- a/myFunctions.hpp Tue Feb 21 13:25:58 2017 +0000 +++ b/myFunctions.hpp Wed Mar 08 09:46:11 2017 +0000 @@ -17,6 +17,6 @@ // シリアル・ポートの受信割り込み void Rx(); // データを PC へ転送 -void Xfer(Array<int16_t> &xn); +void Xfer(Array<uint16_t> &xn); #endif // MY_FUNCTIONS_HPP