数字信号处理基础(上):声音的物理特性与采样量化
各位同学,欢迎来到第二章。说实话,数字信号处理(DSP)是语音算法的地基。我见过不少新手,模型调得挺溜,一碰到采样率不匹配、混叠噪声这些问题就懵了。今天我们就从声音的物理特性讲起,把采样、量化、奈奎斯特定理这些核心概念彻底搞明白。
2.1 声音的物理三要素:频率、振幅、相位
声音的本质是什么?是机械振动在介质(空气、水、固体)中传播的纵波。描述一个简谐波,只需要三个参数:频率、振幅、相位。
- 频率(Frequency):单位时间内振动的周期数,单位 Hz。人耳能听到的范围大约是 20 Hz ~ 20 kHz。语音中,元音的基频(F0)男性一般在 80~200 Hz,女性在 150~350 Hz。
- 振幅(Amplitude):振动的最大偏移量,决定了声音的响度。在数字信号里,振幅对应采样值的动态范围。
- 相位(Phase):描述波形在时间轴上的起始位置,单位是角度(°)或弧度(rad)。
重要概念:人耳对频率和振幅的变化非常敏感,但对相位的感知相对迟钝。这就是为什么很多语音编解码器敢在相位上做手脚——人耳听不太出来。
我在做语音增强项目时,遇到过一个问题:降噪算法把相位信息搞乱了,结果语音听起来有「金属声」。后来我意识到,虽然人耳对相位不敏感,但相位失真太严重时,重建的波形会引入大量谐波失真。嗯,这里要注意,相位不是可以随便扔的。
2.2 从连续到离散:采样
麦克风采集到的声音是连续的模拟信号。但计算机只能处理离散的数字序列。怎么把连续信号变成离散信号?靠采样。
采样就是每隔一个固定的时间间隔 Δt,记录一次信号的瞬时值。这个间隔的倒数就是采样率 fs = 1/Δt,单位 Hz。
| 应用场景 | 典型采样率 | 说明 |
|---|---|---|
| 电话语音 | 8 kHz | 覆盖 0~4 kHz,够听懂说话 |
| 宽带语音 | 16 kHz | 覆盖 0~8 kHz,音质明显提升 |
| CD 音质 | 44.1 kHz | 覆盖 0~22.05 kHz,满足人耳极限 |
| 高清音频 | 48 kHz / 96 kHz | 专业录音、影视制作常用 |
个人习惯:做语音识别时,我一般用 16 kHz 采样率。太低会丢失高频辅音信息(比如 /s/、/ʃ/ 的摩擦音),太高又浪费计算资源。做音乐或高保真语音合成时,才会用到 44.1 kHz 以上。
2.3 奈奎斯特定理:采样的黄金法则
采样率不是随便选的。有一个定理你必须刻在脑子里——奈奎斯特采样定理:
要无失真地从采样信号中恢复原始连续信号,采样率必须至少是信号最高频率的两倍。
用公式表达:fs ≥ 2 × fmax
这个 fs/2 就是奈奎斯特频率。如果信号中有超过奈奎斯特频率的成分,就会发生混叠(Aliasing)——高频成分会「伪装」成低频成分混进来,再也去不掉。
我曾经踩过的坑:有一次做语音端点检测,发现静音段总有莫名其妙的低频噪声。排查了半天,发现是 ADC 前端的抗混叠滤波器坏了,导致 20 kHz 以上的环境噪声混叠到了 4 kHz 以下。从那以后,我每次做采集系统,都会先检查抗混叠滤波器的截止频率。
为什么会混叠?你想想看,采样点太少,不足以描述高频振动的完整周期,采样点连起来就变成了一个更低频率的波形。这就是混叠的直观理解。
2.4 量化:把连续值变成有限个数字
采样把时间离散化了,但每个采样点的值还是连续的(理论上可以是任意实数)。量化就是把这些连续值映射到有限个离散的数值上。
量化最关键的参数是位深(Bit Depth):
- 8 bit:256 个量化等级,信噪比约 48 dB,电话语音常用
- 16 bit:65536 个量化等级,信噪比约 96 dB,CD 音质标准
- 24 bit:16777216 个量化等级,信噪比约 144 dB,专业录音常用
- 32 bit float:动态范围极大,常用于内部处理
量化会产生量化噪声。说白了,就是真实值和量化值之间的误差。这个误差可以近似看作均匀分布的白噪声,功率与量化步长 Δ 的平方成正比。
关键公式:量化信噪比(SQNR)≈ 6.02 × N + 1.76 dB,其中 N 是位深。每增加 1 bit,信噪比提升约 6 dB。
我建议你在实际项目中,至少用 16 bit 量化语音数据。8 bit 的量化噪声太大,做特征提取时底噪会明显抬高。24 bit 当然更好,但文件体积也更大,需要权衡。
2.5 时域与频域:看声音的两个视角
同一个声音信号,可以从两个完全不同的角度观察:
- 时域(Time Domain):横轴是时间,纵轴是振幅。波形图就是时域表示。直观,但信息密度低。
- 频域(Frequency Domain):横轴是频率,纵轴是幅度(或能量)。频谱图就是频域表示。能清晰看到信号由哪些频率成分组成。
时域和频域之间通过傅里叶变换连接。傅里叶变换的核心思想是:任何周期信号都可以分解成一系列不同频率、不同振幅、不同相位的正弦波之和。
说白了,时域告诉你「什么时间发生了什么」,频域告诉你「整体上由哪些频率构成」。做语音算法时,我们大部分时间都在频域里干活——因为语音的感知特征(音调、音色、共振峰)在频域里更明显。
下面这张图展示了从模拟声音到数字信号的核心流程,以及时域和频域的关系:
2.6 从时域到频域:傅里叶变换初探
傅里叶变换的公式长这样:
X(f) = ∫ x(t) · e^(-j2πft) dt
别被积分吓到。你只需要理解它的物理含义:傅里叶变换是在做「相关性检测」——它拿不同频率的正弦波去和原始信号做内积,如果某个频率成分在信号里存在,内积结果就大;不存在,结果就接近于零。
对于离散信号,我们用离散傅里叶变换(DFT):
X[k] = Σ x[n] · e^(-j2πkn/N), k = 0, 1, ..., N-1
其中 N 是 DFT 点数,k 对应数字频率。实际工程中,我们几乎都用快速傅里叶变换(FFT)来计算 DFT,复杂度从 O(N²) 降到 O(N log N)。
我建议:刚开始学的时候,先别纠结公式推导。你可以在 Python 里用 numpy.fft.fft() 试试,把一段语音的 FFT 结果画出来,看看频谱长什么样。亲手做一遍,比看十遍公式都管用。
2.7 本章小结
这一章我们覆盖了数字信号处理最核心的几个概念:
- 声音由频率、振幅、相位三个要素描述
- 采样把连续时间离散化,采样率必须满足奈奎斯特定理
- 量化把连续幅度离散化,位深决定动态范围和信噪比
- 时域和频域是观察信号的两种视角,通过傅里叶变换相互转换
这些概念会贯穿整个语音算法课程。后面的特征提取、语音增强、声学模型,全都建立在这个基础上。嗯,先把地基打牢,后面才能盖高楼。