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
MyClasses_Functions/functions_for_audio.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2016-04-19
- Revision:
- 8:e7dc8658c5cd
- Parent:
- 2:5644475f01ea
File content as of revision 8:e7dc8658c5cd:
//------------------------------------------------------- // Functions for audio device on DISCO-F746NG and etc. // 2016/01/06, Copyright (c) 2016 MIKAMI, Naoki //------------------------------------------------------- #include "main.h" #include "functions_for_audio.hpp" // Initialize audio input and run // InputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2 or INPUT_DEVICE_INPUT_LINE_1 void InitRunAudioIn(uint16_t inputDevice, int samplingFreq) { init_audio_in(inputDevice, samplingFreq); record_audio_in(); } // Stop audio input void StopAudioIn() { if (BSP_AUDIO_IN_Stop(CODEC_PDWN_SW) == AUDIO_ERROR) error_trap(); } // Defined in BSP_overwrite.cpp by Nanase void AUDIO_IN_SAIx_DMAx_IRQHandler(); // Initialize audio-in for DISCO-F746NG static void init_audio_in(uint16_t InputDevice, int SamplingFreq) { int audioInVolume = (InputDevice == INPUT_DEVICE_INPUT_LINE_1) ? 86 : 100; if (BSP_AUDIO_IN_Init(InputDevice, audioInVolume, SamplingFreq) == AUDIO_ERROR) error_trap(); NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ, (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler); } // Start sampling of audio input signal static void record_audio_in() { if (BSP_AUDIO_IN_Record((uint16_t*)audio_in_buffer, BufferSize) == AUDIO_ERROR) error_trap(); } void error_trap() { DigitalOut led1(LED1); fprintf(stderr, "\r\n### ERROR\r\n"); while(true) { led1 = !led1; wait_ms(250); } } // Decimator by a factor of 2 using 3-tap FIR filter // This function is used for downsampling 16 kHz to 8 kHz namespace Mikami { void Decimate(int dataNum, int index, const int16_t xn[], int16_t yn[]) { static const float h0 = 5.443840E-01f; static const float h1 = 2.928932E-01f; for (int n=0; n<dataNum; n++) { // Execute FIR filter with 3 taps yn[n] = h0*xn[index+2] + h1*(xn[index] + xn[index+4]); index += 4; // Corresponding to decimation by a factor of 2 } } }