做音频的朋友肯定遇到过这个场景:拿到一颗数字MEMS麦克风,芯片手册里写着“PDM Output”,旁边只标了一根CLK一根DATA;而你手头的MCU音频外设明明写着支持I2S,I2S里跑的又是PCM数据。PDM和PCM这两个缩写放在一起,光看名字都容易让人糊涂——都是“调制/编码”,到底差在哪?我最早做嵌入式音频采集时也在这个问题上绕了几天,后来搞明白之后发现核心就几件事:PCM是给波形拍“快照”,PDM是用脉冲的疏密来表示幅度。这篇文章我从原理、参数、应用场景到PDM转PCM的实操链路全部过一遍,最后再提醒一个搜索时特别容易踩的坑:音频PDM和工程数据管理PDM完全是两个世界。内容适合正在选型数字麦克风、做音频采集链路、或者对DSD/SACD好奇的工程师和DIY玩家。
1. 先弄明白一个最容易被忽略的问题:PCM和PDM到底在“编码”什么
1.1 PCM:用采样点和量化级硬生生描绘波形
PCM的全称是Pulse Code Modulation,脉冲编码调制。它的思路非常直接:把连续的模拟信号,每隔一个固定时间间隔取一个“快照”,再把这个快照的电压值归整到最近的量化等级上,最后用二进制表示出来。
以CD常见的44.1kHz/16bit为例:
- 每秒钟采样44100次,这个频率由奈奎斯特采样定理决定——要还原20kHz以内的音频,采样率至少要达到40kHz以上;
- 每次采样的电压被切分成2的16次方,也就是65536个量化等级;
- 每次采样输出16bit数据,双声道每秒产生的数据量是44100 × 16 × 2 = 1411200bit,约1.4Mbps,所以一张CD音频算下来710MB左右才够放74分钟。
PCM的“时间精度”完全由采样率决定,“幅度精度”完全由位深决定。你可以把它想象成看电影时的一帧帧胶片,帧率够高、色彩位深够大,画面就连续且细腻。PCM最大的优点是直接、好理解、后续处理方便。绝大多数音频处理算法——EQ、混响、降噪、编解码——都默认输入是PCM数据。
1.2 PDM:靠单位时间内的脉冲密度还原信号
PDM的全称是Pulse Density Modulation,脉冲密度调制。它的编码单位只有一个bit,不是0就是1,没有第二个量化等级。但它的采样率非常高,通常在2.4MHz到3.2MHz甚至更高。信号幅度大时,这一串0/1里出现“1”的比例更高;信号幅度小时,“1”的比例更低。把这一串脉冲后续通过低通滤波器平滑一下,就能恢复出原始模拟信号。
你可以把PDM理解成用刷子刷墙:想表达“浅灰色”,不是先调好颜料再刷,而是用白漆和黑漆快速交替点刷,白色点越多视觉上就越白,黑色点越多就越黑。PDM就是这个思路,它用时间上的疏密密度来编码幅度,完全不单独量化电压。
这也是PDM和PWM最容易被搞混的地方:PWM的脉冲宽度可变,但周期固定;PDM的脉冲宽度基本固定,密度在变,本质是两种不同的编码策略。
1.3 本质区别:一个量化幅度,一个量化时间
把两者放到一起对比就非常清楚了:
- PCM在幅度轴上做量化,用“高低电平+多bit组合”表示幅值,时间轴上按固定采样率取点;
- PDM在时间轴上做极致细分,只用0/1这个双电平,但用单位时间内的脉冲密度表达幅值。
所以PCM和PDM都不是“谁比谁高级”的关系,而是编码维度不同。PCM用时间和幅度的二维网格把信号切碎,PDM则是在超高时间分辨率下把幅度信息“藏”进密度里。这个差异引出了后面所有参数、接口和应用上的不同。
2. 从参数和原理看差距:为什么PDM能“以少胜多”
2.1 三个关键指标对比:采样率、位深与信噪比
我习惯用一张表直观列出音频场景下最常见的参数对比:
| 对比项 | PCM | PDM |
|---|---|---|
| 典型采样率 | 44.1kHz / 48kHz / 96kHz / 192kHz | 2.4MHz / 2.8224MHz / 3.072MHz |
| 位深/位数 | 16bit / 24bit / 32bit | 1bit(每采样点) |
| 每声道典型比特率 | 44.1k×16=705.6kbps | 2.8224MHz×1=2822.4kbps |
| 幅度量化方式 | 多bit等间隔量化 | 0/1密度调制 |
| 信噪比来源 | 量化位深决定理论上限 | 调制器阶数+过采样率+噪声整形决定 |
| 接口复杂度 | I2S/TDM/Audio Codec,通常带MCLK | CLK+DATA两根线,可时分复用 |
| 解码处理 | 直接做DSP运算 | 必须先抽取滤波转成高bit PCM |
你可能会疑惑:PDM每采样点只有1bit,为什么能做到90多dB甚至更高的信噪比?这不科学啊。关键在于它的过采样率极高。一个2.8224MHz的1bit流,折合中等码率的PCM来看,单通道数据量并不算小。实际上PDM并没省数据量,它只是把量化的“深度”换成了时间上的“密度”,再用噪声整形把量化噪声推到人耳不敏感的高频段。
2.2 噪声整形是PDM的底牌
PDM的核心技术叫Delta-Sigma调制,国内常写成Σ-Δ或德尔塔-西格玛。它里面有个环路滤波器,每一拍会根据输入信号与反馈信号之间的误差决定输出0还是1。这个反馈回路有个非常关键的作用:量化噪声不再均匀分布在全频段,而是被“挤出”到高频段。人耳对中低频更敏感,对高频容忍度高,所以即使PDM标称只有1bit,经过噪声整形后的带内信噪比甚至可以优于同等bit数的普通PCM。
我以一个常见的一阶Sigma-Delta调制器举例,输出逻辑可以简化为:
error += input_sample - output; if (error > 0) { output = 1; } else { output = -1; // 数字上记为0 }这个累加器加反馈的循环,每拍都尽量让输出的0/1序列平均值逼近输入信号。经过低通滤波后,序列平均值就是信号的近似重构。实际芯片里的调制器通常是二阶、三阶甚至更高阶,环路结构更复杂,但思想不变。
这也是为什么在同等成本下,很多ADC芯片愿意用Delta-Sigma结构:高过采样率+噪声整形可以在普通CMOS工艺上实现很高的音频信噪比,不需要像传统逐次逼近型ADC那样做高精度电容匹配。
2.3 PCM和PDM各需要什么硬件接口
MCU或SoC里的PCM音频接口大家比较熟悉,最常见的是I2S:
- BCLK:位时钟,决定每秒传输多少bit;
- LRCLK / WS:左右声道选择,频率等于采样率;
- DATA:串行传输PCM数据。
如果要多路麦克风,TDM模式可以在一条DATA线上按时隙传多路数据,但主控侧需要支持TDM。
PDM麦克风的硬件接口要简单得多:
- CLK:由主控或音频Codec提供,频率通常2.4MHz或3.072MHz;
- DATA:输出0/1脉冲流;
- 有些双麦模组用一根DATA线时分复用左右声道,靠CLK低电平期间的电平状态识别是左麦还是右麦。
从PCB布线看,PDM麦克风非常友好——不需要模拟线缆、不需要隔直电容、走线可以稍微长一点也不容易引入模拟噪声。这直接影响了MEMS麦克风市场的格局:大量手机、平板、智能音箱里的数字麦克风都选择PDM输出,把最靠近声源的信号直接数字化,抗干扰能力远超模拟驻极体。
3. 应用场景对照:手机麦克风、DSD、数字音频链路怎么选
3.1 PDM在MEMS麦克风和DSD里几乎不可替代
PDM最大的主战场就是数字MEMS麦克风。过去模拟麦克风输出的是模拟电压,信号在PCB走线过程中容易被高频干扰侵入,尤其是射频干扰和解调后的音频噪声。PDM麦克风内部集成了Sigma-Delta调制器,直接在麦克风内部完成数字化,输出端只有CLK和DATA,抗干扰能力明显更强。
典型产品形态包括:
- 手机/平板顶部的双麦或四麦阵列,用于通话降噪和指向性拾音;
- 智能音箱环形麦克风阵列,PDM多路数据通过TDM时分复用接到主控DSP;
- 会议终端、耳机、助听器中的微型拾音方案。
另外很多Hi-Fi玩家熟悉的DSD,本质上就是基于PDM的1bit音频格式,SACD光盘里存的就是PDM数据流,DSD64采样率正是CD的64倍,也就是2.8224MHz。DSD的听感争议先不谈,但它确实是PDM在消费音频里的另一个著名应用。
3.2 PCM是存储、传输与算法处理的主力
PCM的应用场景更是无处不在:
- WAV、FLAC、ALAC等音频文件里存储的是PCM数据,FLAC只是对PCM做了无损压缩;
- 蓝牙A2DP协议里传输的是PCM,无论是SBC还是AAC、LDAC,编解码器的输入输出都是PCM;
- USB音频类设备(UAC)也跑PCM,几乎所有电脑喇叭、外置声卡、数字功放的内部链路都以PCM为核心;
- 不管是麦克风采集的PDM还是ADC采集的模拟信号,最终进入DSP做降噪、回声消除、自动增益控制时,都要求先变成PCM。
所以你会看到一个很常见的系统架构:PDM麦克风 → 主控内部PDM控制器 → 硬件抽取滤波 → PCM数据 → DSP算法 → 蓝牙/文件/USB。
3.3 从实际产品看PDM和PCM是怎么共存的
我拿自己做过的一个降噪耳机方案举例:板子上有四颗PDM麦克风采集环境噪声,主控是高通QCC系列蓝牙芯片,内部PDM接口直接把四路PDM转为PCM,再交给ANC算法。用户听到的音乐来自手机,通过蓝牙解码后也是PCM数据。整条链路里,PDM只出现在“麦克风到主控”这一段,之后全部是PCM的天下。
把这个结构套到绝大多数产品上都成立——PDM负责前端采集,PCM负责后端传输与计算。如果你在产品选型时卡在“到底用PDM还是PCM”,正确的问法其实是:模拟转数字那一步,是接受PDM输出,还是需要I2S输出的Codec芯片直接给PCM。
4. 项目里最常做的动作:把PDM转成PCM
4.1 为什么MCU/DSP里几乎都要先做转换
很多主控芯片,尤其是一些低成本MCU,并没有硬件PDM控制器。这时接到PDM麦克风后,最直接的做法是:MCU用定时器输入捕获或GPIO中断把PDM的0/1流采回来,然后软件实现抽取滤波,转成16bit或24bit的PCM数据,再做后续算法。
这个过程不复杂但细节不少。PDM流本质是过采样后的1bit信号,里面除了音频信息还有大量高频整形噪声。要得到可用的PCM,必须经过两步:
- 抽取(Decimation):把2.4MHz以上的高采样率降到48kHz/16kHz等常用采样率;
- 低通滤波:滤掉高频量化噪声,同时防止抽取后混叠。
这两个操作通常用一个抽取滤波器完成。按64倍抽取率算,2.8224MHz ÷ 64 = 44.1kHz;按128倍算,3.072MHz ÷ 128 = 24kHz,对应不同的目标采样率。
4.2 PDM转PCM的处理链路和代码简化实现
在正式实现时,工程上最常用的是CIC滤波器。CIC不需要乘法器,只用积分器和梳状器,非常节省MCU资源。以下是一个简化结构:
// 假设输入pdm_bit为0/1,输出pcm为有符号数 int integrator = 0; int comb_history = 0; int pcm = 0; for (int i = 0; i < DECIMATION_RATE; i++) { int sample = pdm_bit[i] ? 1 : -1; integrator += sample; // 积分器 } pcm = integrator - comb_history; // 梳状器 comb_history = integrator;实际CIC会做多级级联,并且抽取后还要再经过一级补偿FIR滤波器来修正通带纹波。如果你想快速验证转换效果,用Python加上SciPy可以几条命令就出来:
import numpy as np from scipy.signal import decimate # pdm是原始0/1数据流,转成+1/-1便于计算 bits = np.where(pdm_stream > 0, 1.0, -1.0) # 64倍抽取,FIR方式滤波 pcm_float = decimate(bits, 64, ftype='fir', zero_phase=True) # 转成16bit整数,注意幅度归一化 pcm_int16 = (pcm_float * 16000.0).astype(np.int16)不过说实话,生产环境中我还是建议优先使用主控芯片自带的硬件PDM控制器,比如STM32的DFSDM、NXP的SAI外设或高通的PCM/PDM接口。硬件抽取滤波稳定又不占CPU,而软件CIC虽然省成本,但在高采样率和多路麦克风场景下容易把CPU吃满。
4.3 我在转换过程中踩过的坑和参数选择
这里分享几个真实踩过的坑,都是文档里不会写的:
坑1:CLK频率和期望采样率没算对。PDM麦克风的CLK频率通常是外部输入的。比如你希望最终输出16kHz的PCM,CLK给2.048MHz并做128倍抽取就是16kHz,做64倍抽取却是32kHz。我见过有人把CLK频率配成2.8224MHz,然后软件按64倍抽取,得到的是44.1kHz,结果算法里采样率写48kHz,导致所有频点漂移。建议先把抽取率和目标采样率写进代码的宏定义里,配套一个自检函数打印实际采样率。
坑2:CIC滤波器的增益飞了。CIC滤波器的增益和抽取率强相关,不做归一化直接输出,PCM数据会爆头或全是噪声。正确做法是在滤波后除以抽取率的N次方(N是级数),再做个动态范围归一化。比如64倍抽取、3级CIC时,增益约64的3次方,这个放大倍数必须补偿掉。
坑3:左右声道数据方向搞反。多颗PDM麦克风复用一根DATA线时,左右声道切换是靠CLK低电平期间DATA的电平。有些芯片是高电平是左声道,有些是低电平是左声道,这个在Fusion算法里左右颠倒不会报错,但波束方向会完全反掉。调试时一定要对着规格书确认。
坑4:PDM信号线布线不当导致串扰。PDM接口虽然抗干扰,但同一组CLK/DATA离I2S或SPI线太近,高频时钟耦合会造成毛刺。软件上表现就是偶尔采样到极端脉冲,导致爆音。做PCB时CLK和DATA要包地,最好远离电源开关节点。
5. 别看到“PDM”就以为是音频,另一个PDM是产品数据管理
写到这里提一个现实问题:最近搜PDM相关资料时,会搜出一堆“PDM二次开发”“SW2023的PDM在哪”“PDM文件怎么打开”的页面。这些搜索词指向的完全是另一个PDM——产品数据管理(Product Data Management),和音频里的脉冲密度调制没有任何关系。
5.1 两种PDM的区别在哪里
| 领域 | PDM全称 | 作用 |
|---|---|---|
| 音频 | Pulse Density Modulation | 数字音频编码方式 |
| 工程/制造 | Product Data Management | 管理产品设计数据、版本、BOM、审批流程 |
工程领域的PDM系统常和CAD软件绑定,比如SolidWorks的PDM插件。它解决的是设计图纸版本混乱、多人协同编辑冲突、零件库管理问题。而音频领域的PDM是芯片管脚和信号链里的事情,常见于MEMS麦克风数据手册、DSD技术文档、主控外设说明里。
我看到“pdm历史记载乱码”这类搜索词,多半是PDM文件与本地软件关联错误或字体编码问题,属于工程数据管理PDM的知识范畴。音频PDM不存在“打开文件”的概念,因为它是实时信号流格式,不是文件容器。
5.2 搜索时如何快速判断自己该看哪类资料
如果你是搞音频的,看到下面这些关键词,请放心这是同一领域:
- PDM microphone、MEMS麦克风、PDM接口、DSD、Sigma-Delta调制、抽取滤波、数字麦克风阵列。
如果你遇到的是下面这些,说明你进入的是工程PDM领域:
- PDM系统、PDM二次开发、SolidWorks PDM、PDM文件检入检出、BOM管理、CAD数据管理、PDM历史记录、PDM工作流。
这个区分在选型和工作协同里非常重要。我在一个硬件项目群里见过有人问“PDM怎么转PCM”,下面有人回答“你找研发提需求改PDM流程”……两个PDM混在一起,讨论一晚上都没解决问题。所以你在翻阅资料前,先确认语境,能省下大量时间。
6. 我的一些实操建议,按项目阶段整理给你
最后按项目阶段给一套我的个人操作习惯,不一定适合所有团队,但至少能帮你避开我走过的弯路。
在选型阶段,先想清楚PDM要接到哪里:如果你的主控只有I2S没有硬件PDM外设,那软件解码PDM的工作量可能比想象中大,尤其是做多路麦克风阵列时。建议优先选带硬件PDM控制器的平台,或者直接在麦克风和主控之间加一颗PDM转I2S的Codec,比如TI的TLV320ADC系列、ADI的ADAU7118等。这样主控见到的就是干净的PCM数据,开发效率高很多。
在调试验证阶段,我习惯先把PDM原始流直接保存成二进制文件,再用Python离线解析,确认麦克风出来的是有效音频而不是时钟噪声。把硬件问题和算法问题隔离,能省掉大量相互甩锅的时间。你可以在示波器上抓CLK和DATA,看DATA是否有0/1切换密度随声音变化的规律,这个信号能直观验证PDM链路是否工作。
在量产阶段,一定要对PDM麦克风的工厂测试项重视起来:每颗麦克风的调制器性能有偏差,同一型号在相同声压下输出的脉冲密度统计特性可能不同。批量校准时要同时测低频响应和高频噪声,不能只测一颗样片就定校准表。
还有个小技巧:如果做的是需要远程会议或语音助手的设备,麦克风选PDM输出通常比模拟驻极体省心,因为你不必再处理模拟地的噪声问题。但千万不要为了布线方便把CLK时钟走得太远,过长的时钟线会产生反射,导致DATA采样时机错乱,现象就是偶发爆音和忽大忽小。
DSD这块补充一句:如果你在做Hi-Fi产品,不要轻信“DSD一定比PCM好听”或者“PCM比DSD动态更大”这类绝对化结论。从编码上看,DSD是PDM思想在消费音频上的应用,但它和PCM的转换损失往往出现在格式转换滤波器上,而不是编码本身。产品设计时真正该关注的是整条信号链的噪声和失真,而不只是纠结文件格式标签。