本文介绍了一种基于最小均方(LMS)算法的基本声学回声消除器。声学回声消除器对于许多现代通信产品是必需的。我确定你曾经遇到过在电话讲话时听到声音的时候,对吗?嗯,这是声学回声的一个例子。声学回声是一个常见的问题,这种问题是由于音频信号从附近物体反弹并且当麦克风只能拾取您的声音或者直接从扬声器麦克风对(如手机)耦合时耦合到麦克风中。没有取消这些影响,通信系统使用起来非常烦人!
这里,来自扬声器的语音信号在声学上耦合到扬声器电话或免提蜂窝电话的麦克风中,其在远程信号源处被听到作为返回回声。回声由回声源的回声消除器通过上图中建模的系统抑制。假设信道具有由Z变换表示的采样数据脉冲响应:
回声消除器是一个长度为50个样本的抽头延迟滤波器。首先,我们将所需信号s(t)设为零,并用白噪声训练消除滤波器。作为概要,图1中的信号是:
语音信号:s(t)
回声:R(T)
声道:h(t)
声道输出= r(t)* h(t)(卷积)
麦克风输入:s(t)+ r(t)* h(t),所需信号加声学通道回声
回声消除器:h ^(t)
所需信号:y(t)目标是使声学通道与我们的回声消除器匹配,以便我们可以反转声学通道响应并仅在麦克风输入(t)处创建所需信号。所以让我们看一下Matlab代码中的内容:
clear all;
clf;
close all;
%acoustic channel frequency response
num = [1 0 0 0.5 0 .1];
den = [1 0 0 0 0 0];
[Hc,Wc] = freqz(num,den);
%---BUILD FM SWEEP---%
fs = 2*pi;
tmax = 10000;
f1=0;
f2 = .5;
tsweep = 0:499;
slope = (f2-f1)/1000;
F = slope.*(mod(tsweep,500));
t = 0:1:tmax;
fm = cos(2*pi*slope*t);
F = slope.*(mod(tsweep,500));
fm2 = cos(2*pi*(F).*tsweep);
fm2c = repmat(fm2,20,1);
fm2 = reshape(fm2c',1,10000 );
figure
plot([0:999],fm2(2001:3000))
%subplot(212)
%plot([-512:511]*1/(2*pi), 20*log10(abs(fft(fm2(1:500), 1024))))
grid on
%End building of FM sweep
trainlen = tmax;
%training signal
r_t = 1*rand(1,tmax);
%desired signal
s_t = 0;
%signal through channel
rt_ht = filter(num,den,r_t);
%signal through channel + desired
mic_in = s_t + rt_ht;
%LMS algorithm of echo canceller
reg1=zeros(1,50);
wts = (zeros(1,50));
mu = .07;
for n = 1:trainlen
wts_sv = wts;
reg1 = [r_t(n) reg1(1:49)];
err = mic_in(n) - reg1*(wts');
y(n) = err;
wts = wts + mu*(reg1*(err'));
end
%plots
figure
subplot(211)
plot(1:length(y), (y))
hold on
plot(1:10000, zeros(1,10000), 'color', 'r', 'linewidth', 2, 'MarkerSize', 2)
hold off
axis([ -.5 10000 -1 1.1])
grid on
title('Steady State (time response) Desired Signal = 0, trained with white noise')
subplot(212)
plot(1:length(y), 20*log10(abs(y)))
grid on
title('Log Magnitude Training Curve, trained with white noise')
[Hf,Wf] = freqz(wts_sv);
figure
subplot(211)
plot(Wc/pi, 20*log10(abs(Hc)))
grid on
title('Frequency Response of Channel')
subplot(212)
plot(Wf/pi, 20*log10(abs(Hf)),'color','r')
title('Frequency Response of Adaptive Canceller, trained with white noise')
grid on
在代码中,我们首先将声学通道响应添加到Hc和Wc变量中。然后我们构建一个FM扫描训练信号,用于训练回声消除器的第二部分。然后我们定义信号r_t,s_t,Ort_ht和mic_in以反映图1.现在出现了自适应消除器的大部分:我们用简单的迭代最小均方法训练它。
err=mic_in(n)−reg1∗wts′
然后更新权重
wts=wts+μ∗(reg1∗err′)
权重更新的推导是一个冗长的解释,我将不会在本文中介绍,但将很快发布一个单独的解释。 但是,更新减少到当前权重加上寄存器内容的μ倍乘以误差的转置。 让这一直到收敛,我们看到我们的算法在训练白噪声时找到最终的权重集,以达到所需的0信号。
我们可以看到回声消除器响应几乎完全收敛于声道的频率响应。
本文关于在没有FM信号的情况下训练它的效果请打开下面链接进行查看:
https://www.eetoday.com/application/consume/201904/73000.html