3、PCM音频基础:采样率、位深、声道数、I2S协议简介

做音频同步,绕不开PCM。说白了,PCM就是数字音频的“原材料”。你听到的每一首无损音乐,本质上都是一串串PCM数据在流动。我刚开始接触嵌入式音频时,总觉得这东西很玄乎,后来发现,搞懂三个参数和一个协议,基本就入门了。

3.1 采样率:时间轴上的“快照”频率

采样率,英文叫Sample Rate,单位是Hz。它表示一秒钟内,对模拟音频信号“拍照”了多少次。你想想看,拍照次数越多,还原出来的画面就越细腻,对吧?音频也是这个道理。

常见的采样率有这些:

采样率 常见用途 我的个人看法
8 kHz 电话语音 够用,但别指望音质
44.1 kHz CD音质 经典,大部分音乐都是这个
48 kHz DVD、电影、专业音频 我项目里最常用的采样率
96 kHz / 192 kHz 高解析度音频 对同步要求极高,慎用

这里有个关键点——奈奎斯特采样定理。它说:采样率必须大于信号最高频率的两倍。人耳能听到的上限大约是20kHz,所以44.1kHz刚好够用。为什么是44.1而不是44?嗯,这里有个历史原因,跟早期录像带的存储格式有关,我就不展开了。

注意: 采样率不匹配是音频同步失败的常见原因。我曾经在一个项目中,发送端用48kHz,接收端误配成44.1kHz,结果声音越播越快,像开了1.1倍速一样。排查了半天才发现是采样率没对齐。

3.2 位深:每个“快照”的精度

位深,也叫Bit Depth,决定了每个采样点的动态范围。说白了,就是每个“照片”能记录多少种颜色。位深越大,声音的细节越丰富,底噪越低。

常见的位深有:

  • 16-bit:CD标准,动态范围96dB。够用,但做音频处理时容易丢细节。
  • 24-bit:专业音频标准,动态范围144dB。我个人的习惯是,只要硬件支持,优先用24-bit。
  • 32-bit:浮点格式,主要用于内部处理,很少直接传输。

你可能会问:“位深跟同步有什么关系?”关系大了。位深决定了每次传输的数据量。比如,16-bit的立体声,每个采样点就是4字节(左声道2字节 + 右声道2字节)。如果接收端按24-bit去解析,数据就全乱了。

小技巧: 在调试I2S时,我习惯先确认位深配置。很多开发板的默认位深是16-bit,但你的音频文件可能是24-bit。不匹配的话,出来的声音要么是“嘶嘶”的噪声,要么是严重失真。

3.3 声道数:声音的空间感

声道数,这个好理解。单声道(Mono)就是一路信号,立体声(Stereo)是两路。多声道系统(5.1、7.1)在嵌入式音响里也有,但咱们做同步,最常打交道的是立体声。

声道数直接影响数据量:

  • 单声道:数据量 = 采样率 × 位深 / 8
  • 立体声:数据量 = 采样率 × 位深 / 8 × 2

举个例子:48kHz、24-bit的立体声,每秒的数据量是:

48000 × 24 / 8 × 2 = 288,000 字节/秒 ≈ 281 KB/s

这个数字,你心里要有数。因为它决定了你的缓冲区大小和DMA传输频率。我在做WiFi音频同步时,就因为这个数据量估算不准,导致缓冲区频繁溢出,声音断断续续。

3.4 I2S协议简介:音频的“高速公路”

I2S(Inter-IC Sound)是飞利浦公司发明的,专门用来在芯片之间传输PCM音频数据。它只有三条线:

  • SCK(串行时钟):也叫位时钟(BCLK),每个脉冲传输一个bit。
  • WS(字选择):也叫帧时钟(LRCK),用来区分左右声道。高电平通常是右声道,低电平是左声道。
  • SD(串行数据):就是PCM数据本身。

I2S的时序其实不复杂。我画个简单的示意图:

SCK:  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
WS:  ___-----------------------___
SD:  [左声道数据][右声道数据][左声道数据]

WS的频率就等于采样率。比如48kHz采样,WS就是48kHz的方波。SCK的频率 = 采样率 × 位深 × 声道数。还是那个例子:48kHz、24-bit、立体声,SCK频率 = 48000 × 24 × 2 = 2.304 MHz。

核心要点: I2S的同步,本质上就是让发送端和接收端的SCK和WS完全对齐。只要这两个时钟对上了,数据就不会错。我在项目中遇到过最头疼的问题,就是两个设备的MCLK(主时钟)不同步,导致SCK产生漂移。后来加了PLL锁相环才解决。

3.5 避坑指南:我踩过的那些坑

做音频同步,PCM基础不牢,地动山摇。我分享几个亲身经历:

  • 坑一:位深对齐问题 我曾经用STM32的I2S外设,默认配置是16-bit,但我的音频源是24-bit。结果数据左对齐,声音全是噪声。后来手动配置了I2S的数据格式才搞定。
  • 坑二:时钟极性 I2S有标准和飞利浦两种模式,时钟极性不同。发送端和接收端必须一致。我调试时忘了检查这个,浪费了整整一天。
  • 坑三:缓冲区大小 缓冲区太小容易溢出,太大又增加延迟。我的经验是:先根据采样率和位深算出每秒数据量,再乘以你期望的延迟时间(比如50ms),作为缓冲区大小的基准。

好了,PCM基础就讲到这里。下一章我们会深入I2S的时序细节,以及如何用DMA高效搬运音频数据。记住,采样率、位深、声道数这三个参数,是音频同步的“三驾马车”,任何一个出问题,同步都免谈。