FFT 算法实现

本文介绍了快速傅里叶变换(FFT)的DIF和DIT Radix2、Radix4算法的实现,包括复数和实数的FFT与IFFT。提供了Linux环境下编译和运行代码的步骤,并强调了不同情况下FFT和IFFT的应用。代码可在指定链接下载,用于计算不同点数的FFT,并展示了如何进行复数乘法和位反转等关键操作。
摘要由CSDN通过智能技术生成



实现功能:
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 *intint);
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);
      }
 
    
    
/*  */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值