Beispiel #1
0
ndarray3_complex* ndarray3_fftn_r2c( ndarray3* n ) {
	ndarray3_complex* freq_data =
		ndarray3_complex_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 fft =
		kiss_fftndr_alloc( dims, PIXEL_NDIMS, false , NULL, NULL);

	kiss_fftndr(fft, (kiss_fft_scalar*)(n->p), freq_data->p );

	free(dims);
	free(fft);

	return freq_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;
}