lijinlei 发表于 2024-12-4 08:22

【Follow me第二季第4期】PDM 麦克风

# 【Follow me第二季第4期】PDM 麦克风

Nano RP2040 connect 配有 **MP34DT06JTR** 麦克风,可用于录制音频。

本文介绍的项目实现:当录制到响亮的噪音(如打响指)时,打开或关闭内置的 RGB LED。



所需硬件:(https://store.arduino.cc/nano-rp2040-connect) 开发板、板载 MP34DT06JTR 麦克风传感器。

Arduino IDE 需安装 PDM 库。

详见:(https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-microphone-basics/) .

## PDM 介绍

麦克风是将物理声音转换为数字数据的组件。

环境声音振动压缩空气,导致不同位置的空气密度分布存在差异,由此带来空气分子的波动传输,鼓膜线圈受到空气波动的影响而振动,线圈切割中心磁铁产生的磁感线,并形成感应电流,该感应电流经放大电路放大为模拟信号,传递给 MCU 模数转换器 ADC ,并转化为数字信号并通过串口输出。

麦克风通常用于移动终端、语音识别系统,甚至游戏和虚拟现实输入设备。

MP34DT06JTR 传感器是一种超小型麦克风,它使用 PDM(pulse density mdulation, 脉冲密度调制)来表示具有二进制信号的模拟信号。传感器的不同值范围如下:

- 信噪比:64 dB
- 灵敏度:-26 dBFS ±3 dB
- 温度范围:-40 至 85°C



微机电系统或 MEMS 是使用最初为集成电路 (IC) 开发的技术在硅上蚀刻和制造的。 二十世纪 90 年代以来,MEMS 技术创造了各种传感器和其他机电设备,包括麦克风。



MEMS 麦克风的封装如图所示,麦克风和单独的 ASIC(专用集成电路)组合在同一个封装中,通过引线键合连接。

MEMS 麦克风采用类似 IC 的封装,用于表面贴装组装。声音由顶端开口进入感知器。

**MEMS 数字输出**

具有数字输出的 MEMS 麦克风执行 ADC,将放大的模拟音频信号转换为数字信号。

使用delta-sigma 转换来产生 PDM(脉冲密度调制)输出,如图所示。



当音频信号较高时,高脉冲(蓝色)具有较高的密度。

## 代码

```c++
#include <PDM.h>

// default number of output channels
static const char channels = 1;

// default PCM output frequency
static const int frequency = 16000;

// Buffer to read samples into, each sample is 16-bits
short sampleBuffer;

// Number of audio samples read
volatile int samplesRead;

void setup() {
Serial.begin(9600);
while (!Serial);

// Configure the data receive callback
PDM.onReceive(onPDMdata);

if (!PDM.begin(channels, frequency)) {
    Serial.println("Failed to start PDM!");
    while (1);
}
}

void loop() {
// Wait for samples to be read
if (samplesRead) {

    // Print samples to the serial monitor or plotter
    for (int i = 0; i < samplesRead; i++) {
      if(channels == 2) {
      Serial.print("L:");
      Serial.print(sampleBuffer);
      Serial.print(" R:");
      i++;
      }
      Serial.println(sampleBuffer);
    }

    // Clear the read count
    samplesRead = 0;
}
}

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;
}
```

### 流程图



## 效果

安静状态串口输出数据测试



噪声状态下的数据输出测试



动态显示由 **安静** 到 **噪声** 再到 **安静** 状态的数据曲线



可见噪声状态下的数据值在 10000 以上,而安静状态仅为 100,灵敏度为 100 倍,可用作环境噪声监测。

### 音频波形

将音响设备对准板载 PDM 传感器,串口输出捕获的音频数据。





从曲线的变化可以看出,当警报声响起时,波形发生明显变化。

秦天qintian0303 发表于 2024-12-4 10:43

<p>测试了一下,感觉手机播放的声音就不容易被路上,可能主频不一样,说话的声音反应就比较明显</p>

lijinlei 发表于 2024-12-4 12:15

秦天qintian0303 发表于 2024-12-4 10:43
测试了一下,感觉手机播放的声音就不容易被路上,可能主频不一样,说话的声音反应就比较明显

<p><span style="font-size:18px;">我用手机播放警报声,需要开大点声,曲线变化才明显,比如下面这个波形的声音</span></p>

<p style="text-align: center;"><span style="font-size:18px;"> &nbsp;</span></p>

<p><span style="font-size:18px;">显示出来是这样</span></p>

<div style="text-align: center;"><span style="font-size:18px;"></span></div>

<p><span style="font-size:18px;">我这里没有采样数更多的串口绘图工具了,不过可以用LabVIEW或MATLAB制作个串口读取工具&hellip;&hellip;</span></p>

秦天qintian0303 发表于 2024-12-4 14:48

lijinlei 发表于 2024-12-4 12:15
我用手机播放警报声,需要开大点声,曲线变化才明显,比如下面这个波形的声音

&nbsp;

显示出来是 ...

<p>可能是频段有要求,个人感觉比说话声音大,不过波形不明显</p>
页: [1]
查看完整版本: 【Follow me第二季第4期】PDM 麦克风