自存,不调用pyulear的L-D算法实现
close all;
clear all;
clc;
%用给定的AR模型构建一定长度的信号
N=5000;
w=randn(1,N); %构造白噪声
x(1)=0;
x(2)=0;
for n=3:N
x(n)=w(n)+0.978*x(n-1)-0.222*x(n-2); %用给定AR模型构造信号
end
figure();
subplot(211);
plot(w);
title('w(n)');
subplot(212);
plot(x);
title('x(n)');
Rx=xcorr(x)/N; %自相关
R=Rx(N:2*N-1); %移位
figure();
subplot(211);
plot(Rx);
title('自相关');
subplot(212);
plot(R);
title('移位后的自相关');
%用LD算法求AR模型参数
k=0;
e=R(1);
d=R(2);
a1=-d/e; %aj
p=50; %给定阶次
while abs(d)>0.001 %d大于一定值就结束
if k>=p %k达到给定阶次时结束
break;
else
k=k+1;
rou=-d/e;
a(k)=rou; %ak
for j=1:k-1
a(j)=a1(j)+rou*a1(k-j);
end
d=R(k+2)+sum(a.*R(k+2-1:-1:k+2-k));
e=e*(1-rou^2);
a1=a; %aj更新
end
end
A=[a(1),a(2)]; %LD算法所得模型参数
%确定信号激励白噪声功率
freqz(1,A);
title('信号激励白噪声估计')
%用MATLAB自带pyulear函数检验
hold on;
subplot(212); %将估计结果与自带函数检验结果画到一张图上
pyulear(x,k);