#include <stdioh> //C语言头文件
int v,ar1,ar2,ar3; //定义全局整形变量的 v,ar1,ar2,ar3
int vol(int a,int b,int c) //定义整形函数需要传递3个参数,传入3个整形数据
{
v=abc;
ar1=ab;
ar2=bc;
ar3=ac;
return v; //函数执行完成返回V的值
}
void main( ) //主main函数
{
int v,l,w,h;
printf("input length,width and height\n");
scanf("%d%d%d",&l,&w,&h); //输入三个整形数据
v=vol(l,w,h); //将输入的三个数据分别传入进入vol函数中进行计算
printf("v=%d s1=%d s2=%d s3=%d\n",v,ar1,ar2,ar3);
}
用线性方程组的常用解法(例如高斯消元法)求解式(4-22),需要的运算量数量级为p3。但若利用系数矩阵的对称性和Toeplitz性质,则可得到一些高效算法,Levinson-Durbin算法就是其中最著名、应用最广泛的一种,其运算量数量级为p2。这是一种按阶次进行递推的算法,即首先以AR(0)和AR(1)模型参数作为初始条件,计算AR(2)模型参数;然后根据这些参数计算AR(3)模型参数,等等,一直到计算出AR(p)模型参数为止。这样,当整个迭代计算结束后,不仅求得了所需要的p阶AR模型的参数,而且还得到了所有各低阶模型的参数。
Levinson算法的关键是要推导出由AR(k)模型的参数计算AR(k+1)模型的参数的迭代计算公式。对式(4-22)分析可知,Yule-Walker方程的系数矩阵具有以下两个特点:
(1)从0阶开始逐渐增加阶次,可看出,某阶方程的系数矩阵包含了前面各阶系数矩阵(作为其子矩阵)。
(2)系数矩阵先进行列倒序再进行行倒序(或先行倒序再列倒序)后矩阵不变。
设已求得k阶Yule-Walker方程
地球物理信息处理基础
的参数{ak,1,ak,2,…,ak,k, },现求解k+1阶Yule-Walker方程
地球物理信息处理基础
为此,将k阶方程的系数矩阵增加一列和增加一行,成为下列形式的“扩大方程”
地球物理信息处理基础
扩大方程中的Dk由下式来确定
地球物理信息处理基础
利用前述系数矩阵的第二个特点,将扩大方程的行倒序,同时列也倒序,得“预备方程”
地球物理信息处理基础
将待求的k+1阶Yule-Walker方程的解表示成“扩大方程”解和“预备方程”解的线性组合形式
地球物理信息处理基础
或
ak+1,i=ak,i-γk+1ak,k+1-i,i=1,2,…,k
式中γk+1是待定系数,称为反射系数。用k+1阶系数矩阵
地球物理信息处理基础
去左乘上式各项,得到
地球物理信息处理基础
由该式可求出
地球物理信息处理基础
地球物理信息处理基础
由扩大方程的第一个方程可求出
地球物理信息处理基础
从上面的推导中可归纳出如下由k阶模型参数求k+1阶模型参数的计算公式:
地球物理信息处理基础
ak+1,i=ak,i-γk+1ak,k+1-i,i=1,2,…,k (4-24)
地球物理信息处理基础
对于AR(p)模型,递推计算直到k+1=p为止。将模型参数代入式(1-135),即可计算功率谱估计值:
地球物理信息处理基础
若在-π<ω≤π范围内的N个等间隔频率点上均匀采样,则上式可写成
地球物理信息处理基础
若N>p,则上式中在N-1>i>p时,应取ap,i=0。
如果自相关函数值不是已知的,而只知道N个观测数据xN(n),n=0,1,…,N-1,首先要用式(4-5)由xN(n)估计出自相关函数值,得 ,m=0,1,…,p。然后再用Levin-son算法根据 来计算AR(p)模型的参数。
为了书写简单,今后将k阶AR模型系数或k阶线性预测系数ak,i写成aki,而对于k+1阶来说,为了下标明确,仍写成ak+1,i。
/----------------------- threadc ----------------------------/
#include <processh>
#include <memoryh>
void func(int arg1,int ar2)
{
}
void ThrdProc(void arg)
{
int x,y;
memcpy(&x,(char)arg,sizeof(int));
memcpy(&y,(char)arg+sizeof(int),sizeof(int));
func(x,y);
}
void main()
{
int arg1 = 0;
int arg2 = 2;
char arg[8] = {0};
memcpy(arg, &arg1, sizeof(int));
memcpy(arg+sizeof(int), &arg2, sizeof(int));
_beginthread(ThrdProc,0,arg);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)