示例#1
0
文件: fft.c 项目: BackupGGCode/pyo
/* *****************************************************
** in-place Radix-2 FFT for real values
** (by the so-called "packing method")
** data: array of doubles:
** re(0),re(1),re(2),...,re(size-1)
**
** output:
** re(0),re(size/2),re(1),im(1),re(2),im(2),...,re(size/2-1),im(size/2-1)
** normalized by array length
**
** Source: see the routines it calls ...
******************************************************* */
void realfft_packed(MYFLT *data, MYFLT *outdata, int size, MYFLT *twiddle) {

    int i;

	size >>= 1;
	dif_butterfly(data, size, twiddle);
	unshuffle(data, size);
	realize(data, size);

	size <<= 1;
	for (i=0; i<size; i++)
	    outdata[i] = data[i] / size;
}
示例#2
0
/*
    in-place Radix-2 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, normalized by array length
*/
void fa_fft(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;
	
    dif_butterfly(data, size, cos_ang, 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];
        data[i+i+1] = temp[i+i+1];
    }

}
示例#3
0
/*
    in-place Radix-2 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, normalized by array length
*/
void llz_fft(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;

    dif_butterfly(data, size, cos_ang, 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];
        data[i+i+1] = temp[i+i+1];
    }

}