请大神帮我看看我写的几行代码,MSD的变化太小,与文献对不上,明明很简单的,哎。。。
内容如下:
输入信号和噪声是方差分别为1和10^-3的零均值的高斯白噪声,时变稀疏系统有16个抽头,取第五个抽头值为1,其余为0,步长mu=0.05,迭代500次
画出MSD与迭代次数的学习曲线。
我写的程序:
%% 初始化
clc,clear all;
mu=0.05; % 步长
N=16; % 信道时域系数个数
input_signal_variance=1; % 输入信号方差
noise_variance=10^-3; % 噪声方差
inter=500; % 迭代次数分别为500
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%前500次迭代
w=zeros(N,1); % 初始时刻,稀疏信道脉冲响应
w_initial=w;
w_initial(5,1)=1; % 第5个抽头值为1
w_opt=w_initial; % 记录所要得到的稀疏系数向量w~(n),便于求MSD,MSE
%% 产生零均值,方差为1/10^-3的高斯噪声x(n)和v(n)
% 产生高斯分布的N*1的输入信号x(n)
b=randn(N,1);
b=b/std(b);
b=b-mean(b);
c=0;
d=sqrt(input_signal_variance);
x=c+d*b;
% 产生高斯分布的噪声v(n)
t=randn(inter_3,1);
t=t/std(t);
t=t-mean(t);
c=0;
f=sqrt(noise_variance);
v=c+f*t;
%% 未迭代
sum=0;
MSD=[];
inter=0;
for n=1:N %求MSD
error=(abs(w(n)-w_opt(n)))^2;
sum=sum+error;
end
MSD(inter+1)=sum;
%% 开始迭代--LMS
for inter=1:inter
y=w'*x+v(inter); % 输出信号y(n)
e=w_opt'*x-y; % 误差
w=w+mu*e*x; % 更新公式
sum=0;
for n=1:N %求MSD
error=(abs(w(n)-w_opt(n)))^2;
sum=sum+error;
end
MSD(inter+1)=sum;
end
inter=0:inter;
plot(inter,MSD);
axis([0 inter 0 1]);
grid on;
xlabel('interation');
ylabel('MSD');