1. 基于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")
运行与验证
- 将代码保存为
lms_echo_canceller.py,在终端执行python lms_echo_canceller.py。 - 观察输出:稳态回声能量约为
0.045(由路径系数平方和决定),稳态误差能量应显著低于回声能量。 - 判定通过条件:回声抑制比大于 15 dB,且误差信号在近端语音结束后(1.5s 后)趋近于 0 附近的小幅波动。
关键说明
- 滤波器长度 32 与真实回声路径长度一致,保证有足够自由度拟合路径。
- 步长
mu=0.01在收敛速度与稳态失调间平衡;若 mu 过大(如 0.1)会导致发散,过小(如 0.001)则收敛缓慢。 - 前 1 秒存在近端语音时,LMS 会将其视为干扰,误差中会包含近端成分,这是单滤波器结构的固有限制;本案例聚焦单端场景下的回声路径收敛验证。
上图展示了信号流向:远端信号 x(n) 经真实路径产生回声,与近端语音叠加形成麦克风信号 d(n);LMS 滤波器以 x(n) 为参考,自适应估计回声路径,输出回声估计 ŷ(n),与 d(n) 相减得到误差 e(n),该误差同时用于反馈更新滤波器权重,直至收敛。