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?嗯,这里有个历史原因,跟早期录像带的存储格式有关,我就不展开了。
3.2 位深:每个“快照”的精度
位深,也叫Bit Depth,决定了每个采样点的动态范围。说白了,就是每个“照片”能记录多少种颜色。位深越大,声音的细节越丰富,底噪越低。
常见的位深有:
- 16-bit:CD标准,动态范围96dB。够用,但做音频处理时容易丢细节。
- 24-bit:专业音频标准,动态范围144dB。我个人的习惯是,只要硬件支持,优先用24-bit。
- 32-bit:浮点格式,主要用于内部处理,很少直接传输。
你可能会问:“位深跟同步有什么关系?”关系大了。位深决定了每次传输的数据量。比如,16-bit的立体声,每个采样点就是4字节(左声道2字节 + 右声道2字节)。如果接收端按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。
3.5 避坑指南:我踩过的那些坑
做音频同步,PCM基础不牢,地动山摇。我分享几个亲身经历:
- 坑一:位深对齐问题 我曾经用STM32的I2S外设,默认配置是16-bit,但我的音频源是24-bit。结果数据左对齐,声音全是噪声。后来手动配置了I2S的数据格式才搞定。
- 坑二:时钟极性 I2S有标准和飞利浦两种模式,时钟极性不同。发送端和接收端必须一致。我调试时忘了检查这个,浪费了整整一天。
- 坑三:缓冲区大小 缓冲区太小容易溢出,太大又增加延迟。我的经验是:先根据采样率和位深算出每秒数据量,再乘以你期望的延迟时间(比如50ms),作为缓冲区大小的基准。
好了,PCM基础就讲到这里。下一章我们会深入I2S的时序细节,以及如何用DMA高效搬运音频数据。记住,采样率、位深、声道数这三个参数,是音频同步的“三驾马车”,任何一个出问题,同步都免谈。