我想测量背景噪声-带有无线传感器(带有STM32F1 + wifi模块)的房间的语音响度。我购买了MEMS麦克风(MP34DT01)。该麦克风具有PDM输出。 我为麦克风生成1.4 MHz时钟,因此采样速率为1.4 MSample / s。我读了很多有关PDM的文章,得出的结论是我只需要使用低通滤波器。
现在,我将1000个样本读取到一个缓冲区阵列中(这非常费钱,因为我将某些位存储为uint8),然后使用二阶IIR Butterworth(切割频率为20kHz)。然后,我通过TCP将数据发送到PC并绘制实时图形。 处理的示例代码:
#define NZEROS 2
#define NPOLES 2
#define GAIN 5.282971791e+02
float filtered[1000] = {0};
uint8_t buffer[1000] = {0};
static float xv[NZEROS+1], yv[NPOLES+1];
while(1){
//Read data from microphone
MP34DT01_Listen(buffer);
for(int i = 0, i<1000; i++){
{ xv[0] = xv[1]; xv[1] = xv[2];
xv[2] = buffer[i] / GAIN;
yv[0] = yv[1]; yv[1] = yv[2];
yv[2] = (xv[0] + xv[2]) + 2 * xv[1]
+ ( -0.8807871294 * yv[0]) + ( 1.8732156333 * yv[1]);
filtered[i] = yv[2];
}
}
//Send data over TCP to python client
WifiSend(filtered);
}
输出数据与噪声无关,我和麦克风聊天,敲了敲门,但似乎我正在处理噪声,但它们都不出现在图表上。我尝试使用具有16个窗口的移动平均滤波器,尝试了另一个低通滤波器,尝试了64个抽取比一个滤波器和一个滤波器大于抽取率。
将PDM转换为PCM的正确方法是什么?