2. 音频基础

各位同学,欢迎来到第二章。这一章我们聊点基础,但基础往往最容易被忽视。我见过不少工程师,算法调得飞起,结果板子一跑全是噪声,最后发现是数字音频接口的时序没配对。嗯,这种坑,踩过一次就记住了。

数字音频,说白了就是把连续的声波变成离散的0和1。怎么变?变完之后怎么传?这就是我们今天要讲的核心。

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

模拟信号是连续的,但数字系统只能处理离散的点。采样,就是每隔固定时间给信号拍一张“快照”。

采样率(Sample Rate),就是每秒拍多少张。单位是Hz(赫兹),或者更常见的kHz(千赫兹)。

奈奎斯特采样定理:采样率必须大于信号最高频率的两倍,才能无失真地重建原始信号。

公式:f_s > 2 × f_max

人耳能听到的频率范围大约是20Hz~20kHz。所以理论上,40kHz以上的采样率就够了。但实际工程中,我们留了余量。

常见的采样率有这些:

采样率 典型应用 我的备注
8 kHz 电话语音 够用,但声音像“罐头”
16 kHz VoIP、语音识别 语音质量明显提升
44.1 kHz CD音质 经典,音乐行业的基石
48 kHz 电影、DVD、专业音频 我项目里最常用的采样率
96 kHz / 192 kHz 高解析度音频 对超声波处理有用,但数据量翻倍

我的经验:做Codec驱动时,我习惯先确认主时钟(MCLK)和采样率的关系。很多Codec要求MCLK是采样率的整数倍(比如256倍或512倍)。配错了,I2S时钟分频就不对,出来的声音要么变调,要么全是噪声。

2.2 位深:动态范围的“刻度尺”

采样率决定了时间上的精度,那位深(Bit Depth)决定的就是幅度上的精度。

每个采样点,我们用多少比特来表示它的幅度?

  • 16-bit:CD标准,动态范围约96dB。够用,但录音和混音时余量不大。
  • 24-bit:专业音频标准,动态范围约144dB。我现在做Codec项目,基本都用24-bit。
  • 32-bit:有些高端Codec支持,但实际有效位数(ENOB)通常到不了32。

位深每增加1 bit,信噪比提升约6 dB。这个公式要记住:

动态范围(dB)≈ 6.02 × N + 1.76,其中N是位深。

注意:位深不是越高越好。位深高了,数据量也大了。在嵌入式系统里,DMA带宽和内存都是有限的。我曾经在一个项目里为了追求“理论上的高音质”用了32-bit,结果DMA带宽不够,导致音频断流。后来老老实实改回24-bit,问题解决。

2.3 声道数:单声道、立体声与多通道

声道数,就是同时传输的独立音频信号的数量。

  • 单声道(Mono):1个声道。语音、对讲机常用。
  • 立体声(Stereo):2个声道。左+右,音乐、电影标配。
  • 多声道:5.1、7.1、甚至更多。家庭影院、车载音响。

在Codec里,声道数直接影响数据线的数量。I2S只能传立体声,TDM可以传多通道。后面会细讲。

2.4 PCM编码格式:最朴素的音频“原片”

PCM(Pulse Code Modulation,脉冲编码调制),是数字音频最基础的编码格式。它不做任何压缩,直接保存采样后的数值。

PCM数据在内存里怎么排列?这涉及到字节序(Endian)和数据格式。

常见的PCM格式:

  • 有符号整型(Signed Integer):最常用。16-bit PCM通常是signed 16-bit little-endian。
  • 无符号整型(Unsigned Integer):8-bit PCM常用,但动态范围小。
  • 浮点型(Float):32-bit float,DSP内部处理常用,但Codec一般不直接支持。

举个例子,一个16-bit立体声PCM帧,在内存里长这样:

| Left Sample (16-bit) | Right Sample (16-bit) |
| LSB | MSB | LSB | MSB |  // Little-endian 排列

避坑指南:我曾经在调试一个蓝牙音频项目时,发现声音全是“嘶嘶”声。查了两天,最后发现是PCM数据的字节序搞反了。Codec期待的是little-endian,我送的是big-endian。嗯,从那以后,我每次初始化Codec都会先确认数据格式。

