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 量化与编码
采样把时间离散化了,但每个采样点的幅度还是连续的。量化就是把这些连续的幅度值,映射到有限的离散等级上。
量化过程:
- 把幅度范围分成若干等份(量化区间)
- 每个采样点落到哪个区间,就用该区间的代表值代替
- 代表值用二进制编码表示
量化位数(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 数据在存储或传输前,通常还会做进一步处理:
- 压缩:用有损压缩(如 MP3、AAC)或无损压缩(如 FLAC、ALAC)减小数据量
- 封装:把 PCM 数据放到容器格式里(如 WAV、AIFF、MP4)
- 加文件头:写入采样率、量化位数、声道数等元信息
一个小技巧:
调试音频算法时,我习惯先把处理结果存成 PCM 裸数据(.pcm 文件),然后用 Audacity 或 Python 的 scipy.io.wavfile 导入查看。这样能避免文件头解析带来的干扰,直接看到原始采样值。
好,这一章就到这里。模拟到数字的转换,说白了就是采样、量化、编码三步走。采样定理告诉你频率怎么选,量化决定了精度,PCM 就是最朴素的数字化结果。后面几章我们会在这个基础上,继续聊音频的前端处理——滤波、降噪、回声消除这些实战内容。