#include<iostream.h>
const float PI=3.14159;
const int order=8;//阶数
const int N=256;//选取的点数
//注意数组越界问题
float autoC(float data[],int j)//自相关函数(0<=j<=p)
{
int n=j;
float Rij;
while (n<N)
{
Rij+=data[n]*data[n-j];
n++;
}
return Rij;
}
//E是E[i-1],signal为输入信号
float getK(int i,float E,float a[][order+1],float signal[])
//order-1为j最大值,是建立的数组列数最大值。a,E,k数组的第一元素不用
{
float ki,ar=0;
for (int j=1;j<i;j++)
ar+=a[i-1][j]*autoC(signal,(i-j));
ki=(autoC(signal,i)-ar)/E;
return ki;
}
int main(void)
{
float signal[N];//输入已测信号
for (int i=0;i<N;i++)
signal[i]=10*sin(PI*4/N*i);
float E[order+1],k[order+1];
float a[order+1][order+1];
for (int i=0;i<order+1;i++)
{
E[i]=0;
k[i]=0;
for (int j=0;j<order+1;j++) a[i][j]=0;
}
E[0]=autoC(signal,0);
k[1]=autoC(signal,1)/autoC(signal,0);
a[1][1]=k[1];
int i=1;
while (i<order)//order为阶数。
{
E[i]=(1-k[i]*k[i])*E[i-1];
i++;
cout<<i<<endl;//!!!!!!!!!!没有这一行输出结果会NaN ,为什么????????
k[i]=getK(i,E[i-1],a,signal);
a[i][i]=k[i];
for (int j=1;j<i;j++)//i阶的i-1个预测系数
{
a[i][j]=a[i-1][j]-k[i]*a[i-1][i-j];
}
}
cout<<endl<<endl;
for(int i=1;i<order+1;i++)
cout<<a[order][i]<<endl;
}
cout<<i<<endl;//!!!!!!!!!!没有这一行输出结果会NaN ,为什么????????
如果把这一行注释掉,输出就是NaN
没把它注释掉的话,结果正常。