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