matlab实现AR谱估计,AR模型功率谱估计源码程序

clear;

clc;

x = [101 82 66 35 31 7 20 92 154 125 85 68 38 23 10 24 83 132 131 118 90 67 60 47 41 21 16 6 4 7 14 34 45 43 48 42 28 10 8 2 0 1 5 12 14 35 46 41 30 24 16 7 4 2 8 17 36 50 62 67 71 48 28 8 13 57 122 138 103 86 63 37 24 11 15 40 62 98 124 96 66 64 54 39 21 7 4 23 55 94 96 77 59 44 47 30 16 7 37 74];

N=length(x);

%调用自相关函数求得x的自相关R

R=ZXG(x);

H=1024;%FFT点数

%han=zeros(1,1024);

%定义一个窗长为N的汉明窗

for i=1:N

han(i)=100*(0.54-0.46*cos(2*pi*i/N));

end

%用周期图法求数据的功率谱估计P

X=abs(fft(x,H));

for i=1:H

P(i)=X(i)*X(i)/N;

end

%改进之后的周期图法,u为汉明窗

for i=1:99

u(i)=R(i)*han(i);

end

UU=abs(fft(u,H));

%三阶AR模型参数得其功率谱

a_11=-R(2)/R(1);

D_1=(1-abs(a_11)*abs(a_11))*R(1);

a_22=-(R(3)+a_11*R(2))/D_1;

a_21=a_11+a_22*a_11;

D_2=(1-abs(a_22)*abs(a_22))*D_1;

a_33=-(R(4)+a_21*R(3)+a_22*R(2))/D_2;

a_32=a_22+a_33*a_21;

a_31=a_21+a_33*a_22;

D_3=(1-abs(a_33)*abs(a_33))*D_2;

A=[a_31 a_32 a_33];

D=abs(fft(A,H));

for i=1:H

PP(i)=D_3/((1+D(i))*(1+D(i)));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%  因为AR谱估计高阶算法与三阶算法类似,而这种  %%%

%%%  方法与线性预测谱估计等效,故可以直接直接调  %%%

%%%  用求线性预测的系统函数LPC(X,N)求取高阶AR   %%%

%%%  谱估计                                   %%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%取阶数为70

L=LPC(x,70);

LL=abs(fft(L,H));

for i=1:H

PPP(i)=D_3/((1+LL(i))*(1+LL(i)));

end

%axis([0 128 0 5]);

%Burg法求解AR模型的参数,得到的功率谱

J=30;

%调用Burg算法

[K,D]=burg_Kp(x,J);

%J表示所取阶数

A=zeros(1,J+1);

A(1)=1;

A(2:J+1)=K(J,:);

D2=D(J+1);

FA=abs(fft(A,H));

for i=1:H

PA(i)=D2/((1+FA(i))*(1+FA(i)));

end

%画周期图法谱估计

figure(1);

subplot(2,1,1);

plot(P);

axis([0 100 0 100000]);

title('周期图法谱估计(FFT点数:1024)');

xlabel('n');

ylabel('P(w)');

%axis([0 100 -15 15]);

grid on;

%画改进后的周期图法谱估计(加窗):

subplot(2,1,2);

plot(UU);

axis([0 100 0 1000000]);

title('改进后的周期图法谱估计(FFT点数:1024)');

xlabel('n');

ylabel('P(w)');

grid on;

%自回归AR模型谱估计(Levinson-Durbin)法

%画三阶AR模型谱估计

figure(2);

subplot(2,1,1);

plot(PP);

title('三阶AR模型谱估计Levinson-Durbin法');

xlabel('n');

ylabel('P(w)');

grid on;

%画高阶(70阶)AR模型谱估计

subplot(2,1,2);

plot(PPP);

axis([0 100 0 400]);

title('高阶(70阶)AR模型谱估计Levinson-Durbin法');

xlabel('n');

ylabel('P(w)');

grid on;

%画Burg法求解AR模型的参数,得到的功率谱曲线

%阶数选30

figure(3);

subplot(2,1,1);

plot(PA);

axis([0 128 0 800]);

title('30阶AR模型谱估计Burg法(FFT点数:1024)');

xlabel('n');

ylabel('P(w)');

grid on;

你可能感兴趣的:(matlab实现AR谱估计)