2.5 I2S/TDM总线协议:音频数据的“高速公路”

PCM数据在Codec和SoC之间怎么传?靠的就是数字音频总线。最主流的是I2S和TDM。

2.5.1 I2S总线

I2S(Inter-IC Sound)是飞利浦公司定义的串行总线协议,专门用于传输音频数据。它只需要3根线:

  • BCLK(位时钟):每个数据位对应一个脉冲。频率 = 采样率 × 位深 × 声道数。
  • LRCK(左右声道时钟/帧时钟):切换左右声道。频率 = 采样率。
  • SDATA(串行数据):音频数据线。

I2S的时序有个特点:LRCK变化后,SDATA在BCLK的第二个上升沿开始传输数据。而且数据是MSB先行。

举个例子,48kHz采样率、24-bit立体声:

  • BCLK频率 = 48k × 24 × 2 = 2.304 MHz
  • LRCK频率 = 48 kHz

我建议:调试I2S时,用示波器看BCLK和LRCK的波形。如果BCLK频率算出来不对,先查MCLK分频配置。如果LRCK有毛刺,检查一下GPIO的驱动能力。这些细节,手册上不会写,但实际项目中经常遇到。

2.5.2 TDM总线

I2S只能传2个声道。那如果Codec有8个输入、8个输出呢?用TDM(Time Division Multiplexing,时分复用)。

TDM本质上和I2S很像,但帧时钟(Frame Sync)不再区分左右,而是标记一帧的开始。每个时隙(Slot)对应一个声道的数据。

TDM的配置参数:

参数 说明 举例
Slot数 一帧里有多少个时隙 8个Slot
Slot宽度 每个时隙占多少bit 24-bit或32-bit
帧同步方式 短帧同步(一个BCLK宽)或长帧同步 短帧同步更常见

比如,一个8通道TDM,48kHz采样率,32-bit slot:

  • BCLK频率 = 48k × 32 × 8 = 12.288 MHz

这个频率已经比较高了,PCB布线要注意信号完整性。

注意:TDM的Slot宽度和实际位深可以不同。比如Codec支持24-bit数据,但Slot宽度配成32-bit。多出来的bit怎么办?有些Codec会补0,有些会忽略。我遇到过Codec因为Slot宽度不匹配,导致数据错位,声音完全乱掉。所以,一定要看Codec的datasheet,确认它期望的Slot宽度。

2.6 知识体系总览

下面这张图,把本章的核心概念串起来了。从模拟信号到数字PCM数据,再通过I2S/TDM总线送到Codec,每一步都有对应的参数要配。

数字音频基础框架图 数字音频基础框架 模拟音频信号 采样 采样率 (fs) 量化 位深 (Bit Depth) PCM 编码数据 字节序 / 数据格式 声道数 Mono / Stereo / Multi I2S / TDM 总线 BCLK / LRCK / SDATA Codec 💡 核心逻辑: 模拟信号 → 采样(确定时间精度)→ 量化(确定幅度精度)→ PCM编码(确定数据格式)→ I2S/TDM传输(确定物理连接)→ Codec处理

这张图我画了好几次才满意。你看,从模拟信号到Codec,每一步都有参数要配。采样率、位深、声道数决定了PCM数据流的“体量”;I2S/TDM决定了数据怎么“跑”到Codec里。任何一个环节配错,声音都出不来。

2.7 本章小结

这一章我们聊了数字音频的几个核心概念:

  • 采样率决定了时间分辨率,要满足奈奎斯特定理。
  • 位深决定了动态范围,24-bit是当前Codec的主流。
  • 声道数决定了数据通道数量,I2S最多2通道,TDM可以更多。
  • PCM是最基础的音频编码,注意字节序和数据格式。
  • I2S/TDM是数字音频的传输总线,BCLK频率要算对,时序要配准。

这些基础概念,后面每一章都会用到。尤其是做Codec驱动开发和音频算法移植时,采样率和位深直接决定了你的算法能不能跑得动,I2S/TDM的配置决定了数据能不能正确收发。嗯,打好基础,后面才能走得更远。