home *** CD-ROM | disk | FTP | other *** search
- forie(n,nk,r,k,e,a1,b1)
-
- int k[],n,nk;
- float r[],e[],a1[],b1[];
-
- {
-
- int h,i,ix,j,l,kmax,m;
- float a,a0,b,d,sum,suma,sumb;
- float t[200],s[200],c[200],f[200];
- extern double cos(),sin();
-
- ix = 1;
- kmax = k[nk-1];
- if(n <= 0 || n > 200) goto e2;
- if(kmax > (n/2)) goto e3;
- if(k[0] != 0) goto e1;
- for(i = 0; i <= n-1; i++)
- {
- a1[i] = 0.;
- b1[i] = 0.;
- }
- l = 1;
- i = n - 1;
- d = i;
- reit: m = k[l-1];
- sumb = 0.;
- if(m < 0) goto e4;
- if (m <= 0) /* compute average level */
- {
- sum = (r[0]+r[n-1])/2.;
- for(j = 1; j <= i-1; j++)
- sum = sum + r[j];
- a = sum/d;
- a0 = a;
- b = 0.;
- }
- else
- {
- h = m; /* compute sine-cosine */
- s[1] = sin((6.2831854/d) * h);
- c[1] = cos((6.2831854/d) * h);
-
- for(j = 2; j <= i-1; j++)
- {
- s[j] = s[j-1] * c[1] + c[j-1] * s[1];
- c[j] = c[j-1] * c[1] - s[j-1] * s[1];
- }
- suma = (r[0] + r[n-1] -2. * a0)/2.;
- for(j = 1; j <= i-1; j++)
- {
- suma = suma + (r[j]-a0) * c[j];
- sumb = sumb + (r[j]-a0) * s[j];
- }
- a = (2.0 * suma)/d;
- b = (2.0 * sumb)/d;
- /*compute t vector*/
- for(j = 1; j <= i-1; j++)
- t[j] = a * c[j] + b * s[j];
-
- t[0] = a;
- t[n-1] = a;
- }
- a1[ix-1] = a;
- b1[ix-1] = b;
- ix = ix + 1;
-
- if(m <= 0) /*compute f*/
- {
- for(j = 0; j <= n-1; j++)
- f[j] = a0;
- }
- else
- {
- for(j = 0; j <= n-1; j++)
- f[j] = f[j] + t[j];
- }
- /*increment harmonic index*/
- if (m != kmax)
- {
- l = l + 1;
- goto reit;
- }
- /*compute error*/
- for(j = 0; j <= n-1; j++)
- e[j] = r[j] - f[j];
- return;
-
- e1: printf("error in -Forie...first harmonic index not 0\n");
- return;
- e2: printf("error in -Forie...illegal data point total\n");
- return;
- e3: printf("error in -Forie...high harmonic index too large\n");
- return;
- e4: printf("error in -Forie...illegal harmonic index\n");
- }