iexplore123 发表于 2024-11-25 00:43

【Follow me第二季第4期】PDM麦克风音频波形打印

# 【Follow me第二季第4期】 学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形

## 学习PDM麦克风技术知识

PDM(Pulse Density Modulation)麦克风是一种数字麦克风,通过PDM信号输出音频数据。PDM麦克风的优点是抗干扰能力强,适用于噪声环境下的音频采集。

### PDM麦克风工作原理

PDM麦克风通过MEMS传感器将声音转换为电信号,然后通过PDM编码器将模拟信号转换为PDM信号。PDM信号是一种脉冲密度调制信号,通过脉冲的密度来表示模拟信号的幅度。

### PDM麦克风接口

通过查阅Arduino Nano RP2040 Connect的原理图,我们可以找到PDM麦克风的接口:

图中PDM麦克风的输出是PDMCLK和PDMDIN两个信号,PDMCLK是PDM时钟信号,PDMDIN是PDM数据信号。

## 调试PDM麦克风

### PDM库

Arduino官方已经提供了PDM库,可以方便地读取PDM麦克风的数据。
>[官方教程](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-microphone-basics/)

### 通过串口打印收音数据和音频波形

```cpp
#include <Arduino.h>
#include <Wire.h>
#include <PDM.h>

static const char channels = 1;// 麦克风通道数
static const int sampleRate = 16000;// 音频采样率
short sampleBuffer;// 音频缓冲区
volatile int samplesRead = 0;// 音频采样数

void onPDMData() {// PDM麦克风数据回调函数
int numSamples = PDM.available(); // 获取可用采样数
if (numSamples > 0) {
    PDM.read(sampleBuffer, numSamples);
    samplesRead = numSamples/2; // 16位采样,每个采样占2字节
}
}

void setup() {
// 初始化串口
while (!Serial);// 等待串口连接
Serial.begin(115200); // 串口波特率设置为115200
Serial.println("Hello DigiKey & EEWorld !"); // 初次连接到串口时打印欢迎信息
// 初始化PDM麦克风
PDM.onReceive(onPDMData);
if (!PDM.begin(channels, sampleRate)) {
    Serial.println("Failed to initialize PDM!");
    while (1);
}
}

void printPDMData() {// 读取PDM麦克风数据
for (int i = 0; i < samplesRead; i++) {
    Serial.println(sampleBuffer);
}
}

void loop() {
if (samplesRead) {
    printPDMData();
    samplesRead = 0;
}
delay(500); // 延时500ms, 降低串口输出速率
}

```

#### 效果展示




> 通过串口打印收音数据和音频波形,我们可以看到PDM麦克风采集到的音频数据。
> 使用的串口助手是使用Qt开发的开源软件(https://github.com/wh201906/SerialTest/)。

## 任务进度

- 搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!
- 学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据。
- 学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
- [ ] 通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小。(选做)
- [ ] 通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。(选做)

Jacktang 发表于 2024-11-26 07:24

<p>看到了PDM麦克风采集到的音频数据收音数据和音频波形</p>
页: [1]
查看完整版本: 【Follow me第二季第4期】PDM麦克风音频波形打印