2、音频基础概念:采样率、位深、声道数、PCM数据格式、I2S协议简介
各位同学,欢迎来到第二讲。
说实话,很多初学者一上来就急着写驱动、调寄存器,结果连音频数据长什么样都没搞明白。我见过太多人拿着I2S的波形图发呆,或者把PCM数据解析得乱七八糟。今天这一讲,咱们就把这些最基础的概念彻底捋清楚。
2.1 采样率(Sample Rate)
先问大家一个问题:声音是连续的,但数字系统只能处理离散的0和1,怎么办?
答案就是采样。说白了,就是每隔一小段时间,把声音的瞬时电压值记下来。这个「每隔一小段时间」的频率,就是采样率。
常见的采样率:
- 8 kHz:电话语音,够用就行。我以前做对讲机项目就用这个,省带宽。
- 44.1 kHz:CD音质标准。为什么是44.1?不是44?也不是45?嗯,这里有个历史原因——为了兼容PAL和NTSC电视制式,这个数字是算出来的。你记住它就行。
- 48 kHz:DVD、电影、专业音频设备常用。我个人习惯做嵌入式音频项目时优先选48 kHz,因为很多SoC的时钟分频更容易对齐。
- 96 kHz / 192 kHz:高解析度音频,Hi-Fi玩家最爱。但说实话,在嵌入式设备里,除非你跑的是高端音响,否则没必要。我曾经在一个低功耗蓝牙音箱上试过96 kHz,结果CPU直接飙到80%,电池撑不过两小时。
核心原则:根据奈奎斯特定理,采样率必须大于信号最高频率的两倍。人耳能听到20 Hz ~ 20 kHz,所以44.1 kHz刚好够用。你想想看,如果采样率设低了,高频声音就会「混叠」成低频噪声,听起来像嘶嘶声——我踩过这个坑。
2.2 位深(Bit Depth)
采样率决定了「多快」记录一次,位深决定了「多精细」记录每个点。
位深就是每个采样点用多少比特来表示。常见的位深有:
| 位深 | 动态范围 | 典型应用 |
|---|---|---|
| 8 bit | 48 dB | 早期游戏机、语音提示 |
| 16 bit | 96 dB | CD、MP3、绝大多数嵌入式音频 |
| 24 bit | 144 dB | 专业录音、高端音响 |
| 32 bit | 192 dB | 音频工作站内部处理 |
我在项目中遇到过一个问题:用16 bit录了一段钢琴,结果弱音部分全是底噪。后来换成24 bit,动态范围大了,弱音细节就出来了。但代价是数据量大了50%。
我的建议:嵌入式产品如果对成本敏感,16 bit + 48 kHz是黄金组合。音质够用,数据量可控。别盲目追求24 bit,除非你的DAC和功放能撑得住。
2.3 声道数(Channels)
声道数就是同时录/放几路声音。
- 单声道(Mono):1路。对讲机、语音助手够用。
- 双声道(Stereo):2路。左+右,听音乐必备。
- 多声道(5.1 / 7.1):家庭影院、车载音响。嵌入式里少见,但高端音响项目会碰到。
你想想看,如果驱动写错了,左声道的数据跑到右声道去了,听起来就像声音在脑袋里转圈——我调试时遇到过,排查了半天才发现是DMA配置里声道交错顺序搞反了。
2.4 PCM数据格式
PCM,全称Pulse Code Modulation,脉冲编码调制。说白了,就是上面说的采样+量化后的原始数据。
PCM数据在内存里怎么排列?最常见的是两种:
交错模式(Interleaved):
// 双声道16 bit交错排列
// 内存顺序:L0, R0, L1, R1, L2, R2, ...
// 每个采样点2字节,小端序
uint8_t pcm_buffer[] = {
0x34, 0x12, // 左声道第1个采样 (0x1234)
0x56, 0x34, // 右声道第1个采样 (0x3456)
0x78, 0x56, // 左声道第2个采样 (0x5678)
0x9A, 0x78 // 右声道第2个采样 (0x789A)
};
非交错模式(Non-interleaved / Planar):
// 双声道16 bit非交错排列
// 内存顺序:L0, L1, L2, ..., R0, R1, R2, ...
uint8_t left_channel[] = { 0x34, 0x12, 0x78, 0x56, ... };
uint8_t right_channel[] = { 0x56, 0x34, 0x9A, 0x78, ... };
注意:I2S协议默认使用交错模式。我曾经在移植一个音频库时,没注意它用的是非交错模式,结果I2S输出全是噪声。排查了整整一天才发现是数据排列问题。所以,拿到音频数据先确认排列方式,别想当然。
2.5 I2S协议简介
I2S(Inter-IC Sound)是飞利浦公司发明的,专门用来在芯片之间传输音频数据。它只有三条线:
- BCLK(位时钟):每个脉冲对应一个数据位。频率 = 采样率 × 位深 × 声道数。
- LRCK(左右声道时钟):也叫帧时钟。高电平表示左声道,低电平表示右声道(或者反过来,看配置)。频率 = 采样率。
- SD(串行数据):数据线,按位传输。
举个例子:48 kHz采样率、16 bit、双声道,BCLK频率 = 48000 × 16 × 2 = 1.536 MHz。
I2S有几种标准模式:
| 模式 | 数据对齐 | 说明 |
|---|---|---|
| I2S 标准 | 数据在LRCK变化后的第二个BCLK上升沿开始 | 最常用,飞利浦原版 |
| 左对齐 | 数据在LRCK变化后的第一个BCLK上升沿开始 | 有些DAC用这个 |
| 右对齐 | 数据对齐到LRCK变化前的最后一个BCLK | 少见,但老芯片里还有 |
| DSP模式 | 数据连续传输,LRCK只标记帧起始 | 多声道场景常用 |
避坑指南:我曾经在一个项目里,MCU的I2S控制器和DAC芯片的I2S时序差了一个BCLK周期。示波器一看,数据位整体偏移了一位。解决方案是调整I2S的「数据延迟」配置,或者改用左对齐模式。所以,拿到新芯片,第一件事就是看数据手册里的时序图,别偷懒。
2.6 小结
这一讲的内容其实就四个字:采样、量化、排列、传输。
- 采样率决定频率上限
- 位深决定动态范围
- 声道数决定空间感
- PCM是原始数据格式
- I2S是传输协议
下一讲,我们会真正开始动手,配置一个I2S外设,让喇叭发出声音。到时候你会发现,今天这些概念会反复用到。嗯,打好基础,后面就快了。
公众号:蓝海资料掘金营,微信deep3321