【得捷电子Follow Me第二季第4期】Arduino Nano RP2040 Connect 进阶任务
[复制链接]
本帖最后由 鲜de芒果 于 2024-12-29 13:34 编辑
1. 任务要求
学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
2. 基础知识
脉冲密度调制(Pulse Density Modulation,简称PDM)是一种数字调制技术,它使用二进制数0和1来表示模拟信号的幅值。在PDM中,模拟信号的幅值通过输出脉冲对应区域的密度来表示,即1的密度越大,代表该区域对应的模拟信号幅值越大,反之亦然。
麦克风是将物理声音转换为数字数据的部件。麦克风通常用于移动终端、语音识别系统甚至游戏和虚拟现实输入设备。 Arduino Nano RP2040 Connect 开发板上有一颗 MP34DT06JTR 传感器。如下图所示:
MP34DT06JTR 传感器是一种超紧凑型麦克风,使用PDM(脉冲密度调制)用二进制信号表示模拟信号。MP34DT06JTR 传感器典型参数如下: 信噪比:64dB 灵敏度:-26dBFS ±3dB 温度范围:-40 ~ 85℃
3. 功能实现
3.1 原理
使用PDM 采集数字音频数据,然后再通过串口将数字音频数据发送至上位机,上位机再通过串口接收数字音频数据,使用曲线图绘制音频曲线。
3.2 代码实现
/**
* FollowMe 2-4 任务3:
* 1. 学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
*/
#include <Arduino.h>
#include <PDM.h>
static const char channels = 1; // 音频通道数,1:单通道,2:立体声
static const int frequency = 20000; // PCM 输出频率
short sampleBuffer[512]; // 音频采样缓存区
volatile uint32_t samplesRead; // 读取到的音频样本数
void setup() {
// 初始化串口
Serial.begin(115200);
delay(1500);
// 设置PDM接收回调函数
PDM.onReceive(onPDMdata);
// 增益设置,可选
// PDM.setGain(30);
// 初始化 PDM
while (!PDM.begin(channels, frequency)) {
Serial.println("PDM 初始化失败!");
PDM.end();
// 延时重试
delay(3000);
}
}
void loop() {
if (samplesRead) { // 读取到了音频数据
// 对音频数据进行处理,这里使用串口输出。上位机可通过串口展示音频波形
for (int i = 0; i < samplesRead; i++) {
Serial.println(sampleBuffer[i]);
}
// 处理完毕,清零读取到的音频样本数
samplesRead = 0;
}
}
/**
* 数据处理回调函数,用于接收PDM麦克风的数据
*/
void onPDMdata() {
// Query the number of available bytes
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
4. 效果展示
|