00001
00002
00003 #include <math.h>
00004 #include <stdio.h>
00005
00006 static float sqrarg;
00007 #define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
00008
00009 void memcof(data,n,m,pm,cof)
00010 float data[],*pm,cof[];
00011 int n,m;
00012 {
00013 int k,j,i;
00014 float p=0.0,*wk1,*wk2,*wkm,*vector();
00015 void free_vector();
00016
00017 wk1=vector(1,n);
00018 wk2=vector(1,n);
00019 wkm=vector(1,m);
00020 for (j=1;j<=n;j++) p += SQR(data[j]);
00021 *pm=p/n;
00022 wk1[1]=data[1];
00023 wk2[n-1]=data[n];
00024 for (j=2;j<=n-1;j++) {
00025 wk1[j]=data[j];
00026 wk2[j-1]=data[j];
00027 }
00028 for (k=1;k<=m;k++) {
00029 float num=0.0,denom=0.0;
00030 for (j=1;j<=(n-k);j++) {
00031 num += wk1[j]*wk2[j];
00032 denom += SQR(wk1[j])+SQR(wk2[j]);
00033 }
00034 cof[k]=2.0*num/denom;
00035 *pm *= (1.0-SQR(cof[k]));
00036 if (k != 1)
00037 for (i=1;i<=(k-1);i++)
00038 cof[i]=wkm[i]-cof[k]*wkm[k-i];
00039 if (k == m) {
00040 free_vector(wkm,1,m);
00041 free_vector(wk2,1,n);
00042 free_vector(wk1,1,n);
00043 return;
00044 }
00045 for (i=1;i<=k;i++) wkm[i]=cof[i];
00046 for (j=1;j<=(n-k-1);j++) {
00047 wk1[j] -= wkm[k]*wk2[j];
00048 wk2[j]=wk2[j+1]-wkm[k]*wk1[j+1];
00049 }
00050 }
00051 }
00052
00053 #undef SQR