此图是LMS用于消除噪声或干扰的实现。
注意:虽然r(n)不等于v(n),但它们是相关的,如果语音信号x(n)与加性噪声v(n)不想关,那么当y(n)=v(n)时,e(n)^2的均值将可能达到最小值,传送到接收机的信号就只是语音信号e(n)=x(n),这意味着进入主拾音器的环境噪声已经被完全消除。
具体代码验证如下(代码由习题代码改编,S(n)假设为语音输入):
close all clear clc
%construct input and desired output
rng('shuffle','twister'); r=200; L=1; n=[0:r-1]';
%% 原始实验
% v = -0.5+rand(r,1); x = 2*cos(0.5*pi*n)+v; d = sin(0.5*pi*n);
%可以通过有限长序列搭建模型,来预测未来,例如飞行轨迹预测等
%%
%% 【改变】这个实验结果很好的反应了P29的消除噪声和干扰
v = -1+2*rand(r,1); x = v; s=sin(0.5*pi*n);d = sin(0.5*pi*n)+v;
%%
%compute maximum step size
Px = 2+0.5^2/3; mu_max=1/((L+1)*Px);%最大自适应步长
%compute error and find optimal weight vector for different step sizes
mu = [.1 .01]; theta=zeros(L+1,1); e = zeros(size(x)); q = x(:);
for i=1:2
w=zeros(L+1,1);
for k = 1:r
if k<(L+1)
theta(1:k)=q(k:-1:1);
else
theta=q(k:-1:k-L);
end
e(k) = d(k)-w'*theta;
w = w+2*mu(i)*e(k)*theta; %结论,存在这样一个滤波器,使得输出逼近真实输出
end
subplot(2,1,i);
stem(n,e.^2,'fill','MarkerSize',1)
end
%% 原始实验
% real = filter(w,1,x);
% figure
% plot(real,'b')
% hold on
% plot(d,'r')
%%
figure
plot(e)
hold on
plot(s)
figure
n=1:1:1024;
plot(abs(fft(s,1024)),'b');
hold on
plot(abs(fft(e,1024)),'r');
实验结果如下:
也可将e(n) 和d(n)进行观察比较。