声波与数字信号基础

相消干涉

主动降噪(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°,或者幅度不匹配,降噪效果会大打折扣。

下面用动画演示相消干涉的原理——红色噪声波与蓝色反噪声波叠加后,结果归零:

ptotal = pn(t) + pc(t) = 0
mermaid
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 之前把这些高频成分滤掉。

mermaid
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):抗噪声扬声器到误差麦克风的传递函数。抗噪声发出后,经过扬声器的频率响应、腔体反射、耳机罩的衰减,最后才到达人耳位置
  • 参考路径:噪声源到参考麦克风的传递函数。参考麦克风负责拾取参考信号,提供给自适应滤波器
mermaid
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)$。