⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dspautoadaptfilterandar.m

📁 该例子主要解释了自适应滤波器的应用
💻 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 + -