第一章:声音的本质
各位同学好,我是你们这门课的老朋友。做音频算法这行十几年了,每次带新人,我第一件事就是让他们重新理解声音。不是那种物理课本上的定义,而是从工程师的角度——说白了,声音就是我们要处理的信号。
这一章,我们先把地基打牢。你想想看,连声音是什么都没搞明白,后面怎么去设计动态处理器?
1.1 声波基础:声音是怎么来的
声音的本质是振动。一个物体在空气中来回运动,挤压周围的空气分子,形成疏密相间的波。这个波传到我们耳朵里,鼓膜跟着振动,大脑就解读成了声音。
我在项目里遇到过最典型的例子:有一次调试一个降噪算法,怎么都滤不掉某个低频噪声。后来发现是设备外壳的机械共振,根本不是声学问题。嗯,这里要注意——你处理的永远是振动信号,不管它来自麦克风还是合成器。
声波有几个基本参数:
- 波长:相邻两个波峰之间的距离
- 周期:完成一次完整振动的时间
- 声速:在空气中约340m/s(温度不同会有变化)
它们的关系很简单:声速 = 频率 × 波长。这个公式你后面会反复用到。
1.2 频率与振幅:声音的两个维度
频率决定了音高,振幅决定了响度。这是最基础的两个概念。
频率,单位是赫兹(Hz),表示每秒振动多少次。人耳能听到的范围大概是20Hz到20kHz。低于20Hz的叫次声波,高于20kHz的叫超声波。我刚开始做音频时,总觉得20kHz以上的东西跟我没关系,直到有一次做高频扩展算法——嗯,真香。
振幅,表示振动的幅度大小。振幅越大,声音越响。但要注意,人耳对响度的感知不是线性的。这就是为什么我们要用分贝(dB)这个单位。
关键点:频率和振幅是正交的两个维度。你可以改变频率不影响振幅,也可以改变振幅不影响频率。动态处理器主要动的是振幅,但频率决定了你该在哪个频段动手。
1.3 时域与频域:看声音的两种方式
同一个声音,你可以从两个角度去看它。
时域:横轴是时间,纵轴是振幅。示波器上看到的就是时域波形。我习惯用这个来观察瞬态——比如鼓的起振、人声的爆破音。
频域:横轴是频率,纵轴是能量。频谱分析仪上看到的就是频域。这个用来分析声音的成分——比如这个噪声是50Hz的工频干扰,还是3kHz的齿音。
时域和频域之间通过傅里叶变换来转换。你不需要把傅里叶变换的数学推导背下来,但一定要理解它的物理意义:任何一个时域信号,都可以分解成若干个不同频率、不同振幅的正弦波之和。
我的经验:做动态处理时,我通常先在时域看整体动态范围,再到频域看具体哪个频段需要压缩。两个视角来回切换,比只看一个维度要靠谱得多。
下面这张图展示了时域和频域的关系:
1.4 采样定理与量化:把模拟变成数字
计算机处理不了连续的模拟信号,必须把它变成离散的数字信号。这个过程分两步:采样和量化。
采样定理
奈奎斯特-香农采样定理告诉我们:采样频率必须大于信号最高频率的两倍,才能无失真地重建原始信号。
举个例子:人耳能听到20kHz,所以CD的采样率是44.1kHz。为什么是这个数?44.1kHz > 2 × 20kHz = 40kHz,留了点余量。
避坑指南:我曾经在一个项目里用了22kHz的采样率去录一段吉他,结果高频泛音全被折叠到低频区域,产生了混叠失真。听起来就像吉他里混进了金属摩擦声。从那以后,我每次选采样率都会先确认信号的最高频率成分。
采样定理的数学表达:
fs ≥ 2 × fmax
其中:
fs = 采样频率
fmax = 信号最高频率
如果采样率不够,会发生什么?高频成分会伪装成低频信号混进来,这就是混叠。解决方法是加抗混叠滤波器——在采样之前把高于fs/2的频率滤掉。
量化
采样是在时间轴上离散化,量化是在幅度轴上离散化。每个采样点的幅度值被近似到最近的量化等级上。
量化位数决定了动态范围。16位量化有65536个等级,动态范围约96dB。24位量化有16777216个等级,动态范围约144dB。
| 量化位数 | 量化等级数 | 理论动态范围 | 常见应用 |
|---|---|---|---|
| 8位 | 256 | 48 dB | 早期游戏、语音 |
| 16位 | 65,536 | 96 dB | CD、WAV |
| 24位 | 16,777,216 | 144 dB | 专业录音、混音 |
| 32位浮点 | 约4.3×10^9 | 理论无限 | DAW内部处理 |
量化会产生量化误差,听起来就是背景噪声。我习惯在项目初期就确定好量化策略——如果最终要输出16位,那中间处理最好用32位浮点,等最后再dither到16位。
核心总结:声音的本质是振动信号。我们用频率和振幅来描述它,用时域和频域来分析它,用采样和量化来数字化它。这四个知识点,是后面所有动态处理算法的基础。
个人习惯:每次开始一个新项目,我都会先检查采样率和量化位数。这两个参数一旦定错,后面所有处理都是白费功夫。你想想看,源头就丢了信息,后面再怎么补也补不回来。