main() { int n1,n2,j; float scale,sumz,sume; for (n1=1,n2=npfa(n1+1); n2<NMAX; n1=n2,n2=npfa(n1+1)) { for (j=0; j<n1*n2; j++) c[j] = z[j] = cmplx(franuni(),franuni()); pfamcc(1,n1,n2,1,n1,z); pfamcc(1,n2,n1,n1,1,z); pfamcc(-1,n1,n2,1,n1,z); pfamcc(-1,n2,n1,n1,1,z); scale = 1.0/(float)(n1*n2); for (j=0; j<n1*n2; j++) z[j] = crmul(z[j],scale); for (j=0,sumz=sume=0.0; j<n1*n2; j++) { sumz += fcabs(z[j]); sume += fcabs(csub(z[j],c[j])); } printf("n1 = %d n2 = %d sume/sumz = %0.10f\n", n1,n2,sume/sumz); if (sume/sumz>1.0e-6) printf("!!! warning !!!\n"); } }
void ccm_fft(complex *cdata, int n1, int n2, int ld1, int sign) { int i, j; double *real, *imag; if (NINT(pow(2.0, (double)NINT(log((double)n1)/log(2.0)))) != n1) { if (npfa(n1) == n1) pfamcc(sign, n1, n2, 1, ld1, cdata); else { for (i = 0; i < n2; i++) ccdft(&cdata[i*ld1],n1,sign); } } else { real = (double *)malloc(n1*sizeof(double)); if (real == NULL) fprintf(stderr,"ccm_fft: memory allocation error\n"); imag = (double *)malloc(n1*sizeof(double)); if (imag == NULL) fprintf(stderr,"ccm_fft: memory allocation error\n"); for (i = 0; i < n2; i++) { for (j = 0; j < n1; j++) { real[j] = (double)cdata[i*ld1+j].r; imag[j] = (double)cdata[i*ld1+j].i; } if (sign < 0) fft(n1, real, imag); else ifft(n1, real, imag); for (j = 0; j < n1; j++) { cdata[i*ld1+j].r = (REAL)real[j]; cdata[i*ld1+j].i = (REAL)imag[j]; } } free(real); free(imag); } return; }