function [yn,W,en]=gjlms(xn,dn,M,itr)
% 参数个数必须为4个或5个
if nargin == 3
itr = length(xn);
elseif nargin == 4
if itr>length(xn) | itr<M
error('迭代次数过大或过小!');
end
else
error('请检查输入参数的个数!');
end
% 初始化参数
en = zeros(itr,1);
W = zeros(M,itr);
% 迭代计算
for k = M:itr
x = xn(k:-1:k-M+1);
y = W(:,k).' * x;
en(k) = dn(k) - y ;
if abs(en(k))>=0.04
mu=0.15;
% 滤波器权值计算的迭代式
W(:,k+1) = W(:,k) + 2*mu*en(k)*x;
else mu=0.05;
W(:,k+1) = W(:,k) + 2*mu*en(k)*x;
end
end
% 求最优时滤波器的输出序列
yn = inf * ones(size(xn));
for k = M:length(xn)
x = xn(k:-1:k-M+1);
yn(k) = W(:,end).'* x;
end