void four1(Doub *data, const Int n, const Int isign) { Int nn,mmax,m,j,istep,i; Doub wtemp,wr,wpr,wpi,wi,theta,tempr,tempi; if (n<2 || n&(n-1)) throw("n must be power of 2 in four1"); nn = n << 1; j = 1; for (i=1;i i) { SWAP(data[j-1],data[i-1]); SWAP(data[j],data[i]); } m=n; while (m >= 2 && j > m) { j -= m; m >>= 1; } j += m; } mmax=2; while (nn > mmax) { istep=mmax << 1; theta=isign*(6.28318530717959/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;m>1); if (isign == 1) { c2 = -0.5; four1(data,1); } else { c2=0.5; theta = -theta; } wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0+wpr; wi=wpi; for (i=1;i<(n>>2);i++) { i2=1+(i1=i+i); i4=1+(i3=n-i1); h1r=c1*(data[i1]+data[i3]); h1i=c1*(data[i2]-data[i4]); h2r= -c2*(data[i2]+data[i4]); h2i=c2*(data[i1]-data[i3]); data[i1]=h1r+wr*h2r-wi*h2i; data[i2]=h1i+wr*h2i+wi*h2r; data[i3]=h1r-wr*h2r+wi*h2i; data[i4]= -h1i+wr*h2i+wi*h2r; wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } if (isign == 1) { data[0] = (h1r=data[0])+data[1]; data[1] = h1r-data[1]; } else { data[0]=c1*((h1r=data[0])+data[1]); data[1]=c1*(h1r-data[1]); four1(data,-1); } } void sinft(VecDoub_IO &y) { Int j,n=y.size(); Doub sum,y1,y2,theta,wi=0.0,wr=1.0,wpi,wpr,wtemp; theta=3.141592653589793238/Doub(n); wtemp=sin(0.5*theta); wpr= -2.0*wtemp*wtemp; wpi=sin(theta); y[0]=0.0; for (j=1;j<(n>>1)+1;j++) { wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; y1=wi*(y[j]+y[n-j]); y2=0.5*(y[j]-y[n-j]); y[j]=y1+y2; y[n-j]=y1-y2; } realft(y,1); y[0]*=0.5; sum=y[1]=0.0; for (j=0;j0;i-=2) { sum1=sum; sum += y[i]; y[i]=sum1; } } else if (isign == -1) { ytemp=y[n-1]; for (i=n-1;i>2;i-=2) y[i]=y[i-2]-y[i]; y[1]=2.0*ytemp; for (i=2;i