参考文献:WEIGHTED RECURSIVE LEAST SQUARE FILTER AND NEURAL NETWORKBASED RESIDUAL ECHO SUPPRESSION FOR THE AEC-CHALLENGE

参考视频:https://www.bilibili.com/video/BV1Lt421c7XC/?spm_id_from=333.788&vd_source=77c874a500ef21df351103560dada737

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