Version using MEMS microphone and CODEC for the program "F746_RealtimeSpectrumAnalyzer". "F746_RealtimeSpectrumAnalyzer" の入力を MEMS のマイクと CODEC に変更.このプログラムは Tomona Nanase さんが作成し DISCO-F746NG_Oscilloscope の名前で登録しているプログラムで, CODEC を使って入力する部分を参考にして作成.このプログラムの説明は,CQ出版社のインターフェース誌,2016年4月号に掲載.

Dependencies:   BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed

Revision:
0:0e5131366580
Child:
1:ac0a67a0deec
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jan 06 12:46:15 2016 +0000
@@ -0,0 +1,136 @@
+//------------------------------------------------
+//  Realtime spectrum analyzer
+//      Input: MEMS microphone or CN11
+//
+//  2016/01/06, Copyright (c) 2016 MIKAMI, Naoki
+//------------------------------------------------
+
+#include "main.h"
+
+using namespace Mikami;
+
+int16_t audio_in_buffer[BufferSize];
+__IO bool audio_in_buffer_captured = false;
+__IO int32_t audio_in_buffer_offset = 0;
+__IO int32_t audio_in_buffer_length = 0;
+
+int main()
+{
+    const int FS = 8000;        // Sampling frequency: 8 kHz
+    const int N_DATA = N_DATA_; // Number of data to be analyzed
+    const int N_FFT = 512;      // Number of date for FFT
+
+    const int X_WAV = 44;   // Origin for x axis of waveform
+    const int Y_WAV = 36;   // Origin for y axis of waveform
+    const int X0    = 40;   // Origin for x axis of spectrum
+    const int Y0    = 234;  // Origin for y axis of spectrum
+    const float DB1 = 2.4f; // Pixels for 1 dB
+    const int BIN   = 1;    // Pixels per bin
+    const int W_DB  = 60;   // Range in dB to be displayed
+    const int X0_BTN = 340; // Holizontal position for left of buttons
+
+    const uint32_t BACK_COLOR          = 0xFF006A6C;    // Teal green
+    const uint32_t INACTIVE_COLOR      = BACK_COLOR & 0xD0FFFFFF;
+    const uint32_t TOUCHED_COLOR       = 0xFF7F7FFF;
+    const uint32_t ORIGINAL_COLOR      = 0xFF0068B7;
+    const uint32_t INACTIVE_TEXT_COLOR = LCD_COLOR_GRAY;
+    const uint32_t AXIS_COLOR          = 0xFFCCFFFF;
+    const uint32_t LINE_COLOR          = LCD_COLOR_CYAN;
+
+    LCD_DISCO_F746NG lcd;           // Object for LCD display
+    TS_DISCO_F746NG ts;             // Object for touch pannel
+
+    lcd.Clear(BACK_COLOR);
+
+    // Setting of button group
+    const string RUN_STOP[2] = {"RUN", "STOP"};
+    ButtonGroup runStop(lcd, ts, X0_BTN, 10, 60, 40,
+                        ORIGINAL_COLOR, BACK_COLOR,
+                        2, RUN_STOP, 5, 0, 2);
+    runStop.Draw(1, INACTIVE_COLOR, INACTIVE_TEXT_COLOR);
+
+    const string MIC_LINE[2] = {"MIC", "LINE"};
+    ButtonGroup micLine(lcd, ts, X0_BTN, 65, 60, 40,
+                        ORIGINAL_COLOR, BACK_COLOR,
+                        2, MIC_LINE, 5, 0, 2);
+    micLine.DrawAll(INACTIVE_COLOR, INACTIVE_TEXT_COLOR);
+
+    const string METHOD[3] = {"FFT", "Linear Pred.", "Cepstrum"};
+    ButtonGroup method(lcd, ts, X0_BTN, 120, 125, 40,
+                       ORIGINAL_COLOR, BACK_COLOR,
+                       3, METHOD, 0, 5, 1);
+    method.DrawAll(INACTIVE_COLOR, INACTIVE_TEXT_COLOR);
+    // End of button group setting
+
+    WaveformDisplay waveDisp(lcd, X_WAV, Y_WAV, N_DATA, 10,
+                             AXIS_COLOR, LINE_COLOR, BACK_COLOR);
+
+    SpectrumDisplay disp(lcd, N_FFT, X0, Y0, DB1, BIN, W_DB, FS,
+                         AXIS_COLOR, LINE_COLOR, BACK_COLOR);
+    // Linear prediction:   order = 12
+    // Cepstral smoothing:  highest quefrency = 40
+    Selector analyzer(disp, N_DATA, N_FFT, 12, 40);
+
+    // Initialize the infinite loop procedure
+    int select = -1;
+    uint16_t inputDevice;
+    int mic = 0;
+    int stop = 0;
+    int16_t sn[N_DATA];
+
+    // Wait for "RUN" button touched
+    while (!runStop.Touched(0, TOUCHED_COLOR)) {}
+
+    // Start of spectrum analyzing
+    method.DrawAll(ORIGINAL_COLOR);
+
+    while (true)
+    {
+        if (runStop.Touched(0, TOUCHED_COLOR))
+        {
+            inputDevice = (mic == 0) ? INPUT_DEVICE_DIGITAL_MICROPHONE_2
+                                     : INPUT_DEVICE_INPUT_LINE_1;
+            InitRunAudioIn(inputDevice, I2S_AUDIOFREQ_16K);
+            micLine.Draw(mic, TOUCHED_COLOR);
+            micLine.Redraw(1-mic);
+        }
+
+        runStop.GetTouchedNumber(stop, TOUCHED_COLOR);
+        if (stop == 0)
+        {
+            if (micLine.GetTouchedNumber(mic, TOUCHED_COLOR))
+            {
+                StopAudioIn();  // Stop sampling
+                inputDevice = (mic == 0) ? INPUT_DEVICE_DIGITAL_MICROPHONE_2
+                                         : INPUT_DEVICE_INPUT_LINE_1;
+                InitRunAudioIn(inputDevice, I2S_AUDIOFREQ_16K);
+            }
+
+            if (audio_in_buffer_captured)
+            {
+                // Waveform display
+                int32_t index = audio_in_buffer_offset;     // right mic. or left line
+//                int32_t index = audio_in_buffer_offset + 1;     // left mic. or right line
+                Decimate(N_DATA, index, audio_in_buffer, sn);
+                waveDisp.Execute(sn);
+                // Spectrum analysis and display
+                analyzer.Execute(sn, select);
+                audio_in_buffer_captured = false;
+            }
+            else
+                if (method.GetTouchedNumber(select, TOUCHED_COLOR))
+                    analyzer.Execute(sn, select);
+        }            
+        else
+        {
+            if (runStop.Touched(1))
+            {
+                StopAudioIn();  // Stop sampling
+                micLine.DrawAll(INACTIVE_COLOR, INACTIVE_TEXT_COLOR);
+            }
+            if (method.GetTouchedNumber(select, TOUCHED_COLOR))
+                analyzer.Execute(sn, select);
+        }
+    }
+}
+