声波与数字信号基础
相消干涉
主动降噪(ANC)的物理基础是声波的相消干涉。两个频率相同、相位相反的声波叠加后会相互抵消。
原始噪声信号:
$$ p_n(t) = A \cos(2\pi ft + \phi) $$
ANC 系统生成的反向声波:
$$ p_c(t) = -A \cos(2\pi ft + \phi) = A \cos(2\pi ft + \phi + \pi) $$
两者叠加:
$$ p_{\text{total}} = p_n(t) + p_c(t) = 0 $$
这是理想情况。实际 ANC 耳机里,抗噪声从扬声器发出到人耳要经过一段声学路径,电路本身也有延迟。如果相位差不是精确的 180°,或者幅度不匹配,降噪效果会大打折扣。
下面用动画演示相消干涉的原理——红色噪声波与蓝色反噪声波叠加后,结果归零:
flowchart TD
subgraph 噪声源
A["p_n(t) = A·cos(2πft+φ)"]
end
subgraph ANC系统
B["参考麦克风<br/>采集噪声"]
C["自适应滤波器<br/>生成反相信号"]
D["扬声器<br/>输出抗噪声"]
end
subgraph 人耳
E["p_c(t) = -A·cos(2πft+φ)<br/>叠加后→静区"]
end
A --> B --> C --> D --> E
E -.->|"残余噪声"| F["误差麦克风<br/>反馈修正"]
F --> C
classDef noise fill:#f44336,color:#fff
classDef anc fill:#2196F3,color:#fff
classDef ear fill:#2196F3,color:#fff
class A noise
class B,C,D,F anc
class E ear拆解一下声波公式的每个参数。
- $A$:振幅,决定声音大小。声压级的计算公式是 $SPL = 20 \log_{10}(p/p_0)$,振幅翻倍对应 +6dB
- $f$:频率,单位 Hz。人耳能听到的范围是 20Hz-20kHz。ANC 系统主要对付低频噪声(20Hz-1kHz),因为高频噪声的波长太短,耳机系统来不及响应
- $\phi$:初相位。ANC 的核心就是让 $\phi_c = \phi_n + \pi$,也就是反相
举一个具体数字的例子。100Hz 的噪声,周期 T = 1/f = 10 ms,半周期是 5 ms。从参考麦克风采集噪声 → DSP 算完 → 扬声器发出抗噪声,整个过程必须在 5 ms 以内完成,否则相位误差会导致降噪失效。这就是 ANC 对延迟极其敏感的原因。
ANC 在消费级产品里能降 20-30dB,主要集中在中低频段。这不是算法不行,而是物理限制。
频率越高,波长越短。1kHz 的声波波长约 34cm,10kHz 就只有 3.4cm。ANC 要求抗噪声在误差麦克风位置和噪声精确反相——波长越短,位置偏差对相位的影响越大。耳机里的人耳位置误差就有几毫米,对 3.4cm 波长的 10kHz 信号来说,几毫米的偏差可能让相位差偏离 180° 几十度。
大波浪好消,小涟漪难平。ANC 耳机对付低频得心应手,高频主要靠物理隔音(被动降噪)。实际 ANC 系统的降噪量:消费级入耳式约 20-30dB,高端头戴式约 30-40dB,主要集中在 1kHz 以下。1978 年 Bose 演示原型机时只做到 10-15dB,现在算法和硬件的进步把这个数字翻了两三倍。
采样与量化
ANC 本质上就是在干实时数字信号处理这回事。麦克风拾取声压信号,ADC 把它变成一串数字,DSP 芯片算完了再通过 DAC 还原成声波。
两个参数决定这串数字的质量:
- 采样率(sample rate):每秒采多少个点。ANC 系统典型的采样率是 16kHz 或 48kHz
- 位深(bit depth):每个采样点用多少 bit 表示,决定了动态范围
采样率选了 48kHz,那奈奎斯特频率就是 24kHz。人耳能听到的上限大约是 20kHz,所以 48kHz 采样率对听觉范围内的信号是够的。问题在于高于 24kHz 的成分(有些噪声源确实会产生超声分量)会在采样后混叠到可听频带内。抗混叠滤波器(anti-aliasing filter)必须在 ADC 之前把这些高频成分滤掉。
flowchart TD
A["模拟声压<br/>连续信号"] -->|"抗混叠滤波"| B["低通滤波器<br/>截止频率 fs/2"]
B -->|"采样"| C["离散采样<br/>每秒 fs 个点"]
C -->|"量化"| D["数字序列<br/>16bit/24bit"]
D --> E["DSP 处理"]
classDef analog fill:#f44336,color:#fff
classDef digital fill:#2196F3,color:#fff
class A,B analog
class C,D,E digital采样定理 $f_s > 2f_{\max}$ 的直观理解方式:车轮倒转。车轮逆时针转动,用相机拍快照。快门频率低于车轮转速两倍时,拍出来的轮辐看起来在倒转。这就是混叠(aliasing)——采样率不够,高频信息伪装成了低频信号。
声学里一样。ADC 之前没有低通滤波器(抗混叠滤波器),高于 $f_s/2$ 的成分会"折叠"到可听频带内,变成一种无法滤除的失真。ANC 抗混叠滤波器的截止频率通常设在 $f_s/2$ 稍低一点,留出过渡带余量。
离散时间卷积
数字滤波器对输入信号的处理,本质上是卷积运算。对于长度为 N 的 FIR 滤波器,输出是输入与系数的加权和:
$$ y[n] = \sum_{k=0}^{N-1} w_k \cdot x[n-k] $$
每个输出样本需要 N 次乘加运算。ANC 用的滤波器长度通常从几十到几百不等,乘加运算量直接决定了 DSP 芯片的选型。
拆开看这个式子的物理含义。
$y[n]$ 是当前时刻的输出,$w_k$ 是第 k 个滤波器系数(也叫抽头系数),$x[n-k]$ 是当前时刻之前第 k 个输入样本。整个式子就是在算当前和过去 N-1 个样本的加权和。
举个具体例子。一个 N=4 的 FIR 滤波器,算 $y[3]$ 展开成四项: $$ y[3] = w_0 \cdot x[3] + w_1 \cdot x[2] + w_2 \cdot x[1] + w_3 \cdot x[0] $$ $x[3]$ 是当前样本,$x[2], x[1], x[0]$ 是过去三个样本。系数 $w_k$ 决定每个过去的样本对当前输出的贡献权重。
这就是滑动窗口——滤波器长度 N 就是窗口宽度,输入信号进来窗口就往前移一格,来一个新样本就重新算一遍加权和。N 越大频率分辨率越高,但延迟也越大。
FFT 与频域处理
时域卷积算起来慢,N 越长越慢。频域做法是把信号块做 FFT,在频域做乘法,再 IFFT 回去,等效于时域卷积。对于长滤波器,频域方法的计算量远小于时域直接卷积。
ANC 中的频域算法(如 FXLMS 的频域变体)通过重叠保留法(overlap-save)实现分块处理,在延迟和计算量之间做取舍。
三条声学路径
ANC 系统里有三条声学路径需要搞清楚:
- 主路径 P(z):噪声源到误差麦克风的传递函数。这是 ANC 想要消除的原始噪声经过的路径
- 次级路径 S(z):抗噪声扬声器到误差麦克风的传递函数。抗噪声发出后,经过扬声器的频率响应、腔体反射、耳机罩的衰减,最后才到达人耳位置
- 参考路径:噪声源到参考麦克风的传递函数。参考麦克风负责拾取参考信号,提供给自适应滤波器
flowchart TD
SRC["噪声源"] -->|"主路径 P(z)"| EAR["人耳/误差麦克风"]
SRC -->|"参考路径"| REF["参考麦克风"]
REF --> DSP["自适应滤波器 W(z)"]
DSP -->|"次级路径 S(z)"| EAR
classDef path fill:#FF9800,color:#fff
classDef device fill:#9C27B0,color:#fff
class SRC,EAR path
class REF,DSP device次级路径的存在是个麻烦。自适应滤波器输出先过了 S(z) 再和噪声叠加,误差信号里包含了这个路径的影响。如果不管它,算法会发散。
次级路径的物理含义:抗噪声信号从扬声器振膜出发,经过扬声器的频率响应(低频可能衰减,高频可能有谐振峰),穿过耳机前腔的空气,透过耳罩或耳塞(一部分被吸收),在耳道内反射几次,最终到达耳膜位置。这个过程中幅度和相位都被改变了。
所以不能简单理解成"扬声器发一个反相信号就完事"——扬声器本身就是一个带通滤波器,低频信号推不动振膜,高频信号可能指向性太强。次级路径辨识就是为了把这段路径的传递函数测出来,方便算法补偿这些畸变。
次级路径辨识
标准做法是离线辨识次级路径。播放一段白噪声或扫频信号,用误差麦克风采集响应,估算出 $\hat{S}(z)$。
辨识出的 $\hat{S}(z)$ 用于 FXLMS(Filtered-X LMS)算法——参考信号先经过 $\hat{S}(z)$ 滤波,再送入 LMS 更新滤波器系数。这样一来,梯度计算就修正了次级路径带来的相位和幅度失真。
离线辨识做一次就行,前提是声学环境在使用过程中变化不大。入耳式耳机变化小,头戴式耳机戴得松紧不同会有差异,头跟踪的 ANC 系统甚至需要在线更新 $\hat{S}(z)$。