📄 runnlms.m
字号:
%System identification with adaptive filter using full and partial-update Normalised-Least-Mean-Squares
clear all
close all
mm = menu('Choose an input',...
'iid Gaussian',...
'AR(1) Gaussian a=-0.5',...
'AR(1) Gaussian a=-0.9');
L = 1500; %input data size
N = 5; %filter length
nvar = .001; %output noise variance
w0 = zeros(N,1); %initialization for adaptive filters
mu = 0.1; %step-size parameter
epsilon = 1e-5; %regularization parameter
gamma = 0.08; %error bound
MCruns = 100; %Monte Carlo simulation runs
h = [1, -0.7, 0.4, -0.3, 0.2]; %system to be identified
if mm == 1, %input is iid
a = 0;
elseif mm == 2, %input is AR(1)
a = -0.5;
elseif mm == 3, %input is AR(1)
a = -0.9;
end
mse_nlms = zeros(L,1); %MSE vectors for Monte Carlo simulations
mse_pernlms = zeros(L,1);
mse_seqnlms = zeros(L,1);
mse_Mmaxnlms = zeros(L,1);
mse_spunlms = zeros(L,1);
mse_smnlms = zeros(L,1);
for I = 1:MCruns
x = filter(1,[1,a],randn(L,1)); %Gaussian input
n = sqrt(nvar)*randn(L,1); %output noise
d = filter(h,1,x) + n; %desired response
%
%Full-update NLMS
%
eNLMS = full_nlms(x,d,N,w0,mu,epsilon);
mse_nlms = mse_nlms + eNLMS.^2;
%
%Periodic-partial-update NLMS
%
S = N; %period of updates
ePNLMS = per_nlms(x,d,N,S,w0,mu,epsilon);
mse_pernlms = mse_pernlms + ePNLMS.^2;
%
%Sequential-partial-update NLMS
%
M=1; %no of coefficients to be updated at each iteration
eSNLMS = seq_nlms(x,d,N,M,w0,mu,epsilon);
mse_seqnlms = mse_seqnlms + eSNLMS.^2;
%
%M-max NLMS
%
M=1; %no of coefficients to be updated at each iteration
eMmaxNLMS = Mmax_nlms(x,d,N,M,w0,mu,epsilon);
mse_Mmaxnlms = mse_Mmaxnlms + eMmaxNLMS.^2;
%
%Selective-partial-update NLMS (NB step-size used yields a larger
%steady-state MSE than M-max NLMS; thus it should be reduced to obtain
%a fair convergence comparison to M-max NLMS)
%
M=1; %no of coefficients to be updated at each iteration
espuNLMS = selparupd_nlms(x,d,N,M,w0,mu,epsilon);
mse_spunlms = mse_spunlms + espuNLMS.^2;
%
%Set-membership partial-update NLMS
%
M=2; %no of coefficients to be updated at each iteration
esmNLMS = setmemb_nlms(x,d,N,M,w0,epsilon,gamma);
mse_smnlms = mse_smnlms + esmNLMS.^2;
end
mse_nlms = mse_nlms/MCruns;
mse_pernlms = mse_pernlms/MCruns;
mse_seqnlms = mse_seqnlms/MCruns;
mse_Mmaxnlms = mse_Mmaxnlms/MCruns;
mse_spunlms = mse_spunlms/MCruns;
mse_smnlms = mse_smnlms/MCruns;
%MSE plot
figure
semilogy(1:L,mse_nlms,'k-',...
1:L,mse_pernlms,'b:',...
1:L,mse_seqnlms,'r-.',...
1:L,mse_Mmaxnlms,'g-',...
1:L,mse_spunlms,'c-.',...
1:L,mse_smnlms,'y--');
ylim([1e-4,10]);
xlabel('k'), ylabel('MSE')
legend('NLMS','Periodic-partial-update NLMS','Sequential-partial-update NLMS',...
'M-max NLMS','Sel-par-upd NLMS',...
'Set-mem par-upd NLMS (M=2)','Location','NorthEast');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -