【得捷电子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;
- static const int frequency = 20000;
-
- short sampleBuffer[512];
- volatile uint32_t samplesRead;
-
-
- void setup() {
-
- Serial.begin(115200);
- delay(1500);
-
-
- PDM.onReceive(onPDMdata);
-
-
-
-
-
- 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() {
-
- int bytesAvailable = PDM.available();
-
-
- PDM.read(sampleBuffer, bytesAvailable);
-
-
- samplesRead = bytesAvailable / 2;
- }
-
4. 效果展示
|