📄 runtdlms.m
字号:
%System identification with adaptive filter using full and partial-update Transform-Domain 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 = 2000; %input data size
N = 10; %filter length
M = 1; %number of coefficients to be updated
S = N; %update period for periodic partial updates
nvar = .0001; %output noise variance
w0 = zeros(N,1); %initialization for adaptive filters
mu = 2; %step-size parameter
lambda = 0.99; %exponential forgetting factor
epsilon = 50; %initialization for power estimate
MCruns = 50; %Monte Carlo simulation runs
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
h = [1, -0.8, 0.3, 0.2, 0.1, -0.2, 0.1, 0.4, -0.2, 0.1]; %system to be identified
mse_full = zeros(L,1); %MSE vectors for Monte Carlo simulations
mse_seq = zeros(L,1);
mse_per = zeros(L,1);
mse_Mmax = 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 TDLMS
%
e_full = full_tdlms(x,d,N,w0,mu,lambda,epsilon);
mse_full = mse_full + e_full.^2;
%
%Sequential-partial-update TDLMS
%
e_seq = seq_tdlms(x,d,N,M,w0,mu,lambda,epsilon);
mse_seq = mse_seq + e_seq.^2;
%
%Periodic-partial-update TDLMS
%
e_per = per_tdlms(x,d,N,S,w0,mu,lambda,epsilon);
mse_per = mse_per + e_per.^2;
%
%M-max TDLMS
%
e_Mmax = Mmax_tdlms(x,d,N,M,w0,mu,lambda,epsilon);
mse_Mmax = mse_Mmax + e_Mmax.^2;
end
mse_full = mse_full/MCruns;
mse_seq = mse_seq/MCruns;
mse_per = mse_per/MCruns;
mse_Mmax = mse_Mmax/MCruns;
%MSE plot
figure
semilogy(1:L,mse_full,'k-',...
1:L,mse_seq,'b:',...
1:L,mse_per,'g--',...
1:L,mse_Mmax,'r-.');
%ylim([1e-4,10]);
xlabel('k'), ylabel('MSE')
legend('TD-LMS','Sequential-partial-update TD-LMS',...
'Periodic-partial-update TD-LMS','M-max TD-LMS',...
'Location','NorthEast');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -