ESP-IDF+vscode开发ESP32第八讲——音频信号全解

目录

前言

一、I2S是什么?

信号线

全双工配置

采样率

数据位宽

二、音频信号

[2.1 什么是 PCM?](#2.1 什么是 PCM?)

[2.2 什么是PDM?](#2.2 什么是PDM?)

[2.3 区别与用途](#2.3 区别与用途)

三、通信模式

四、音频解码芯片

五、MCU的I2S资源


前言

音频信号处理,是设备智能化的第一步,有了它,设备能够收音和发音。为了对音频信号更好的处理,飞利浦制定了一个专门用来传输音频信号总线协议------I2S。本章将介绍I2S的构成、音频信号的种类、原理与优缺点,再介绍一款音频解码芯片ES8311的作用。

因为内容较多,本章仅做一个知识梳理,具体工程见下一章。

一、I2S是什么?

I2S(Inter-IC Sound,集成电路内置音频总线)是飞利浦制定、嵌入式通用的专用同步串行总线协议,专门传输 PCM 数字音频,分离时钟 + 数据,抗抖动、音质好,MCU/DSP/ 音频 Codec 标配接口。

信号线

核心 4 根信号线(标配 3 根 + 可选 MCLK),每根线的名称可能有多种

BCLK / SCK 位时钟:

  • 作用:控制数据传输速度、采样位宽,每一个时钟脉冲,传输 1 位音频数据
  • 取值:时钟频率 = 采样率 × 声道数 × 采样位数,
    • 例:44.1kHz 16 位双声道 → 44.1k×2×16 = 1.4112MHz

LRCK / WS 帧时钟:

  • 作用:帧同步信号,标记当前传输的数据是左声道还是右声道。一高一低,切换一次 = 完成一帧立体声传输。
    • WS = 低电平 → 左声道 L
    • WS = 高电平 → 右声道 R
  • 取值:在非 PDM 模式下,其频率等于采样率。比如 44.1kHz、48kHz。

SDATA / DIN / DOUT 串行数据线:

  • 作用:传输 PCM 数字音频采样值,MSB 高位优先发送,左右声道共用这一根线,分时复用。
    • WS = 低 → 发左声道数据
    • WS = 高 → 发右声道数据

MCLK 主时钟:

  • 作用:给音频 Codec 内部 DAC/ADC 做高精度时钟基准,让内部 PLL 锁相精准,杂音、底噪变小,能大幅提升音质,简单播放时可以不用 MCLK。分配的时候注意,MCLK 应该同时是采样率和 BCLK 的倍数。
  • 取值:一般,MCLK = 采样率 × 256(或者384、512)

从上面的信号线来看,数据收发只有一根SDATA线,所以是半双工,某一时刻只能录音或者播音,这种工作模式能适应大部分场景。但随着发展,有声返、通话的需求,需要边放边录,于是出现了全双工配置。

全双工配置

SDATA / DIN / DOUT 串行数据线变成了两根,分别是:

  • DOUT / SD_TX:播放数据输出(MCU→DAC)
  • DIN / SD_RX:录音数据输入(ADC→MCU)

目前90%音频编解码器都是5根信号线,全双工通信。

I2S具有主机和从机两种模式。

  • 主机 Master:输出 BCLK+LRCK,掌控时序
  • 从机 Slave:跟随外部时钟收发数据

采样率

采样率设置值比较多,如 8 kHz、16 kHz、32 kHz、44.1 kHz、48 kHz、88.2 kHz、96 kHz、128 kHz、192 kHz。越高的采样率,音质越好,对设备的要求也越高。常见的频率设置如下:

采样率 适用场景 嵌入式推荐度
8kHz 窄带语音、对讲、对讲机、低功耗录音 ⭐⭐⭐
16kHz 人机语音、本地录音、语音指令、蓝牙通话 ⭐⭐⭐⭐⭐ 首选
22.05kHz 压缩音频、低配音乐 ⭐⭐
44.1kHz CD 标准、普通背景音乐、本地歌曲播放 ⭐⭐⭐⭐
48kHz 车载多媒体、视频伴音、高清播放 ⭐⭐⭐
96kHz/192kHz HiFi 高解析音频 ⭐ 单片机不推荐,资源占用极高

数据位宽

一般可设置为8、16、24、32位。常见设置如下:

位宽 音质 资源占用 嵌入式推荐度 适用场景
8bit 差(噪音大、人声模糊) 几乎不用,仅极端低功耗
16bit 优秀(人声 / 音乐完全够用) 适中 ⭐⭐⭐⭐⭐ 首选 / 默认 语音、对讲、音乐、通用音频
24bit 高清 ⭐⭐ 专业 HiFi(单片机没必要)
32bit 无损 极高 几乎不用,浪费性能

二、音频信号

2.1 什么是 PCM?

现实声音是连续模拟电压, ADC把这个电压信号变换时间离散、幅度连续采样信号。脉冲编码调制 Pulse Code Modulation(PCM)它是一种数字音频编码格式, 首先将ADC采样信号进行量化,得到时间、幅度均离散的数字信号,接着进行位长标准化,可选16bit / 24bit,最后按:左声道采样 → 右声道采样 → 左 → 右,这种顺序进行声道帧排序,这就从杂乱 ADC 离散值得到 全球通用标准 PCM 音频。

一段 PCM,到底包含完整声音所有信息。

  • **音量:**数值绝对值越大代表声音越大,正负号代表声波相位上下

  • **频率:**数值起伏变化越快代表频率越高、声音越尖

  • **音色:**一串数字整体波形形状决定是人声、钢琴、噪音还是喇叭声

  • **左右声道:**L R L R 交替顺序,区分左右通道

  • **时间长度:**采样率固定(44.1k/48k),总采样点数 ÷ 采样率 = 音频时长

ADC 负责采集,PCM 负责保存、传输、处理。I2S数据线传输的数字信号就是PCM信息。

2.2 什么是PDM?

PDM是脉冲密度调制,不用数字大小,只用 0 和 1 高低电平。这种信号无法通过单片机普通的逐次逼近ADC输出,而是来自于麦克风专用 **Σ-ΔADC,**这种ADC时钟极快(2~6MHz),每秒疯狂几百万次判断,只输出 0 或 1,从而得到PDM信号。

和 PCM 一样,PDM信号完整包含声音三要素

  • **音量:**整体脉冲越密集代表声音越大,整体越稀疏代表声音越小

  • **频率:**脉冲疏密变化越快代表音调越高,疏密变化越慢代表音调越低

  • **音色:**脉冲起伏规律形状来区分人声、杂音、乐器

2.3 区别与用途

首先,PCM和PDM两种信号的区别如下。

对比项 PCM PDM
单采样位数 16bit / 24bit 永远 1bit(只有高低电平)
正常采样率 44.1kHz / 48kHz 低速 2.8MHz~6MHz 超高过采样
声道支持 单声道、立体声、多声道 TDM 只能单声道,不支持立体声
配套 ADC 普通 SAR 逐次逼近 ADC 麦内置 Σ-Δ 高速 ADC
I2S 总线 原生完美支持 不兼容,无法直接传输
音频算法(降噪 / AEC) 完美运算 完全不能运算
Flash 存储 标准音频格式,直接存 频率太高,无法保存
信号线数量 I2S 要 3~5 根 CLK+DATA 2 根线
抗干扰能力 一般,长线易受干扰 极强,长线几乎无噪
芯片体积功耗 中等 极小、超低功耗

现在麦克风具有模拟麦和数字麦,区别如下:

对比维度 模拟麦克风 数字麦克风
核心定义 纯模拟器件,将声音震动转为连续模拟电压,无数字化环节 集成芯片的数字器件,内置ADC,直接输出PDM数字脉冲信号
接线方式 3根线:VCC、GND、OUT(模拟音频输出) 4根线:VCC、GND、CLK(时钟)、DATA(PDM数据),有效信号仅2根
输出信号 连续变化的模拟电压波形,无标准格式 1bit PDM数字脉冲流(仅0/1,靠脉冲疏密表示声音)
配套ADC 无内置ADC,需外接MCU普通SAR ADC(12位为主),自行采样量化 内置Σ-Δ高精度ADC,无需外接,直接输出数字化信号
抗干扰能力 极差,模拟电压易受电磁干扰,长线布线必串杂音、底噪大 极强,数字脉冲信号,抗干扰能力突出,长线传输几乎无噪声
信噪比(SNR) 60~70dB,嘈杂、底噪明显,声音干瘪 95~115dB,安静纯净,人声清晰,HiFi级表现
动态范围 低,高音易爆音、低音模糊,细节丢失严重 高,高音通透、低音饱满,声音细节还原完整
优确点 价格极低;老旧方案兼容性好。 抗干扰差;精度低;无噪声整形;音质不稳定;6. AEC回声消除效果极差 抗干扰强;动态范围大,音质好; 需要MCU硬件PDM转PCM;需专用I2S/PDM接口;价格稍高
多麦同步能力 无法严格同步,不能组成麦克风阵列,不支持远场拾音 可严格同步,完美支持4/6/8麦TDM阵列,适合远场唤醒、降噪
适用场景 低成本玩具、简单提示音、老旧设备、对音质无要求的场景 智能音箱、手机、TWS耳机、语音模块、高清通话、远场拾音、智能家居(高音质需求)
价格 极低(几毛钱/个) 稍高(1~3元/个,随精度提升波动)

I2S 总线只认 PCM,不认 PDM,单片机所有音频算法也只能处理 PCM,喇叭DAC解码器只能识别PCM信号。所以数字麦克风拿到 PDM后一般需要硬件滤波转成 PCM再通过I2S输出给MCU,这个转换叫抽取滤波 Decimation。

麦克风具有模拟麦和数字麦,音响、喇叭这些统称为功放,功放也同样具有PCM 功放和PDM 功放两种。

对比项目 PCM 数字功放 PDM 功放
输入信号 I2S 总线输入多比特 PCM 音频 CLK+DATA 输入1bit PDM 脉冲流
是否自带格式转换 内置PCM→PDM 硬件转换模块(Σ-Δ 调制) 无任何格式转换模块,只接收现成 PDM
完整信号流程 PCM → 芯片解码 → DAC 数模转换 → 内部 PCM 转 PDM → 功率放大 → LC 平滑滤波 → 模拟音频→喇叭 外部 MCU 输出 PDM → 直接功率放大 → RC 低通平滑 → 模拟音频→喇叭
DAC 类型 独立高精度多比特 DAC 无内置 DAC,直接脉冲放大
滤波电路 精密LC 低通滤波,失真小、音质纯净 简单RC 电容电阻滤波,高频杂波多
音频处理能力 支持 EQ 调音、降噪、混音、立体声全功能 无法做任何音效算法,只能原样播放
声道支持 立体声双声道、多声道 TDM 基本单声道,立体声布线复杂无优势
接线数量 I2S:WS+BCLK+DIN+DOUT+MCLK(5 线) 仅 CLK+DATA(2 根信号线)
时钟抖动抗干扰 极低,MCLK 主时钟校准,HiFi 低抖动 高频 MHz 脉冲,长线易干扰,音质劣化
音质上限 高解析、动态范围大、人声饱满细节丰富 上限低,适合语音提示,不适合听歌 HiFi
外部依赖 无需 MCU 提前转换格式,直接接收标准 PCM 必须MCU 外部先把 PCM 转为 PDM,才能使用
典型场景 蓝牙音箱、车载音响、智能家居高保真喇叭、通话全双工设备 手表、手环、耳机听筒、门铃提示音、低成本单声道小喇叭

把标准 PCM 音频转换成高速 PDM 脉冲,这个转换叫插值滤波 Interpolation。

从表格来看PDM功放加上外部专用的PCM→PDM 硬件转换模块就等于PCM功放,那为什么效果差PDM功放那么多呢?

这是因为PDM 转换越靠近喇叭、越在芯片内部做,音质越好PDM;转换越早、在 MCU 外部走长线,杂音越大、音质越烂。

PDM信号频率高,对噪声敏感性很高,输出端到接收端走线一长就容易失真,加上PCM功放内部一体化设计比PDM外部组合设计能达到更高的采样,更专业处理。故PCM功放优于PDM功放加外部转换模块。

音频处理流程众多,一条高保真完整音频全流程如下:

  • 采用数字麦克风,将外界声音模拟量,转换成PDM 信号
  • 音频解码器对PDM信号,进行硬件抽取滤波得到标准 16/24bit PCM信号,通过全双工 I2S + MCLK传输给MCU
  • MCU对PCM 信号进行各种数字音频算法处理,如降噪 ANC、回声消除 AEC、音量 AGC、EQ 调音
  • 将处理好的PCM音频信号,通过全双工 I2S + MCLK传输给 PCM 功放
  • 音频 DAC 芯片接收 PCM
  • PCM 功放内部自己把 PCM 转成 PDM
  • 继续转换成模拟电压,喇叭发声

三、通信模式

音频信号总共有三种通信模式、分别是标准模式、PDM 模式和TDM 模式,区别如下:

| 对比维度 | 标准 I2S | PDM | TDM |
| 数据编码 | 双声道多比特 PCM(16/24/32 位) | 1 比特脉冲密度 | 多通道多比特 PCM(分时复用) |
| 声道数 | 固定 2 声道 | 单声道(麦克风) | 可配置 4~32 声道 |
| 信号线数 | 3~5 线,I2S传输 | 2 线 | 3~5 线,I2S传输 |
| 通道能力 | 固定双声道(左 + 右),单条数据线 | 单声道或立体声(立体声需在时钟上升 / 下降沿分别采样) | 支持多通道(4/8/16/32 通道),单条数据线实现多声道传输 |
| 时钟频率 | 中速(1~3MHz) | 高速(2~6MHz) | 中高速(随声道数增加) |
| 主要用途 | 立体声播放 / 录音 | 低成本录音(麦克风) | 多通道音频采集 / 播放 |
| 功耗 | 中等 | 低(适合电池设备) | 中高(随声道数增加) |
| 解码需求 | 无需(直接使用) | 必须(PDM→PCM) | 无需(直接解析时隙) |
| 典型芯片 | DAC/ADC、音频 Codec | MEMS 数字麦克风 | 多通道 Codec、DSP |

信号流向 MCU→DAC / 功放(播放)或麦克风→MCU(录音) 麦克风→MCU(需解码)或 MCU→PDM 功放(直接放大) MCU→多通道 DAC / 功放或多麦克风→MCU(阵列采集)

以下各模式具体区别可查看《I2S通信模式

标准 I2S 模式:立体声高保真首选

标准模式中有且仅有左右两个声道,驱动中将声道称为 slot。这些声道可以支持 8/16/24/32 位宽的采样数据,声道的通信格式主要包括以下几种:(实际中选用哪个模式要看音频解码芯片支持的模式,其中Philips 格式兼容性最好,适用面最广)

  • Philips 格式:数据信号与 WS 信号相比有一个位的位移。WS 信号的占空比为 50%。

  • MSB 格式:与 Philips 格式基本相同,但其数据没有位移。

  • PCM 帧同步:数据有一个位的位移,同时 WS 信号变成脉冲,持续一个 BCLK 周期。

优势:协议成熟、兼容性强、音质稳定,是 HiFi 音频的基础传输方式

局限:仅支持双声道,多声道应用时需要多条 I2S 总线,硬件成本高

PDM 模式:极简硬件的语音应用王者

  • 独特优势仅需 2 根线,MEMS 麦克风无需复杂 ADC,体积小、成本低、功耗低
  • 致命短板 :高频脉冲对 PCB 布线要求极高,长线传输必失真,需专用抽取滤波器处理

TDM 模式:多声道音频的高效解决方案

TDM(Time Division Multiplexing,时分多路复用)模式最多支持 16 个声道。但由于硬件限制,声道设置为 32 位宽时最多只能支持 4 个声道,16 位宽时最多只能支持 8 个声道,8 位宽时最多只能支持 16 个声道。TDM 的声道通信格式与标准模式基本相同,但有一些细微差别。

  • Philips 格式:数据信号与 WS 信号相比有一个位的位移。无论一帧中包含多少个声道,WS 信号的占空比将始终保持为 50%。

  • MSB 格式:与 Philips 格式基本相同,但数据没有位移。

  • PCM 短帧同步:数据有一个位的位移,同时 WS 信号变为脉冲,每帧持续一个 BCLK 周期。

  • PCM 长帧同步:数据有一个位的位移,同时 WS 信号将在每一帧持续一个声道的宽度。例如,如果启用了四个声道,那么 WS 的占空比将是 25%,如果启用了五个声道,则为 20%

核心思想:将多个声道数据 "打包" 在一个 WS 帧周期内,每个声道占用固定时隙

计算示例:8 声道、32 位位深、48kHz 采样率的 TDM 系统,BCLK 频率 = 8×32×48kHz=12.288MHz

典型应用:汽车音响(4/6/8 声道)、家庭影院、专业录音设备,大幅减少 GPIO 占用

四、音频解码芯片

ES8311是顺芯开发的一款低功耗单声道音频编解码器,集成了24 位,采样频率 8 至 96 千赫兹的Σ-Δ ADC(录音)和 24 位,8 至 96 千赫兹的采样频率的Σ-Δ DAC(播放)。构造如图所示:

MIC1P、MIC1N是差分模拟音频输入,接收模拟麦克风采集的原始模拟声音电压。差分接法天生抗干扰,音质远超单端接法。

MCLK与I2S/PCM构成5线全双工I2S信号。

I²C 是芯片参数配置总线,不传输声音,只传设置指令

OUTP、OUTN是差分模拟音频功率输出,驱动PDM功放设备。

但是OUTP、OUTN输出的是毫伏级微弱模拟电压,仅能驱动 3.5mm 耳机,完全推不动喇叭。喇叭需要几百毫安~ 几安大电流才能震动发声,想要驱动无源喇叭,需要接一个D类功放。(有源喇叭一般内置D类功放)

D类功放是D类音频功率放大器,能把这个弱电音频,放大成大电流、大功率、能震动喇叭发声的强电音频。

电源供电组:

PVDD是数字输入和输出的电源供应

DVDD、DGND是数字电源供应

AVDD、AGND是模拟电源供应

数模分开供电接地,隔绝数字开关噪音,保护音频音质

模拟参考偏置组:

ADCVREF :ADC 模数转换基准电压

DACVREF :DAC 数模转换基准电压

VMID:模拟电路中点直流偏置,稳定工作点、消除杂音直流偏移

仅外接对地滤波电容,芯片内部生成稳定电压

该芯片功能还是比较全面的,输入可以接模拟麦克风和数字麦克风,输出可接PCM功放和PDM功放。

五、MCU的I2S资源

ESP32-P4 有三个标准 I2S 接口,为多媒体应用,尤其是为数字音频应用提供了灵活的数据通信接口。I2S 控制器通过 GPIO 交换矩阵可配置使用任意 GPIO 管脚。

ESP32-P4 内置一个 LP I2S 接口,为语音活动检测 (VAD) 模块和一些低功耗模式下的数字音频应用提供了数据接收通信接口。LP I2S 接口通过 LP GPIO 交换矩阵可配置使用任意 LP GPIO 管脚。

I2S 0~2都支持标准模式、PDM发送或接收模式(只利用WS 和 DATA)和TDM发送或接收模式。都可作为主机或从机,都可扩展到5根线实现全双。

其中I2S0内部具有PCM to-PDM 转换器,可以在 PDM TX 主机模式下启用,启用后,I2S 通过 GDMA 从存储器中取得脉冲编码调制 (PCM) 数据,将其转换为脉冲密度调制 (PDM) 数据并发送。

同时I2S0内部具有PDM to-PCM 转换器,可以在 PDM RX 主机或从机模式下启用。启用 后,I2S 接收脉冲密度调制 (PDM) 数据,将其转换为脉冲编码调制 (PCM) 数据,并将其通过 GDMA 存入存储器。

I2S时钟

I2S时钟源来源有4个,其中可配置为APLL_CLK,最大支持到240M。主时钟频率MCLK由时钟源分频而来,N的范围为[2, 256],一般不使用分数b/a。位时钟频率可由MCLK分频而来。这些值具体如何设置见下一篇。

相关推荐
上弦月-编程3 小时前
IDE调试快捷键全攻略
vscode
freewlt20 小时前
VS Code 扩展开发:集成 GitHub Copilot 的完整指南
vscode·node.js
此生只爱蛋21 小时前
【vscode环境配置心得】C++版
c++·ide·vscode
xinhuanjieyi1 天前
windows安装vscode服务端
ide·windows·vscode
开开心心就好1 天前
解决打印机共享难题的实用工具
人工智能·vscode·游戏·macos·音视频·语音识别·媒体
心之所向,自强不息1 天前
VSCode + EmmyLua 调试 Unity Lua(最简接入 + 不阻塞运行版)
vscode·unity·lua
石油人单挑所有1 天前
基于多设计模式下的同步&异步日志系统测试报告
服务器·c++·vscode·设计模式
乐飞鱼~万维网1 天前
vscode 调试xdebug 配置问题
ide·vscode·编辑器
❆VE❆1 天前
python基础篇(一):使用vscode搭建python相关环境
开发语言·vscode·python