音频信号基础:采样率与量化精度、奈奎斯特定理、时域与频域表示、分帧与加窗
各位同学,欢迎来到第二章。说实话,音频信号处理是整个语音识别前端的第一道关卡。你后面模型再厉害,如果前端信号处理没做好,那就是「垃圾进,垃圾出」。我见过太多项目,花了大把时间调模型,结果发现是采样率设错了,或者加窗方式不对——嗯,这种坑我自己也踩过。
这一章我们就把音频信号的几个核心概念彻底讲透。你理解了这些,后面做特征提取、降噪、端点检测,心里才有底。
2.1 采样率:把连续声音变成离散点
声音在自然界是连续的波形,但计算机只能处理离散的数字。采样,就是每隔一小段时间,记录一次声音的瞬时幅度值。
采样率(Sample Rate)就是每秒采样的次数,单位是 Hz。比如 16000 Hz,意思是一秒采 16000 个点。
| 采样率 | 常见场景 | 我的建议 |
|---|---|---|
| 8000 Hz | 电话语音 | 够用,但高频信息丢失严重 |
| 16000 Hz | 语音识别标准 | 首选,兼顾精度与计算量 |
| 44100 Hz | 音乐 CD | 语音识别没必要,浪费算力 |
| 48000 Hz | 专业音频 | 除非做多模态,否则不推荐 |
2.2 奈奎斯特定理:为什么不能随便降采样
你可能会问:采样率是不是越高越好?也不是。但采样率太低,问题就大了。
奈奎斯特定理说得很清楚:采样率必须大于信号最高频率的两倍,否则就会发生混叠(Aliasing)。
举个例子。人声最高频率大约 8000 Hz,那么采样率至少需要 16000 Hz。如果你用 8000 Hz 去采,那 4000 Hz 以上的频率就会「伪装」成低频信号混进来——你听到的声音就失真了。
实际工程中,我们通常留一点余量。比如语音用 16000 Hz(理论最低 16000 Hz 刚好够),但保险起见会用到 22050 Hz。不过我个人习惯还是 16000 Hz,配合一个截止频率在 7500 Hz 左右的抗混叠滤波器,效果很稳。
2.3 量化精度:每个采样点用多少比特
采样决定了「什么时候采」,量化决定了「采到的值用多少精度存」。
量化精度(Bit Depth)就是每个采样点用多少位二进制数表示。常见的有 8 bit、16 bit、24 bit、32 bit float。
- 8 bit:256 个等级,噪声大,基本不用
- 16 bit:65536 个等级,语音识别标准配置
- 24 bit:16777216 个等级,动态范围更大
- 32 bit float:浮点表示,适合中间处理,不适合存储
量化精度直接影响信噪比(SNR)。每增加 1 bit,理论上信噪比提升约 6 dB。16 bit 的理论动态范围是 96 dB,对于语音来说已经足够。
2.4 时域与频域:同一信号的两副面孔
音频信号有两种最基本的表示方式:时域和频域。
时域就是波形图,横轴是时间,纵轴是幅度。你看到的就是声音的「原始模样」——哪里声音大,哪里声音小,哪里是静音。
频域则是频谱图,横轴是频率,纵轴是能量。它告诉你声音里包含哪些频率成分,每个频率有多强。
从时域到频域,靠的是傅里叶变换(FFT)。这个变换本身不复杂,但你要理解它的物理意义:把一段信号分解成不同频率的正弦波之和。
我刚开始学的时候,总觉得时域更直观。但做语音识别,频域才是主角。为什么?因为人耳对频率的感知比对幅度的感知更敏感。而且语音的语义信息,主要藏在频率分布里,而不是波形形状里。
2.5 分帧:语音信号不是平稳的,但短时是
语音信号是非平稳的——你的发音在不停变化。但有一个重要的假设:在极短的时间(10-30 毫秒)内,信号可以看作是平稳的。这就是短时平稳假设。
基于这个假设,我们把长语音切成一段段短片段,每段叫一帧(Frame)。
帧长一般取 20-30 毫秒。太短了,频率分辨率不够;太长了,平稳假设不成立。
帧移(Hop Size)是相邻两帧起始位置之间的间隔。通常取帧长的一半或三分之一,保证帧与帧之间有重叠,避免信息丢失。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 帧长 | 25 ms(400 点 @16kHz) | 兼顾频率分辨率和时间分辨率 |
| 帧移 | 10 ms(160 点 @16kHz) | 60% 重叠,保证帧间连续性 |
| 每帧点数 | 512 或 1024 | 通常取 2 的幂,方便 FFT |
2.6 加窗:避免频谱泄漏
直接对一帧信号做 FFT 会有一个问题:帧的边界处信号被「硬切」了,导致频谱中出现原本不存在的频率成分——这就是频谱泄漏。
解决办法是加窗。用一个窗函数(Window Function)乘以原始信号,让帧两端的幅度平滑地衰减到零。
常用的窗函数有几种:
- 汉明窗(Hamming Window):语音识别最常用,旁瓣衰减适中
- 汉宁窗(Hann Window):旁瓣衰减更快,但主瓣稍宽
- 布莱克曼窗(Blackman Window):旁瓣衰减最大,但频率分辨率最低
我个人习惯用汉明窗。它在主瓣宽度和旁瓣衰减之间取得了很好的平衡,语音识别领域几乎成了默认选择。
// 汉明窗公式
w[n] = 0.54 - 0.46 * cos(2 * PI * n / (N - 1))
// 加窗操作
x_windowed[n] = x[n] * w[n]
注意,加窗是在分帧之后、FFT 之前做的。顺序不能乱。
2.7 知识体系总览
下面这张图把本章的核心概念串起来了。你可以看到,从原始声音到可处理的频域特征,中间经历了采样、量化、分帧、加窗、FFT 这几个关键步骤。
你看,从模拟声音到频域特征,每一步都有它的物理意义和工程考量。采样率决定了你能看到多高的频率,量化精度决定了信号的动态范围,分帧和加窗则是为了满足 FFT 的前提条件。
这些概念单独看都不难,但组合在一起,就是整个语音识别前端的基石。后面讲 MFCC、滤波器组、降噪算法,全都建立在这些基础之上。