实现功能:
DIF Radix2, DIF Radix4
DIT Radix2, DIT Radix4
FFT complex, IFFT complex
FFT real, IFFT real
使用方法:
lguo@lguo-enst:~$ unzip Algo.zip
lguo@lguo-enst:~$ cd Algo/DIF
lguo@lguo-enst:~/Algo/DIF$ gcc -o FFT_DIF_R2 FFT_DIF_R2.c -lm
lguo@lguo-enst:~/Algo/DIF$ ./FFT_DIF_R2
lguo@lguo-enst:~$ cd Algo/FFT_Test_Linux
lguo@lguo-enst:~/Algo/FFT_Test_Linux$ make
lguo@lguo-enst:~/Algo/FFT_Test_Linux$ ./FFT
说明:
Radix2 可以计算 4,8,16,32, 64,128, 256....点FFT
Radix4 可以计算 4,16, 64, 256, 1024...点FFT
FFT_DIT_general.c 实现了 Radix2 和Radix4 的配合使用,可以计算Radix2可以计算的所有FFT,但效率比Radix2高。
FFT complex 和 FFT real:
FFT real 和 IFFT real 是指输入信号没有虚部,只是实数序列的情况。这里就可以一个N/2点的FFT complex 来计算 N点FFT real。
特别提醒的是 IFFT real 也是指输入信号没有虚部,就是频域信号没有虚部,而输出信号,也就是时域信号有虚部的情况。这在实际应用中不多见。
之后进一步的工作就是要,实现了输入信号有虚部,输出是实序列的IFFT real。这样和FFT complex 组合起来就可以做成一个常用的,时域变到频域,频域处理后再变回时域的应用。
代码下载:
http://www.cppfrance.com/codes/ALGORITHME-FFT_44369.aspx
代码示例:
/***********************************
// DIT radix-4 FFT complex
//
// 1. Maximium points are 2048 because that
// function mylog2(int N) has the limit of maximal points
//
// 2. The last stage is 2 DFT ( for 8, 32, 128, 512, 2048...)
// or 4 DFT ( for 4, 16, 64, 256, 1024 ...).
//
//
// 24 juillet 2007
// purcharse*gmail.com
************************************/
#include < math.h >
#include < stdio.h >
#include < stdlib.h >
typedef double real64; /* floating point */
typedef float real32; /* 32 bit fixed point */
struct complex
{
real32 real;
real32 imag;
} complex ;
static struct complex multicomplex( struct complex, struct complex);
static int mylog2( int );
static void DFT_2(struct complex *,struct complex *);
static void DFT_4(struct complex *,struct complex *,struct complex *,struct complex *);
static void RunFFT(struct complex *, int);
static void RunIFFT(struct complex *,int);
static void BitReverse(struct complex *, int);
static void FFT_R4(struct complex *, int, int);
static void FFT_L2(struct complex *, int);
struct complex s[257];
int Num = 16;
const float PI=3.1415926535898;
main()
{
int i;
/* rectangle */
/*
for(i=0;i<Num+1;i++)
{
s[i].real=0;
s[i].imag=0;
}
s[0].real = 10;
s[0].imag = 10;
*/
/* sinus*/
for(i=0;i<Num+1;i++)
{
s[i].real=sin(PI*i/Num);
s[i].imag=cos(PI*i/Num);
}
/* */
// DIT radix-4 FFT complex
//
// 1. Maximium points are 2048 because that
// function mylog2(int N) has the limit of maximal points
//
// 2. The last stage is 2 DFT ( for 8, 32, 128, 512, 2048...)
// or 4 DFT ( for 4, 16, 64, 256, 1024 ...).
//
//
// 24 juillet 2007
// purcharse*gmail.com
************************************/
#include < math.h >
#include < stdio.h >
#include < stdlib.h >
typedef double real64; /* floating point */
typedef float real32; /* 32 bit fixed point */
struct complex
{
real32 real;
real32 imag;
} complex ;
static struct complex multicomplex( struct complex, struct complex);
static int mylog2( int );
static void DFT_2(struct complex *,struct complex *);
static void DFT_4(struct complex *,struct complex *,struct complex *,struct complex *);
static void RunFFT(struct complex *, int);
static void RunIFFT(struct complex *,int);
static void BitReverse(struct complex *, int);
static void FFT_R4(struct complex *, int, int);
static void FFT_L2(struct complex *, int);
struct complex s[257];
int Num = 16;
const float PI=3.1415926535898;
main()
{
int i;
/* rectangle */
/*
for(i=0;i<Num+1;i++)
{
s[i].real=0;
s[i].imag=0;
}
s[0].real = 10;
s[0].imag = 10;
*/
/* sinus*/
for(i=0;i<Num+1;i++)
{
s[i].real=sin(PI*i/Num);
s[i].imag=cos(PI*i/Num);
}
/* */