音频基础概念:采样率、位深、声道数与I2S总线协议
做音频开发,有几个基础概念绕不开。我刚开始接触音频项目时,也对这些术语一头雾水。说白了,采样率、位深、声道数这三个参数,决定了你听到的声音质量有多好,也决定了你的系统需要处理多少数据。
1. 采样率(Sample Rate)
采样率,就是每秒钟对模拟音频信号采样的次数。单位是Hz(赫兹)。
根据奈奎斯特采样定理:采样率必须大于信号最高频率的两倍,才能无失真地重建原始信号。人耳能听到的频率范围大约是20Hz~20kHz,所以CD音质的采样率定为44.1kHz,刚好覆盖人耳范围并留有余量。
常见采样率:
- 8kHz:电话语音,窄带通信
- 16kHz:宽带语音,VoIP
- 44.1kHz:CD音质,音乐播放
- 48kHz:DVD、电影、专业音频设备
- 96kHz / 192kHz:高解析度音频(Hi-Res)
我在项目中遇到过一个问题:用WM8960播放44.1kHz的音频文件,结果声音变调了。查了半天,发现是STM32的I2S时钟配置成了48kHz的倍频。嗯,这里要注意——采样率必须和时钟分频严格对应,否则声音要么变快要么变慢。
2. 位深(Bit Depth)
位深,也叫量化精度,表示每个采样点用多少位二进制数来表示。它决定了动态范围,也就是声音从最轻到最响能跨越多少级。
你想想看,16位能表示65536个等级,24位能表示16777216个等级。等级越多,声音的细节越丰富,底噪越低。
| 位深 | 动态范围 | 典型应用 |
|---|---|---|
| 8位 | ~48dB | 早期游戏、语音提示 |
| 16位 | ~96dB | CD、MP3 |
| 24位 | ~144dB | 录音棚、Hi-Res音频 |
| 32位 | ~192dB | 专业DSP内部处理 |
我的经验:在STM32+WM8960的方案中,我一般用24位位深。16位在安静环境下能听到量化噪声,32位又太浪费带宽和存储。24位是个很好的平衡点。
3. 声道数(Channels)
声道数就是音频信号的独立通道数量。
- 单声道(Mono):1个通道,所有扬声器发出相同声音
- 双声道(Stereo):2个通道,左声道和右声道,产生立体感
- 多声道:5.1、7.1等,用于环绕声
在I2S总线上,双声道是最常见的配置。WM8960本身就是立体声编解码器,支持左右声道独立输入输出。
4. 数据率计算
这三个参数组合起来,就决定了音频数据流的速度:
数据率(bps)= 采样率 × 位深 × 声道数
举个例子:
CD音质:44100 × 16 × 2 = 1,411,200 bps ≈ 1.41 Mbps
高解析度:96000 × 24 × 2 = 4,608,000 bps ≈ 4.61 Mbps
我曾经在调试一个录音项目时,发现DMA传输总是断流。一算数据率,发现I2S时钟跑得太快,DMA带宽不够用了。所以,配置之前先算一下数据率,能省很多排查时间。
5. I2S总线协议详解
I2S(Inter-IC Sound)是飞利浦公司制定的数字音频设备间传输音频数据的串行总线标准。它有三条主要信号线:
- SCK(BCLK):位时钟,每个脉冲对应一位数据
- WS(LRCK):声道选择/帧时钟,低电平左声道,高电平右声道
- SD(DATA):串行数据线
I2S有三种常见的对齐模式,我分别说一下。
5.1 标准I2S(Philips I2S)
标准I2S的特点是:WS切换后的第一个BCLK周期,不传输数据,数据从第二个BCLK开始传输。也就是说,数据相对于WS边沿有1个BCLK的延迟。
WS: ____|‾‾‾‾‾‾‾‾|____|‾‾‾‾‾‾‾‾|____
BCLK: ‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_
DATA: |MSB|...|LSB| |MSB|...|LSB|
← 左声道 → ← 右声道 →
这是最常用的模式,WM8960默认也支持这种模式。我个人习惯优先使用标准I2S,兼容性最好。
5.2 左对齐(Left Justified)
左对齐模式下,WS切换的同时,数据立即开始传输,没有延迟。MSB(最高有效位)对齐到WS边沿。
WS: ____|‾‾‾‾‾‾‾‾|____|‾‾‾‾‾‾‾‾|____
BCLK: ‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_
DATA: |MSB|...|LSB| |MSB|...|LSB|
← 左声道 → ← 右声道 →
左对齐在一些老式DAC和DSP中比较常见。我在调试一个古董级音频设备时遇到过这种格式,当时没注意配置,结果声音全是噪声。
5.3 右对齐(Right Justified)
右对齐模式下,数据的LSB(最低有效位)对齐到WS边沿。也就是说,数据在WS切换之前传输完毕。
WS: ____|‾‾‾‾‾‾‾‾|____|‾‾‾‾‾‾‾‾|____
BCLK: ‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_
DATA: |MSB|...|LSB| |MSB|...|LSB|
← 左声道 → ← 右声道 →
右对齐在索尼和部分日本厂商的设备中比较流行。说实话,我在实际项目中遇到右对齐的情况不多,但知道总比不知道好。
6. 三种模式对比
| 特性 | 标准I2S | 左对齐 | 右对齐 |
|---|---|---|---|
| 数据起始位置 | WS边沿后1个BCLK | WS边沿同时 | WS边沿前 |
| MSB对齐方式 | 延迟1位 | 立即对齐 | LSB对齐WS |
| 兼容性 | 最广泛 | 部分DSP/DAC | 部分日本厂商设备 |
| WM8960支持 | ✅ 是 | ✅ 是 | ✅ 是 |
避坑指南:我曾经在配置STM32的I2S外设时,把数据格式设成了左对齐,但WM8960默认是标准I2S。结果播放出来的声音全是刺耳的噪声。后来花了整整一个下午才找到原因——I2S的对齐模式必须主从设备一致。所以,初始化时一定要检查两边的配置是否匹配。
7. 知识体系结构图
下面这张图总结了本章的核心知识点,方便你快速回顾:
这张图把采样率、位深、声道数三个参数串联到数据率计算,再引出I2S总线和三种对齐模式。你调试的时候,可以对照这张图检查配置链路,哪里出问题一目了然。
小结一下:采样率决定频率范围,位深决定动态范围,声道数决定空间感。I2S的三种对齐模式,本质上是数据在BCLK上的摆放位置不同。只要主设备和从设备配置一致,就不会出问题。嗯,记住这一点,能少踩很多坑。