【Follow me第二季第4期】任务三 学调试PDM麦克风,通过串口打印收音数据和音频波形。
[复制链接]
Arduino Nano RP2040 Connect 板载了 MP34DT06 PDM 数字麦克风,它是一种基于脉冲密度调制(PDM)的麦克风。通过采样 PDM 信号可以获取音频数据,适用于语音识别、音频采集等场景。
- PDM 麦克风基础知识
- PDM(Pulse Density Modulation)是一种以高频率表示声音强度的调制方式。
- 相比于传统的模拟麦克风,PDM 麦克风输出的是数字信号,适合直接处理数字音频。
2. 示例代码
下面的代码演示了如何初始化 PDM 麦克风并通过串口打印音频采样数据:
C++
#include <PDM.h>
// 默认输出通道数
static const char channels = 1;
// 默认 PCM 输出频率
static const int frequency = 16000;
// 用于读取样本的缓冲区,每个样本是 16 位
short sampleBuffer[512];
// 已读取的音频样本数量
volatile int samplesRead;
void setup() {
Serial.begin(9600); // 初始化串口通信
while (!Serial); // 等待串口连接
// 配置数据接收回调函数
PDM.onReceive(onPDMdata);
// 初始化 PDM 麦克风:
// - 一个通道(单声道模式)
// - 20 kHz 采样率
if (!PDM.begin(channels, frequency)) {
Serial.println("无法启动 PDM!");
while (1); // 启动失败时停止程序
}
}
void loop() {
// 等待读取样本
if (samplesRead) {
// 将样本数据打印到串口监视器或绘图工具中
for (int i = 0; i < samplesRead; i++) {
Serial.println(sampleBuffer); // 打印当前样本数据
}
// 清空已读取的样本数量
samplesRead = 0;
}
}
void onPDMdata() {
// 查询可用字节数
int bytesAvailable = PDM.available();
// 从 PDM 麦克风读取数据到样本缓冲区
PDM.read(sampleBuffer, bytesAvailable);
// 16 位样本,每个样本占 2 字节
samplesRead = bytesAvailable / 2;
} |
3. 代码说明
- PDM.begin(1, 16000):启动 PDM 麦克风,单声道,采样率为 16kHz。
- PDM.onReceive(onPDMdata):注册一个回调函数,当有数据时调用。
- sampleBuffer[]:用于存储音频样本数据。
- Serial.println(sampleBuffer):通过串口打印采样数据。
4. 查看波形数据
- 将代码上传到 Arduino Nano RP2040 Connect。
- 打开 串口监视器,设置波特率为 9600。
- 使用 Arduino IDE 串口绘图器(Serial Plotter),观察音频数据的波形变化。
5. 调试建议
- 调整采样率:通过修改 PDM.begin() 的第二个参数来提高或降低采样率。
- 滤波处理:可在 loop() 中增加滤波或降噪处理,平滑音频波形。
|