在用于物联网节点的STM32L4发现套件上(
B-L47E-IOT0A1
),有两个
MP34DT01
麦克风:一个
其中LR被拉至VDD,而第二个LR被拉低。
DFSDM1_CKOUT
和
DFSDM1_DATIN2
两者都连接。我有这个板,系统时钟设置为80MHz
DFSDM CH2
在中启用
DMA
模式此外,我将过滤器设置为连续模式
Fosr
设置为52,以及
Iosr
在8。我可以得到值,这样我就知道麦克风在工作,但试图播放音频会导致一堆静态。我认为我的采样率应该是48KHz,因为内部SPI时钟分频器设置为4--
(80MHz/4)/(52 * 8) = 48KHz]
--我的设置如下:
// Audio.c
#define AUDIO_LEN 240
#define H_AUDIO_LEN 120
int32_t micRecBuf[AUDIO_LEN];
int32_t micAudioBuf[AUDIO_LEN];
volatile uint8_t audioFilterHalfCplt = 0;
volatile uint8_t audioFilterCplt = 0;
void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) {
audioFilterHalfCplt = 1;
}
void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) {
audioFilterCplt = 1;
}
void micInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) {
HAL_DFSDM_FilterRegularStart_DMA(hdfsdm_filter, micRecBuf, AUDIO_LEN);
}
while(true) {
// first half of DMA is filled, now process
if (audioFilterHalfCplt == 1) {
// fill the audio buffer
for (i = 0; i < H_AUDIO_LEN; i++) {
micAudioBuf[i] = micRecBuf[i] << 8; // remove meta data
}
// reset the flag
audioFilterHalfCplt = 0;
}
// second half is filled, finish process
if (audioFilterCplt == 1) {
// fill the audio buffer
for (i = H_AUDIO_LEN; i < AUDIO_LEN; i++) {
micAudioBuf[i] = micRecBuf[i] << 8; // remove meta data
}
}
我可以使用以下shell命令检索数据并将其保存到二进制文件中:
screen -S audio -L -Logfile audio.bin /dev/ttyACM1 9600, cs8
我使用以下python脚本将数据保存为wav文件:
#!/usr/bin/env python3
import wave
with open("audio.bin", "rb") as input_file:
data = input_file.read()
with wave.open("output.wav", "wb") as output_file:
output_file.setnchannels(1) # Assuming mono
output_file.setsampwidth(4) # Assuming 16-bit samples (2 bytes)
output_file.setframerate(48077) # Set the sample rate
output_file.writeframesraw(data)
当我播放音频文件时,它都是静态的。在这个过程中,我哪里出了问题?