4. 音频信号基础:模拟信号与数字信号、采样定理、量化与编码、PCM格式

好,咱们进入第四章。这一章是声学处理里最基础、也最绕不开的一块——信号是怎么从模拟变成数字的。

我刚开始做音频开发那会儿,总觉得这玩意儿太理论,不就是把声音录进去嘛。直到有一次做语音唤醒项目,采样率设低了,结果人声高频全丢了,唤醒率直接腰斩。嗯,从那以后我再也不敢小看采样定理了。

4.1 模拟信号与数字信号

先说说这两个东西的区别。

模拟信号,说白了就是自然界里真实的声音。你说话时声带振动,空气被压缩、扩张,形成连续变化的声压波。这个波在时间上是连续的,幅度上也是连续的——你想想看,空气分子不可能跳着走,对吧?

数字信号就不一样了。它是用一串离散的数值来表示声音。时间上被切成了一个个点,幅度上也被量化成了有限的等级。说白了,就是给模拟信号拍快照,然后记下每个快照的数值。

核心区别一句话:

  • 模拟信号:连续时间 + 连续幅度
  • 数字信号:离散时间 + 离散幅度

为什么要把好好的模拟信号转成数字?我个人习惯用三个理由说服自己:

  • 抗干扰强:数字信号只有0和1,传输过程中就算有点噪声,只要没把0变成1,信息就不会丢。模拟信号就不行,噪声一叠加,信号就脏了。
  • 存储方便:数字信号可以存成文件,压缩、复制、传输都不失真。模拟磁带放久了会消磁,你懂的。
  • 处理灵活:数字信号可以用算法做各种处理——降噪、回声消除、变声、编解码。模拟电路想做到这些,成本高得吓人。

4.2 采样定理(奈奎斯特定理)

好,现在问题来了:要把模拟信号变成数字信号,第一步就是采样。那采样频率得设多高才够?

奈奎斯特定理给出了答案:采样频率必须大于信号最高频率的两倍。

用公式表示就是:

fs > 2 × fmax

其中 fs 是采样频率,fmax 是信号中最高频率分量。

为什么会这样?我试着用大白话解释一下:

你采样一个正弦波,如果每个周期只采一个点,你根本分不清它是在正半周还是负半周。采两个点,勉强能看出波形方向。采三个点以上,才能大致还原波形形状。所以最低要求就是每个周期至少采两个点——这就是2倍频率的由来。

我曾经踩过的坑:

有一次做麦克风阵列项目,信号最高频率是8kHz,我心想采样率设16kHz总够了吧?结果发现算法里有个非线性处理产生了高频分量,直接超过了8kHz,导致混叠失真。后来我学乖了——采样前一定要加抗混叠滤波器,把高于 fs/2 的频率全部滤掉。

实际工程中常用的采样率:

应用场景 采样率 最高频率
电话语音 8 kHz 4 kHz
宽带语音 16 kHz 8 kHz
CD 音质 44.1 kHz 22.05 kHz
专业音频 48 kHz 24 kHz
高采样率 96 kHz 48 kHz

你想想看,人耳能听到的频率范围大约是20Hz~20kHz,所以CD用44.1kHz采样,刚好覆盖。电话只传语音,4kHz就够,所以用8kHz采样。

4.3 量化与编码

采样把时间离散化了,但每个采样点的幅度还是连续的。量化就是把这些连续的幅度值,映射到有限的离散等级上。

量化过程:

  1. 把幅度范围分成若干等份(量化区间)
  2. 每个采样点落到哪个区间,就用该区间的代表值代替
  3. 代表值用二进制编码表示

量化位数(bit depth)决定了有多少个量化等级:

量化等级数 = 2^N,其中 N 是量化位数

举个例子:

  • 8 bit 量化:256 个等级
  • 16 bit 量化:65536 个等级
  • 24 bit 量化:16777216 个等级

我的经验:

做语音处理时,16 bit 量化基本够用。但如果是做音乐制作或者高动态范围的声学测量,我建议用24 bit。量化位数每增加1 bit,信噪比提升约6 dB。16 bit 的理论动态范围是96 dB,24 bit 能达到144 dB。

量化会产生误差,这个误差叫量化噪声。说白了,就是真实值和量化值之间的差值。量化噪声的功率跟量化步长有关,步长越小,噪声越小。

编码就是把量化后的数值用二进制表示。常见的编码方式有:

  • 自然二进制:直接按数值大小编码,简单直观
  • 补码:用于有符号数,方便做加减运算
  • μ-law / A-law:非线性编码,在低幅度区域用更小的量化步长,提升小信号的信噪比。电话系统里常用。

4.4 PCM 格式

PCM(Pulse Code Modulation,脉冲编码调制)是最原始、最直接的数字化音频格式。它就是把采样、量化、编码三步做完后的结果,直接存下来。

PCM 的特点:

  • 无压缩:每个采样点独立编码,不依赖前后数据
  • 无损:只要量化位数够,理论上可以完美还原模拟信号
  • 数据量大:没有压缩,所以文件体积大

PCM 的数据率计算公式:

数据率 (bps) = 采样率 (Hz) × 量化位数 (bit) × 声道数

举个例子,CD 音质的 PCM 数据率:

44.1 kHz × 16 bit × 2 声道 = 1,411,200 bps ≈ 1.41 Mbps

一分钟的立体声音频,大约占用 10.6 MB 空间。你想想看,一张 CD 能存 74 分钟,差不多 700 多 MB。

PCM 文件结构(简化版):

| 文件头 | 采样点1 | 采样点2 | ... | 采样点N |
         | 左声道 | 右声道 | 左声道 | 右声道 | ...

常见的 PCM 封装格式有 WAV、AIFF。WAV 就是在 PCM 数据前面加了个 RIFF 文件头,标明采样率、量化位数、声道数等信息。

下面这张图展示了从模拟信号到 PCM 数字信号的完整流程:

模拟信号 → PCM 数字信号 完整流程 模拟信号 抗混叠滤波 采样 量化 编码 PCM 数据 关键说明: 抗混叠滤波必须在采样之前做,否则高于 fs/2 的频率会折叠到低频区域,造成不可恢复的失真。

实际工程中,PCM 数据在存储或传输前,通常还会做进一步处理:

  • 压缩:用有损压缩(如 MP3、AAC)或无损压缩(如 FLAC、ALAC)减小数据量
  • 封装:把 PCM 数据放到容器格式里(如 WAV、AIFF、MP4)
  • 加文件头:写入采样率、量化位数、声道数等元信息

一个小技巧:

调试音频算法时,我习惯先把处理结果存成 PCM 裸数据(.pcm 文件),然后用 Audacity 或 Python 的 scipy.io.wavfile 导入查看。这样能避免文件头解析带来的干扰,直接看到原始采样值。

好,这一章就到这里。模拟到数字的转换,说白了就是采样、量化、编码三步走。采样定理告诉你频率怎么选,量化决定了精度,PCM 就是最朴素的数字化结果。后面几章我们会在这个基础上,继续聊音频的前端处理——滤波、降噪、回声消除这些实战内容。