1. 音频基础与数字信号入门
各位同学,欢迎来到《声学特征提取部署实践》的第一章。
做音频算法这些年,我见过不少工程师一上来就调模型、跑特征,结果遇到采样率不匹配、量化噪声爆炸的问题,debug 到怀疑人生。说白了,声学特征提取的根基,就是今天要聊的这些基础概念。你把这些搞透了,后面部署模型时才能心里有底。
1.1 声音的物理特性
声音的本质是什么?是振动。声源振动,挤压空气分子,形成疏密波,传到我们耳朵里。
描述一个声音,通常看三个物理量:
- 频率(Frequency):每秒振动的次数,单位 Hz。频率越高,音调越高。人耳能听到的范围大约是 20 Hz – 20 kHz。
- 幅度(Amplitude):振动的强弱,决定音量大小。通常用声压级(SPL, dB)表示。
- 相位(Phase):振动在时间轴上的起始位置。虽然人耳对相位不敏感,但在阵列信号处理中,相位差是定位声源的关键。
核心要点:频率决定了我们处理的上限,幅度决定了量化精度需求,相位决定了多通道算法的成败。三者缺一不可。
我记得刚入行时,有个项目要做远场语音唤醒。麦克风阵列的相位校准没做好,结果 beamforming 出来的信号还不如单麦。嗯,从那以后我再也不敢轻视相位了。
1.2 采样定理
模拟信号是连续的,计算机只能处理离散的数值。怎么把连续信号变成离散点?采样。
这里有个黄金法则——奈奎斯特-香农采样定理:
如果模拟信号的最高频率为 f_max,那么采样频率 f_s 必须满足 f_s > 2 × f_max,才能无失真地重建原始信号。
为什么会这样?你想想看,采样其实是用离散点去“拟合”连续波形。如果采样太慢,高频成分会被“伪装”成低频,这就是混叠(Aliasing)。
避坑指南:我曾经在一个语音增强项目里,直接用 8 kHz 采样率去采集 4 kHz 以上的声音成分。结果高频噪声全部折叠到低频段,降噪算法怎么调都压不下去。后来加了抗混叠滤波器才解决。记住:采样前一定要做低通滤波!
实际工程中,我习惯把采样率设为最高频率的 2.5 – 3 倍,留出过渡带余量。比如语音信号最高 8 kHz,我会用 22.05 kHz 或 24 kHz 采样。
1.3 量化与编码
采样把时间轴离散化了,但每个采样点的幅度还是连续的。量化就是把这些连续幅度值映射到有限个离散等级上。
量化有两个关键参数:
- 量化位数(Bit Depth):比如 16-bit 有 65536 个等级,24-bit 有 16777216 个等级。位数越高,动态范围越大,量化噪声越低。
- 量化噪声:量化误差本质上是一种噪声。每增加 1 bit,信噪比提升约 6 dB。16-bit 的理论动态范围是 96 dB。
| 量化位数 | 等级数 | 理论动态范围 | 常见应用 |
|---|---|---|---|
| 8-bit | 256 | 48 dB | 早期电话、低端对讲 |
| 16-bit | 65536 | 96 dB | CD 音质、语音识别 |
| 24-bit | 16777216 | 144 dB | 专业录音、高动态音频 |
| 32-bit float | 约 4.3e9 | 理论无限 | 音频处理内部计算 |
个人经验:在嵌入式部署时,我建议用 16-bit 定点数做特征提取。32-bit float 虽然精度高,但计算量大、内存占用高。16-bit 配合适当的缩放因子,完全能满足 ASR 和唤醒词的需求。
编码则是把量化后的数值用二进制表示。常见的编码方式有:
- PCM(脉冲编码调制):最原始、最直接的编码方式,WAV 文件常用。
- μ-law / A-law:非线性编码,在低比特率下保持语音清晰度,电话系统里用得很多。
- 浮点编码:32-bit float 或 64-bit double,用于高精度中间计算。
1.4 奈奎斯特频率
奈奎斯特频率就是采样频率的一半,即 f_N = f_s / 2。它是系统能无混叠处理的最高频率。
举个例子:CD 音质的采样率是 44.1 kHz,奈奎斯特频率就是 22.05 kHz。人耳上限约 20 kHz,所以 CD 能完整覆盖人耳听觉范围。
但在实际系统中,我们不会让信号刚好到奈奎斯特频率。因为抗混叠滤波器不是理想砖墙,会有过渡带。我一般会留 10% – 20% 的余量。
工程口诀:采样率 = 2.5 × 最高频率,量化位数 = 16-bit 起步,编码格式 = 看平台选。这三板斧能解决 80% 的音频采集问题。
1.5 本章知识体系
下面这张图把今天讲的核心概念串起来了。你可以把它当作一张“音频数字化路线图”。
从模拟声波到数字音频,经历了采样、量化、编码三步。每一步都有对应的理论约束:采样受奈奎斯特频率限制,量化受位数和噪声限制,编码受平台和精度限制。把这些搞清楚了,后面做特征提取时,你就能知道哪些参数能调、哪些不能动。
我的建议:初学者可以先拿一个 WAV 文件,用 Python 的 scipy.io.wavfile 读进来,看看采样率、量化位数、声道数。然后试着降采样或降低量化位数,听听音质变化。亲手试一遍,比看十遍理论都管用。