📄 dspautoadaptfilterandar.m
字号:
L = input('输入信号Wn的样本个数=');
h1 = input('输入滤波器权系数h1=');
Sigmaw = input('输入信号Wn的方差=');
h0 = input('输入h(n)的初始值h(0)=');
u = input('输入自适应步长u值=');
Xn = normrnd(0,1,L); %产生方差为1的信号Xn。
Wn = normrnd(0,sqrt(Sigmaw),L);%产生方差为Sigmaw的信号Wn
Yn = zeros(1,L);
Sn = zeros(1,L);
Sn = h1*Xn; %由式2-12产生信号Sn
Yn = Sn+Wn; %由式2-11产生信号Yn
n= 1:L; %画出Sn,Yn
plot(n,Sn(n),n,Yn(n),':');
title('L个信号Sn与Yn');
legend('S(n)','Y(n)',0);
h_e=zeros(1,L);
h_e(1)=h0;
Sn_e=zeros(1,L);
for n = 1:L, %由式2-13和2-14得到h_e(n)和Sn_e(n)
Sn_e(n) = h_e(n)*Xn(n);
if n<= L-1,
h_e(n+1) = h_e(n)+2*u*(Yn(n)-h_e(n)*Xn(n))*Xn(n);
end
end
h = zeros(1,L); %计算自适应滤波器滤波系数的平均值
R = 0;
for n = 1:L,
R = Xn(n)*Xn(n)+R; %由于滤波器只有一个系数
end
R = R/L;
for n = 1:L, %由式2-15得到理论的h(n)值
h(n)=h1+(1-2*u*R)^n*(h0-h1);
end
n = 1:L;
figure;
plot(n,h_e(n),':',n,h(n));
title('理论h(n)和估计的h_e(n)比较');
legend('h_e(n)','h(n)',0);
figure;
plot(n,Sn_e(n),':',n,Sn(n));
title('理论Sn(n)和估计的Sn_e(n)');
legend('Sn_e(n)','Sn(n)',0);
er_Sn = 0;
for n = 1:L,
er_Sn = (Sn(n) - Sn_e(n))^2 + er_Sn; %计算估计误差
end
er_Sn = er_Sn / L;
%使用实验一所说的维纳滤波器
Rxx = R; %Rxx就是前面的R
rxs = 0; %rxs
for n = 1:L,
rxs = rxs + Yn(n)*Xn(n);
end
rxs = rxs/L;
h_wina = Rxx^(-1)*rxs; %求出h_wina
Sn_wina = zeros(1,L);
for n = 1:L,
Sn_wina(n) = h_wina * Xn(n); %得到滤波结果
end
figure;
n = 1:L;
plot(n,Sn_e(n),':',n,Sn(n),n,Sn_wina(n),'-.');
title('理论Sn(n),估计的Sn_e(n),维纳FIR滤波结果Sn_wina(n)');
legend('Sn_e(n)','Sn(n)','Sn_wina(n)',0);
er_wina=0;
for n = 1:L, %得到维纳的估计误差
er_wina = er_wina + (Sn(n) - Sn_wina(n))^2;
end
er_wina = er_wina /L;
sprintf('本次失调量M为%f',u*trace(Rxx)),
er_Sn,
er_wina,
h_e(L),
h_wina
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -