/* ***************************************************** ** 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; }
/* 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); }
/* 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); }