41 void wavefft(
double a[],
double b[],
int ntot,
int n,
int nspan,
int isn)
126 double c72=0.30901699437494742;
127 double s72=0.95105651629515357;
128 double s120=0.86602540378443865;
129 double pi=3.141592653589793;
131 double c1,
c2=0.,
c3=0., s1, s2=0., s3=0.;
133 if (isn < 0) { s72=-s72; s120=-s120; rad=-rad; inc=-inc; }
140 double radf=rad*double(jc)*0.5;
143 for (
int i=1; i<nf; i++) nfac[i]=0;
148 while ( ((
k/16)*16) ==
k ) { m++; nfac[
m]=4;
k/=16; }
153 while ( (
k%jj) == 0) { m++; nfac[
m]=
j;
k/=jj ;}
156 }
while ( jj <=
k ) ;
158 if (
k <= 4 ) { kt=
m; nfac[m+1]=
k;
if (
k != 1) m++; }
161 if ( ((
k/4)*4) ==
k ) { m++; nfac[
m]=2;
k/=4; }
166 if( (
k%j) == 0) { m++; nfac[
m]=
j;
k/=
j; }
172 { j=kt;
do { m++; nfac[
m]=nfac[
j]; j--; }
while ( j != 0 ) ; }
175 for (
int i=1; i<nf; i++)
176 if ( nfac[i] > maxf) { maxf=nfac[
i]; }
179 int kk, k1, k2, k3=0, k4;
181 double aa, bb, ak, bk, aj, bj;
182 double ajm, ajp, akm, akp, bjm, bjp, bkm, bkp;
186 double *at, *ck, *bt, *sk;
187 at=
new double[maxf+1];
188 bt=
new double[maxf+1];
189 ck=
new double[maxf+1];
190 sk=
new double[maxf+1];
196 sd=radf/double(kspan);
197 cd=sin(sd); cd*=
cd; cd*=2.;
203 if ( nfac[i] != 2 )
goto L400;
210 a[k2]=a[kk]-ak; b[k2]=b[kk]-bk;
211 a[kk]=a[kk]+ak; b[kk]=b[kk]+bk;
214 }
while (kk <= nn-1);
218 }
while ( kk <= jc-1);
219 if ( kk > (kspan -1) )
goto L800 ;
228 ak=a[kk]-a[k2]; bk=b[kk]-b[k2];
229 a[kk]=a[kk]+a[k2]; b[kk]=b[kk]+b[k2];
230 a[k2]=c1*ak-s1*bk; b[k2]=s1*ak+c1*bk;
251 kk=(k1-kspan+1)/2+jc-1;
253 }
while (kk <= jc+jc-1);
261 { k1=kk+kspan; k2=k1+kspan;
263 aj=a[k1]+a[k2]; bj=b[k1]+b[k2];
264 a[kk]=ak+aj; b[kk]=bk+bj;
265 ak=-0.5*aj+ak; bk=-0.5*bj+bk;
266 aj=(a[k1]-a[k2])*s120; bj=(b[k1]-b[k2])*s120;
267 a[k1]=ak-bj; b[k1]=bk+aj;
268 a[k2]=ak+bj; b[k2]=bk-aj;
271 }
while ( kk < nn -1 );
275 }
while ( kk <= kspan -1 );
281 if ( nfac[i] != 4 )
goto L600;
288 k1=kk+kspan; k2=k1+kspan; k3=k2+kspan;
289 akp=a[kk]+a[k2]; akm=a[kk]-a[k2];
290 ajp=a[k1]+a[k3]; ajm=a[k1]-a[k3];
293 bkp=b[kk]+b[k2]; bkm=b[kk]-b[k2];
294 bjp=b[k1]+b[k3]; bjm=b[k1]-b[k3];
297 if ( isn < 0 )
goto L450;
298 akp=akm-bjm; akm=akm+bjm;
299 bkp=bkm+ajm; bkm=bkm-ajm;
300 if ( s1 == 0 )
goto L460;
302 a[k1]=akp*c1-bkp*s1; b[k1]=akp*s1+bkp*
c1;
303 a[k2]=ajp*c2-bjp*s2; b[k2]=ajp*s2+bjp*
c2;
304 a[k3]=akm*
c3-bkm*s3; b[k3]=akm*s3+bkm*
c3;
307 if ( kk <= nt-1 )
goto L420;
311 c1=2.0-(c2*c2+s1*s1);
320 if ( kk <= kspan-1)
goto L420;
323 if ( kk <= jc-1 )
goto L410;
324 if ( kspan == jc )
goto L800;
329 akp=akm+bjm; akm=akm-bjm;
330 bkp=bkm-ajm; bkm=bkm+ajm;
332 if ( s1 != 0)
goto L430;
335 a[k1]=akp; b[k1]=bkp;
336 a[k2]=ajp; b[k2]=bjp;
337 a[k3]=akm; b[k3]=bkm;
340 if ( kk <= nt-1 )
goto L420;
350 { k1=kk+kspan; k2=k1+kspan; k3=k2+kspan; k4=k3+kspan;
351 akp=a[k1]+a[k4]; akm=a[k1]-a[k4];
352 bkp=b[k1]+b[k4]; bkm=b[k1]-b[k4];
353 ajp=a[k2]+a[k3]; ajm=a[k2]-a[k3];
354 bjp=b[k2]+b[k3]; bjm=b[k2]-b[k3];
356 a[kk]=aa+akp+ajp; b[kk]=bb+bkp+bjp;
357 ak=akp*c72+ajp*c2+aa; bk=bkp*c72+bjp*c2+bb;
358 aj=akm*s72+ajm*s2; bj=bkm*s72+bjm*s2;
359 a[k1]=ak-bj; a[k4]=ak+bj;
360 b[k1]=bk+aj; b[k4]=bk-aj;
361 ak=akp*c2+ajp*c72+aa; bk=bkp*c2+bjp*c72+bb;
362 aj=akm*s2-ajm*s72; bj=bkm*s2-bjm*s72;
363 a[k2]=ak-bj; a[k3]=ak+bj;
364 b[k2]=bk+aj; b[k3]=bk-aj;
366 }
while ( kk < nn-1 );
368 }
while ( kk <= kspan-1 ) ;
377 if (
k == 3 )
goto L320;
378 if (
k == 5 )
goto L510;
379 if (
k == jf )
goto L640;
382 c1=cos(s1); s1=sin(s1);
383 if ( jf > maxf )
goto L998 ;
384 ck[jf]=1.0; sk[jf]=0.0;
387 { ck[
j]=ck[
k]*c1+sk[
k]*s1;
388 sk[
j]=ck[
k]*s1-sk[
k]*
c1;
424 { k1+=kspan; k2-=kspan;
438 if ( jj > jf ) jj-=jf;
443 a[k1]=ak-bj; b[k1]=bk+aj;
444 a[k2]=ak+bj; b[k2]=bk-aj;
450 }
while ( kk <= nn-1 );
452 }
while ( kk <= kspan-1 );
455 if ( i == m )
goto L800;
469 a[kk]=c2*ak-s2*b[kk];
470 b[kk]=s2*ak+c2*b[kk];
472 }
while ( kk <= nt-1 );
478 }
while ( kk <= kspnn-1 );
482 c1=2.0-(c2*c2+s1*s1);
487 }
while ( kk <= kspan -1 );
491 }
while ( kk <= jc+jc-1 );
499 if ( kt == 0)
goto L890;
505 { np[j+1]=np[
j]/nfac[
j];
506 np[
k]=np[
k+1]*nfac[
j];
516 if ( n != ntot )
goto L850;
528 }
while ( k2 < ks-1 );
534 }
while ( k2 > np[j]-1 );
536 L840:
if ( kk < k2 )
goto L820;
539 if ( k2 < ks-1 )
goto L840;
540 if ( kk < ks-1 )
goto L830;
549 { ak=a[kk]; a[kk]=a[k2]; a[k2]=ak;
550 bk=b[kk]; b[kk]=b[k2]; b[k2]=bk;
552 }
while ( kk <
k-1 );
556 }
while ( kk < nt-1 );
560 }
while ( k2 < ks-1 );
562 do { k2-=np[
j]; j++; k2+=np[j+1]; }
while ( k2 > np[j]-1 );
566 if ( kk < k2 )
goto L850;
569 if ( k2 < ks-1 )
goto L880;
570 if ( kk < ks-1 )
goto L870;
573 if ( 2*kt+1 >= m ) {
delete []
np;
delete [] at;
delete [] bt;
574 delete [] ck ;
delete [] sk;
return;}
580 do { nfac[
j]=nfac[
j]*nfac[j+1]; j--; }
while ( j != kt );
586 delete []
np; np=
new int[maxp+1]; }
598 if ( jj-1 >= k2 )
goto L902;
605 if ( j <= nn )
goto L904;
610 do {
k=kk+1; kk=np[
k]-1; np[
k]=-kk-1; }
while ( kk != j-1 );
614 do { j++; kk=np[
j]-1; }
while ( kk < -1 );
616 if ( kk != j-1 )
goto L910;
618 if ( j != nn )
goto L914;
624 {
do { j--; }
while ( np[j] < 0 );
629 if ( jj > maxf ) kspan=maxf;
635 do { at[k2]=a[k1]; bt[k2]=b[k1]; k2++; k1-=inc; }
while ( k1 != kk );
641 do { a[k1]=a[k2]; b[k1]=b[k2]; k1-=inc; k2-=inc; }
while( k1 != kk );
647 do { a[k1]=at[k2]; b[k1]=bt[k2]; k2++; k1-=inc; }
while ( k1 != kk );
655 if ( nt >= 0 )
goto L924;
656 delete []
np;
delete [] at;
delete [] bt;
delete [] ck ;
delete [] sk;
660 delete []
np;
delete [] at;
delete [] bt;
delete [] ck ;
delete [] sk;
662 printf(
"Error: array bounds exceeded within subroutine wavefft.\n");
wavearray< double > a(hp.size())
void wavefft(double a[], double b[], int ntot, int n, int nspan, int isn)
printf("total live time: non-zero lags = %10.1f \, liveTot)