基于wRLS滤波器和神经网络回声残留抑制的AEC模型——线性滤波wRLS的实现细节
【代码】基于wRLS滤波器和神经网络回声残留抑制的AEC模型——线性滤波wRLS的实现细节。
·
参考文献:WEIGHTED RECURSIVE LEAST SQUARE FILTER AND NEURAL NETWORKBASED RESIDUAL ECHO SUPPRESSION FOR THE AEC-CHALLENGE



def w_RLS(S_near,S_far,N_fft,N_win,N_inc,L=5,B=0.2,eps=0.01):
# 进行 w-RLS
F,T = S_near.shape # (161,1000)
X = mat(S_far).T # (T,F)
D = mat(S_near).T # (T,F)
gamma = mat(np.zeros([T,F])) # (1000,161)
W = mat(np.zeros([L,F],dtype=complex)) # (5,161)
E = mat(np.zeros([T,F]),dtype=complex)
Y = mat(np.zeros([T,F]),dtype=complex)
R_LF = [mat(np.eye(L)*eps,dtype=complex) for i in range(F)] # 每一个频点f的自相关维度为L*L,共有F个频点的自相关,共有161个矩阵,每个矩阵大小为5*5
r_LF = [mat(np.zeros([L,1]),dtype=complex) for i in range(F)] # 每一个频点f的互相关维度为L*1,共有F个频点的互相关,共有161个矩阵,每个矩阵大小为5*1
for t in range(T): # 当前时刻t
buff_index = [max(t-j,0) for j in range(L)] # {list:5}[0,0,0,0,0]
X_L = X[buff_index,:] # 从X当中选取L帧 (5, 161)
for f in range(F): # 第f个频点
W_Lf = W[:,f] # (5,1)
Y_tf = mat.conj(W_Lf).T*X_L[:,f] # (1,5)*(5,1)=(1,1)
Y[t,f] = Y_tf[0,0]
E[t,f] = D[t,f]-Y[t,f]
gamma[t,f] = np.abs(E[t,f])**(2-B)
R_new = gamma[t,f]*X_L[:,f]*(mat.conj(X_L[:,f]).T) # gamma*(5,1)*(1,5)=(5*5)
R_LF[f] = R_LF[f]+ R_new # (5,5)+(5,5)
r_new = gamma[t,f]*X_L[:,f]*mat.conj(mat(D[t,f])) # gamma*(5,1)*(1,1)=(5*1)
r_LF[f] =r_LF[f]+ r_new
W_Lf = R_LF[f].I*r_LF[f] # (5,5)*(5,1)=(5,1)
W[:,f]= W_Lf
E = np.array(E.T) # (F,T)
e = librosa.istft(E,n_fft=N_fft,hop_length=N_inc,win_length=N_win)
Y = np.array(Y.T)
y = librosa.istft(Y,n_fft=N_fft,hop_length=N_inc,win_length=N_win)
mic = librosa.istft(S_near,n_fft=N_fft,hop_length=N_inc,win_length=N_win)
return e,y,mic

更多推荐
所有评论(0)