int main(void) { unsigned long i; int isign; float *data1,*data2,*fft1,*fft2; data1=vector(1,N); data2=vector(1,N); fft1=vector(1,N2); fft2=vector(1,N2); for (i=1;i<=N;i++) { data1[i]=floor(0.5+cos(i*2.0*PI/PER)); data2[i]=floor(0.5+sin(i*2.0*PI/PER)); } twofft(data1,data2,fft1,fft2,N); printf("Fourier transform of first function:\n"); prntft(fft1,N); printf("Fourier transform of second function:\n"); prntft(fft2,N); /* Invert transform */ isign = -1; four1(fft1,N,isign); printf("inverted transform = first function:\n"); prntft(fft1,N); four1(fft2,N,isign); printf("inverted transform = second function:\n"); prntft(fft2,N); free_vector(fft2,1,N2); free_vector(fft1,1,N2); free_vector(data2,1,N); free_vector(data1,1,N); return 0; }
void convlv(float data[], unsigned long n, float respns[], unsigned long m, int isign, float ans[]) { void realft(float data[], unsigned long n, int isign); void twofft(float data1[], float data2[], float fft1[], float fft2[], unsigned long n); unsigned long i,no2; float dum,mag2,*fft; fft=vector(1,n<<1); for (i=1;i<=(m-1)/2;i++) respns[n+1-i]=respns[m+1-i]; for (i=(m+3)/2;i<=n-(m-1)/2;i++) respns[i]=0.0; twofft(data,respns,fft,ans,n); no2=n>>1; for (i=2;i<=n+2;i+=2) { if (isign == 1) { ans[i-1]=(fft[i-1]*(dum=ans[i-1])-fft[i]*ans[i])/no2; ans[i]=(fft[i]*dum+fft[i-1]*ans[i])/no2; } else if (isign == -1) { if ((mag2=SQR(ans[i-1])+SQR(ans[i])) == 0.0) nrerror("Deconvolving at response zero in convlv"); ans[i-1]=(fft[i-1]*(dum=ans[i-1])+fft[i]*ans[i])/mag2/no2; ans[i]=(fft[i]*dum-fft[i-1]*ans[i])/mag2/no2; } else nrerror("No meaning for isign in convlv"); } ans[2]=ans[n+1]; realft(ans,n,-1); free_vector(fft,1,n<<1); }
void correl(real data1[],real data2[],int n,real ans[]) { int no2,i; real dum,*fft; snew(fft,2*n+1); twofft(data1,data2,fft,ans,n); no2=n/2; for (i=2;i<=n+2;i+=2) { dum = ans[i-1]; ans[i-1] = (fft[i-1]*dum+fft[i]*ans[i])/no2; ans[i] = (fft[i]*dum-fft[i-1]*ans[i])/no2; } ans[2]=ans[n+1]; realft(ans,no2,-1); sfree(fft); }
void correl(float data1[], float data2[], unsigned long n, float ans[]) { void realft(float data[], unsigned long n, int isign); void twofft(float data1[], float data2[], float fft1[], float fft2[], unsigned long n); unsigned long no2,i; float dum,*fft; fft=vector(1,n<<1); twofft(data1,data2,fft,ans,n); no2=n>>1; for (i=2;i<=n+2;i+=2) { ans[i-1]=(fft[i-1]*(dum=ans[i-1])+fft[i]*ans[i])/no2; ans[i]=(fft[i]*dum-fft[i-1]*ans[i])/no2; } ans[2]=ans[n+1]; realft(ans,n,-1); free_vector(fft,1,n<<1); }