参考文献:WEIGHTED RECURSIVE LEAST SQUARE FILTER AND NEURAL NETWORKBASED RESIDUAL ECHO SUPPRESSION FOR THE AEC-CHALLENGE
代码如下:
# 将认为有延时的信号放第一个参数,即近端麦克风信号
# 将认为没有延时的参考信号放第二个参数,即远端参考信号
def Time_delay_Estimate(S_near,S_far,alpha=0.1):
D,T = S_near.shape
Phi = np.zeros((D))
taus = []
for i in range(T):
Phi = alpha*Phi + (1-alpha)*(S_near[:,i]*np.conjugate(S_far[:,i]))
tau = np.argmax(np.abs(np.fft.irfft(Phi/np.abs(Phi))))
taus.append((tau))
return taus
# 在频域上进行的延迟
def TDE_X(X,taus,inc_TDE,inc_frame): # inc_TDE=250ms;inc_frame=10ms,即对x'(t)进行linear filter时需要进行stft的帧移长度
D,T = X.shape
N_spread = int(inc_TDE/inc_frame) # taus需要复制的次数
taus = np.expand_dims(np.array(taus),-1)
taus_frame = taus/inc_frame # 把样本点的taus换算成帧数
taus = np.tile(taus_frame,[1,N_spread]).reshape([-1]) # 进行扩展
print(taus)
X_TDE = np.zeros_like(X,dtype=complex)
for i in range(T): # 对x的每一帧进行延时
# index = max(i-int(taus[i]),0)
index = i-int(taus[i])
if i-int(taus[i])<0:
continue
else:
X_TDE[:,i]=X[:,index] # x的第i帧 等于 x的第i帧延迟taus,即x(i-taus)
return X_TDE