Example #1
0
/* *****************************************************
** in-place Radix-2 inverse FFT for real values
** (by the so-called "packing method")
** data: array of doubles:
** re(0),re(size/2),re(1),im(1),re(2),im(2),...,re(size/2-1),im(size/2-1)
**
** output:
** re(0),re(1),re(2),...,re(size-1)
** NOT normalized by array length
**
** Source: see the routines it calls ...
******************************************************* */
void irealfft_packed(MYFLT *data, MYFLT *outdata, int size, MYFLT *twiddle) {

    int i;

	size >>= 1;
	unrealize(data, size);
	unshuffle(data, size);
	inverse_dit_butterfly(data, size, twiddle);

	size <<= 1;
	for (i=0; i<size; i++)
	    outdata[i] = data[i] * 2;
}
Example #2
0
/*
    in-place Radix-2 inverse FFT for complex values
    data:   (array of float, below order)
    re(0),im(0),re(1),im(1),...,re(size-1),im(size-1)
    means size=array_length/2 !!

    output is in similar order, NOT normalized by array length
*/
void fa_ifft(uintptr_t handle, float* data)
{
    int i, bit;
    fa_fft_ctx_t *f = (fa_fft_ctx_t *)handle;
    float *temp     = f->fft_work;
    int   size      = f->length;
    int   *bit_rvs  = f->bit_rvs;

    float *cos_ang  = f->cos_ang;
    float *sin_ang  = f->sin_ang;

    for (i = 0 ; i < size ; i++) {
        bit = bit_rvs[i];
        temp[i+i] = data[bit+bit]; temp[i+i+1] = data[bit+bit+1];
    }

    for (i = 0; i < size ; i++) {
        data[i+i] = temp[i+i]/size;
        data[i+i+1] = temp[i+i+1]/size;
    }

    inverse_dit_butterfly(data, size, cos_ang, sin_ang);
}
Example #3
0
/*
    in-place Radix-2 inverse FFT for complex values
    data:   (array of double, below order)
    re(0),im(0),re(1),im(1),...,re(size-1),im(size-1)
    means size=array_length/2 !!

    output is in similar order, NOT normalized by array length
*/
void llz_ifft(unsigned long handle, double* data)
{
    int i, bit;
    llz_fft_ctx_t *f = (llz_fft_ctx_t *)handle;
    double *temp     = f->fft_work;
    int   size      = f->length;
    int   *bit_rvs  = f->bit_rvs;

    double *cos_ang  = f->cos_ang;
    double *sin_ang  = f->sin_ang;

    for (i = 0 ; i < size ; i++) {
        bit = bit_rvs[i];
        temp[i+i] = data[bit+bit]; temp[i+i+1] = data[bit+bit+1];
    }

    for (i = 0; i < size ; i++) {
        data[i+i] = temp[i+i]/size;
        data[i+i+1] = temp[i+i+1]/size;
    }

    inverse_dit_butterfly(data, size, cos_ang, sin_ang);
}