ndarray3* ndarray3_ifftn_c2r( ndarray3_complex* n ) { ndarray3* spatial_data = ndarray3_new(n->sz[0], n->sz[1], n->sz[2]); int* dims; NEW_COUNT( dims, int, PIXEL_NDIMS ); dims[0] = n->sz[0]; dims[1] = n->sz[1]; dims[2] = n->sz[2]; kiss_fftndr_cfg ifft = kiss_fftndr_alloc( dims, PIXEL_NDIMS, true , NULL, NULL); kiss_fftndri(ifft, n->p, spatial_data->p ); size_t nelems = ndarray3_complex_elems( n ); for( int i = 0; i < nelems; i++ ) { spatial_data->p[i] /= nelems; /* scaling */ } free(dims); free(ifft); return spatial_data; }
static void fft_filend_real(FILE * fin, FILE * fout, int *dims, int ndims, int isinverse) { int dimprod = 1, i; kiss_fftndr_cfg st; void *ibuf; void *obuf; int insize, outsize; // size in bytes for (i = 0; i < ndims; ++i) dimprod *= dims[i]; insize = outsize = dimprod; int rdim = dims[ndims - 1]; if (isinverse) insize = insize * 2 * (rdim / 2 + 1) / rdim; else outsize = outsize * 2 * (rdim / 2 + 1) / rdim; ibuf = malloc(insize * sizeof(kiss_fft_scalar)); obuf = malloc(outsize * sizeof(kiss_fft_scalar)); st = kiss_fftndr_alloc(dims, ndims, isinverse, 0, 0); while (fread(ibuf, sizeof(kiss_fft_scalar), insize, fin) > 0) { if (isinverse) { kiss_fftndri(st, (kiss_fft_cpx*)ibuf, (kiss_fft_scalar*)obuf); } else { kiss_fftndr(st, (kiss_fft_scalar*)ibuf, (kiss_fft_cpx*)obuf); } fwrite(obuf, sizeof(kiss_fft_scalar), outsize, fout); } free(st); free(ibuf); free(obuf); }
int main(int argc, char ** argv) { int k; int nfft[32]; int ndims = 1; int isinverse = 0; int numffts = 1000, i; kiss_fft_cpx * buf; kiss_fft_cpx * bufout; int real = 0; nfft[0] = 1024;// default while (1) { int c = getopt(argc, argv, "n:ix:r"); if (c == -1) break; switch (c) { case 'r': real = 1; break; case 'n': ndims = getdims(nfft, optarg); if (nfft[0] != kiss_fft_next_fast_size(nfft[0])) { int ng = kiss_fft_next_fast_size(nfft[0]); fprintf(stderr, "warning: %d might be a better choice for speed than %d\n", ng, nfft[0]); } break; case 'x': numffts = atoi(optarg); break; case 'i': isinverse = 1; break; } } int nbytes = sizeof(kiss_fft_cpx); for (k = 0; k < ndims; ++k) nbytes *= nfft[k]; #ifdef USE_SIMD numffts /= 4; fprintf(stderr, "since SIMD implementation does 4 ffts at a time, numffts is being reduced to %d\n", numffts); #endif buf = (kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes); bufout = (kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes); memset(buf, 0, nbytes); pstats_init(); if (ndims == 1) { if (real) { kiss_fftr_cfg st = kiss_fftr_alloc(nfft[0] , isinverse , 0, 0); if (isinverse) for (i = 0; i < numffts; ++i) kiss_fftri(st , (kiss_fft_cpx*)buf, (kiss_fft_scalar*)bufout); else for (i = 0; i < numffts; ++i) kiss_fftr(st , (kiss_fft_scalar*)buf, (kiss_fft_cpx*)bufout); free(st); } else { kiss_fft_cfg st = kiss_fft_alloc(nfft[0] , isinverse , 0, 0); for (i = 0; i < numffts; ++i) kiss_fft(st , buf, bufout); free(st); } } else { if (real) { kiss_fftndr_cfg st = kiss_fftndr_alloc(nfft, ndims , isinverse , 0, 0); if (isinverse) for (i = 0; i < numffts; ++i) kiss_fftndri(st , (kiss_fft_cpx*)buf, (kiss_fft_scalar*)bufout); else for (i = 0; i < numffts; ++i) kiss_fftndr(st , (kiss_fft_scalar*)buf, (kiss_fft_cpx*)bufout); free(st); } else { kiss_fftnd_cfg st = kiss_fftnd_alloc(nfft, ndims, isinverse , 0, 0); for (i = 0; i < numffts; ++i) kiss_fftnd(st , buf, bufout); free(st); } } free(buf); free(bufout); fprintf(stderr, "KISS\tnfft="); for (k = 0; k < ndims; ++k) fprintf(stderr, "%d,", nfft[k]); fprintf(stderr, "\tnumffts=%d\n" , numffts); pstats_report(); kiss_fft_cleanup(); return 0; }