回声消除(AEC)原理、算法及实战——NLMS(Normalized Least Mean Square)

由LMS的权重关系公式:W(n+1)=W(n)+μe(n)x(n)可知:

①LMS滤波器的权重更新公式步长μ是固定不变的;

②滤波器的变化与与输入信号的大小直接相关,输入较大时,会产生梯度噪声放大的问题,而输入较小时,算法的收敛速度比较慢。

在实际的应用中希望两次更新之间,滤波器的变化要尽可能小(最小扰动原理(the principle of minimal disturbance))

为了解决上述的问题,对输入的平方欧式范数进行归一化处理,就得到了归一化的LMS算法,即NLMS算法。因此根据LMS的权重更新公式,做出以下变化:

NLMS算法相对于LMS算法有着更快的收敛速度,同时NLMS算法仍保留了算法简洁、计算量小、易于实现的优点,自提出以来,NLMS算法已经成为AEC工程领域最常用的算法之一。

代码如下:

import numpy as np
import librosa
import soundfile as sf
import pyroomacoustics as pra

def nlms(x, d, N=4, mu=0.1):
  nIters = min(len(x),len(d)) - N
  u = np.zeros(N)
  w = np.zeros(N)
  e = np.zeros(nIters)
  for n in range(nIters):
    u[1:] = u[:-1]
    u[0] = x[n]
    e_n = d[n] - np.dot(u, w)
    w = w + mu * e_n * u / (np.dot(u,u)+1e-3)
    e[n] = e_n
  return e

# x 原始参考信号
# v 理想mic信号 
# 生成模拟的mic信号和参考信号
def creat_sim_sound(x,v):
    rt60_tgt = 0.08
    room_dim = [2, 2, 2]

    e_absorption, max_order = pra.inverse_sabine(rt60_tgt, room_dim)
    room = pra.ShoeBox(room_dim, fs=sr, materials=pra.Material(e_absorption), max_order=max_order)
    room.add_source([1.5, 1.5, 1.5])
    room.add_microphone([0.1, 0.5, 0.1])
    room.compute_rir()
    rir = room.rir[0][0]
    rir = rir[np.argmax(rir):]
    # x 经过房间反射得到 y
    y = np.convolve(x,rir)
    scale = np.sqrt(np.mean(x**2)) /  np.sqrt(np.mean(y**2))
    # y 为经过反射后到达麦克风的声音
    y = y*scale

    L = max(len(y),len(v))
    y = np.pad(y,[0,L-len(y)])
    v = np.pad(v,[L-len(v),0])
    x = np.pad(x,[0,L-len(x)])
    d = v + y
    return x,d

if __name__ == "__main__":
    x_org, sr  = librosa.load('female.wav',sr=8000)
    v_org, sr  = librosa.load('male.wav',sr=8000)

    x,d = creat_sim_sound(x_org,v_org)

    e =  nlms(x, d,N=256,L=4,mu=0.1)
    sf.write('x.wav', x, sr, subtype='PCM_16')
    sf.write('d.wav', d, sr, subtype='PCM_16')
    sf.write('nlms.wav', e, sr, subtype='PCM_16')

参考资料:

https://www.bilibili.com/video/BV1Lt4y1E7DJ/?spm_id_from=333.999.0.0&vd_source=77c874a500ef21df351103560dada737

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值