for i=1:N
y(i)=w1*x1(i)+w2*x2(i);
e(i)=x(i)-y(i);%误差信号
w1=w1+u*e(i)*x1(i);%迭代方程
w2=w2+u*e(i)*x2(i);%迭代方程
end
你的算法,对e并没有做任何判断,如e到多小,然后结束循环.只是在你规定的范围内完成计算,因为是自适应的,要有个过程,你的程序还没有到解决问题的时候,所以会出现不收敛问题,另:自适应噪声抵消,参考信号和源信号中的噪声要有较强相关性才可能去噪,具体相关性达到多少才是最佳的,这个我也不清楚.可以给你以后程序参考:
% filter parameters
M=20; % number of taps
mu=0.05; % step-size parameter
e_max=500; % maximum #of epochs
% constants
pi=3.14;
Fs=0.02; % signal frequency
Fn=0.05; % noise frequency
% initialize
w=(randn(1,M)-randn(1,M))/100;
d=zeros(1,M);
u=zeros(1,M);
u_out=zeros(1,e_max-M);
f_out=zeros(1,e_max-M);
% Generate desires signal and input(signal+noise)
for t=1:M-1
d(t)=sin(2*pi*Fs*t);
u(t)=d(t)+0.5*sin(2*pi*Fn*t)+randn;
end
t=M;
epoch=0;
while epoch<e_max
% generate new input
input=sin(2*pi*Fs*t);
% shift new input into array
for i=2:M
d(M-i+2)=d(M-i+1);
u(M-i+2)=u(M-i+1);
end
d(1)=input;
% add undesired freq & random noise
u(1)=input+0.5*sin(2*pi*Fn*t)+0.09*randn;
u_out(t-M+1)=u(1);
% compute filteroutput
output=dot(w,u);
f_out(t-M+1)=output;
% LMS algorithm
% compute error
e=d(1)-output;
% update weights
for n=1:M
w(n)=w(n)+mu*u(n)*e;
end
%
in(t-M+1)=u(1);
out(t-M+1)=output;
err(t-M+1)=e;
t=t+1;
epoch=epoch+1;
end % plot noise and filtered signal
figure(1)
subplot(211);
plot(t,u(1));axis([0 e_max -2.5 2.5]);
title('滤波器输入')';
hold on;
subplot(212);
plot(t,d(1));axis([0 e_max -2.5 2.5]);
title('滤波器输出')';
hold on;
figure(2)
subplot(211);
plot(t,output);axis([0 e_max -2.5 2.5]);
title('滤波输出信号')';
hold on;
subplot(212);
plot(t,e);axis([0 e_max -2.5 2.5]);
title('误差信号')';
hold on; |