4. 自适应噪声对消

任务目标

本案例实现单通道自适应噪声对消:已知参考噪声信号,通过自适应滤波器估计噪声在含噪信号中的实际传播路径,并从主输入中减去该估计值,从而恢复有用信号。核心目标是验证LMS自适应算法能够实时跟踪噪声路径变化并完成对消。

实现原理与信号模型

主输入信号由三部分构成:d(n) = s(n) + v(n),其中s(n)为有用信号,v(n)为噪声。参考输入x(n)为噪声源信号,它与v(n)之间存在一个未知的线性路径h(例如房间回声或传感器耦合),即v(n) = h * x(n)。自适应滤波器使用LMS算法,以误差e(n) = d(n) - y(n)作为输出,其中y(n)是滤波器对v(n)的估计。当算法收敛后,e(n) ≈ s(n),实现对消。

完整实现代码

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
Fs = 8000          # 采样率 8kHz
T = 1.0            # 信号时长 1秒
N = int(Fs * T)    # 总采样点数
t = np.arange(N) / Fs

# 1. 生成有用信号(语音模拟:400Hz + 800Hz 正弦叠加)
f1, f2 = 400, 800
s = 0.5 * np.sin(2 * np.pi * f1 * t) + 0.3 * np.sin(2 * np.pi * f2 * t)

# 2. 生成参考噪声(白噪声)
np.random.seed(42)
x = np.random.randn(N) * 0.8

# 3. 模拟噪声传播路径(未知系统 h:带通滤波)
b = [0.2, 0.5, 1.0, 0.5, 0.2]   # 简单FIR路径
h = np.array(b) / np.sum(np.abs(b))  # 归一化
v = np.convolve(x, h, mode='same')   # 实际噪声

# 4. 主输入信号
d = s + v

# 5. LMS自适应滤波器
M = 16          # 滤波器阶数
mu = 0.01       # 步长
w = np.zeros(M) # 滤波器系数
e = np.zeros(N) # 误差(对消后输出)
y = np.zeros(N) # 滤波器输出

for n in range(M, N):
    x_n = x[n-M:n][::-1]   # 当前输入向量(倒序)
    y[n] = np.dot(w, x_n)
    e[n] = d[n] - y[n]
    w = w + 2 * mu * e[n] * x_n   # LMS权重更新

# 6. 验证:计算对消前后的信噪比提升
SNR_before = 10 * np.log10(np.sum(s**2) / np.sum((d-s)**2))
SNR_after = 10 * np.log10(np.sum(s**2) / np.sum((e-s)**2))
print(f"对消前 SNR = {SNR_before:.2f} dB")
print(f"对消后 SNR = {SNR_after:.2f} dB")

# 7. 绘制时域波形对比
plt.figure(figsize=(10, 6))
plt.subplot(3, 1, 1)
plt.plot(t[:1000], d[:1000], 'b', label='主输入 d(n)')
plt.legend()
plt.subplot(3, 1, 2)
plt.plot(t[:1000], s[:1000], 'g', label='有用信号 s(n)')
plt.legend()
plt.subplot(3, 1, 3)
plt.plot(t[:1000], e[:1000], 'r', label='对消输出 e(n)')
plt.legend()
plt.tight_layout()
plt.show()

运行与验证方法

运行环境:Python 3.8+,需安装 numpy 和 matplotlib。

pip install numpy matplotlib
python noise_cancellation.py

验证步骤与通过标准:

  1. 运行脚本后,观察控制台输出的SNR数值:对消后SNR应明显高于对消前(通常提升10dB以上,具体取决于步长与阶数)。
  2. 查看生成的波形图:第三行红色波形(对消输出)应明显比第一行蓝色波形(主输入)更接近第二行绿色波形(有用信号),即噪声被有效抑制。
  3. 若SNR提升不明显,可尝试增大滤波器阶数M至32或减小步长mu至0.005,但需注意步长过小会导致收敛变慢。

关键参数说明

  • 滤波器阶数M=16:需大于等于噪声路径h的长度(本例为5),否则无法完全建模噪声路径。
  • 步长mu=0.01:需满足LMS收敛条件 0 < mu < 1/λ_max(λ_max为输入相关矩阵最大特征值),本例取值在收敛范围内。
  • 收敛时间:前M个采样点滤波器尚未收敛,输出e[0:M]包含较大误差,属于正常现象,评估SNR时建议从n=200后开始计算。