1. 基于LMS的自适应滤波器回声消除基础实现

基于LMS的自适应滤波器回声消除基础实现 学习卡片

任务目标

实现一个最小均方(LMS)自适应滤波器,模拟扬声器信号经房间回声路径后与近端语音叠加的场景,通过自适应滤波估计回声路径并完成回声消除,最终评估滤波器收敛性能。

环境依赖

仅需 Python 3.8+ 与 NumPy,无需其他第三方库。

核心实现

import numpy as np

def lms_echo_canceller(x, d, mu, filter_len):
    """
    x: 远端参考信号(扬声器输出)
    d: 期望信号(麦克风采集 = 回声 + 近端语音)
    mu: 步长因子
    filter_len: 自适应滤波器长度
    返回: 误差信号 e(即消除回声后的近端估计), 滤波器系数历史
    """
    n = len(x)
    w = np.zeros(filter_len)
    e = np.zeros(n)
    w_history = np.zeros((n, filter_len))

    for i in range(filter_len, n):
        x_block = x[i-filter_len:i][::-1]  # 当前输入向量
        y = np.dot(w, x_block)             # 滤波器输出(回声估计)
        e[i] = d[i] - y                    # 误差 = 期望 - 回声估计
        w += 2 * mu * e[i] * x_block       # LMS 权重更新
        w_history[i] = w
    return e, w_history

# 仿真参数
fs = 16000          # 采样率 16kHz
t = 2.0             # 时长 2 秒
n_samples = int(fs * t)
n = np.arange(n_samples)

# 1. 远端参考信号 x(扬声器播放内容,如远端语音)
rng = np.random.default_rng(42)
x = 0.5 * np.sin(2 * np.pi * 300 * n / fs) + 0.3 * rng.standard_normal(n_samples)

# 2. 真实回声路径(模拟房间冲激响应,此处用简单延迟+衰减)
true_path = np.zeros(32)
true_path[8] = 0.6    # 主回声延迟 8 个采样点
true_path[20] = 0.3   # 次回声延迟 20 个采样点
echo = np.convolve(x, true_path)[:n_samples]

# 3. 近端语音(仅在前 1 秒存在,用于验证双端检测前的单端场景)
near_end = np.zeros(n_samples)
near_end[:fs] = 0.2 * rng.standard_normal(fs)  # 模拟近端说话

# 4. 麦克风信号 d = 回声 + 近端语音
d = echo + near_end

# 5. 运行 LMS 回声消除
mu = 0.01
filter_len = 32
e, w_hist = lms_echo_canceller(x, d, mu, filter_len)

# 6. 收敛性能评估:计算稳态误差能量(取最后 0.5 秒,此时近端语音已结束)
steady_start = int(1.5 * fs)
steady_error_power = np.mean(e[steady_start:] ** 2)
echo_power = np.mean(echo[steady_start:] ** 2)
print(f"稳态回声能量: {echo_power:.6f}")
print(f"稳态误差能量: {steady_error_power:.6f}")
print(f"回声抑制比: {10 * np.log10(echo_power / steady_error_power):.2f} dB")

运行与验证

  1. 将代码保存为 lms_echo_canceller.py,在终端执行 python lms_echo_canceller.py。
  2. 观察输出:稳态回声能量约为 0.045(由路径系数平方和决定),稳态误差能量应显著低于回声能量。
  3. 判定通过条件:回声抑制比大于 15 dB,且误差信号在近端语音结束后(1.5s 后)趋近于 0 附近的小幅波动。

关键说明

  • 滤波器长度 32 与真实回声路径长度一致,保证有足够自由度拟合路径。
  • 步长 mu=0.01 在收敛速度与稳态失调间平衡;若 mu 过大(如 0.1)会导致发散,过小(如 0.001)则收敛缓慢。
  • 前 1 秒存在近端语音时,LMS 会将其视为干扰,误差中会包含近端成分,这是单滤波器结构的固有限制;本案例聚焦单端场景下的回声路径收敛验证。
LMS 回声消除信号流 远端 x(n) 真实回声路径 h 回声 y₀(n) LMS 滤波器 ŵ 回声估计 ŷ(n) + 近端 s(n) e(n) 输出 误差反馈更新权重

上图展示了信号流向:远端信号 x(n) 经真实路径产生回声,与近端语音叠加形成麦克风信号 d(n);LMS 滤波器以 x(n) 为参考,自适应估计回声路径,输出回声估计 ŷ(n),与 d(n) 相减得到误差 e(n),该误差同时用于反馈更新滤波器权重,直至收敛。