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

Files at this revision

API Documentation at this revision

Comitter:
MikamiUitOpen
Date:
Wed Mar 08 09:46:11 2017 +0000
Parent:
1:cc596a8d40c9
Child:
3:74a50c14d3fd
Commit message:
3

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
myFunctions.cpp Show annotated file Show diff for this revision Revisions of this file
myFunctions.hpp Show annotated file Show diff for this revision Revisions of this file
--- 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