FFT算法

这几天,我一直在看FFT算法,下面分享一下我这几天学到的东西  
   
  1。直接计算离散傅立叶变换具有n^2的复杂度,而cooley   和tukey在1965年发现了一种计算离散傅立叶变换的快速算法(即通  
   
  常所说的FFT算法),这个算法在计算变换长度n=2^k的离散傅立叶变换时,具有   n*k   的复杂度,即O(n)=n*log2(n),   下面以此  
   
  为例,讲讲快FFT的特点。  
      1)复数运算:傅立叶变换是基于复数的,因此首先知道复数的运算规则,在FFT算法中,只涉及复数的加、减和乘法三种运  
   
  算。一个复数可表示为   c=(   x,yi),   x   为复数的实部,y为复数的虚部,i为虚数单位,等于-1的平方根。复数的运算规则是:  
   
  若c1   表示为   (x1,y1),c2   表示为(x2,y2),   则   (x1+x2,y1+y2)和(x1-x2,y1-y2)分别等于c1+c2的和,c1-c2的差,复数的乘法  
   
  相对复杂一些,c1*c2   的积为   (x1*x2-y1*y2,x1*y2+x2*y1).  
       
        2)蝶形变换:普通的FFT算法称为基2的FFT算法,这种算法的核心是蝶形变换   长度为n=2^k1的变换共需要做   k1   *   n/2   次  
   
  蝶形变换,若需变换数据表示为一个复数数组c[],则每次蝶形变换有2个输入   c[i],c[i+s],两个输出:c[i],c[i+s],s成为翅  
   
  间距。   每个变换的基本算法是:  
       
      t=wr   *   c[i+s];    
      c[i+s]=c[i]-t;  
      c[i]=c[i]+t;  
   
        前面说过,长度为n=2^k1的变换共需要做   k1   *    
   
  n/2次变换,实际的程序是一个3层循环,共需要k1*k2*(k3/2)次变换(k2*k3/2=n/2)。前面的wr是w的整数次方,w=e^(-2*PI/k3  
   
  )   (k3=2,4,8,16...n,PI是圆周率),也成为旋转因子,例如n=32的变换需要log2(32)=5趟变换:  
        第1趟变换需要16*1次变换,翅间距是1,     若w=e^(-2*PI/2),   则wr=w^1  
        第2趟变换需要8*2次变换,   翅间距是2,     若w=e^(-2*PI/4),   则wr=w^1,w^2  
        第3趟变换需要4*2次变换,   翅间距是4,     若w=e^(-2*PI/8),   则wr=w^1,w^2,w^3,w^4    
        第4趟变换需要2*8次变换,   翅间距是8,     若w=e^(-2*PI/16),则wr=w^1,w^2,w^3,w^4,w^5,w^6,w^7,w^8  
        第5趟变换需要16*1次变换,翅间距是16,   若w=e^(-2*PI/32),则wr=w^1,w^2,w^3,w^4,w^5...w^15,w^16  
   
      3)w数组,w   的实部=cos(2*PI/k3),w的虚部=   -sin(2*PI/k3),计算出w,则wr数组就好求了,不断即相乘即可,当然也可以通  
   
  过三角函数直接求。w^p   的实部=cos(2*PI/K3*p),虚部=-sin(2*PI/k3*p)  
   
    4)复数数组排序,在基2的蝶形变换中,复数数组需要重新排序,c[i]   要放置到数组c的第   reverse(c[i])    
   
  的位置,m=reverse(n)   函数的算法是这样的,若   n的   k位2进制的为b[],   b[k-1],B[k-2],...b[2],b[1],b[0],(   b[i]   等于1  
   
  或者0,b[0]为最低bit).   则m=reverse(n)的2进制的为   b[0],b[1],b[2],b[3],...b[k-1]   (b[k-1]为最低bit).  
   
        更复杂的变换算法:基2的蝶形变换算法不止一种,它可分为2类,一类为基2时分傅立叶变换,另一类为基2频分傅立叶变  
   
  换。上例的变为基2时分算法,在每一趟变换中,翅间距依次变大,第一趟为2,最后一趟为n/2,数组重排在变换之前进行,基  
   
  2频分算法正好相反,翅间距依次缩小,起于n/2,止于2,数组重排在蝶形变换之后进行。   在<傅立叶变换>一书中,提到3  
   
  种基2时分变换,3种基2频分变换。上述算法称为基2时分FFT第二种算法。我在看你的这个程序的同时,还看到朱志刚写的一  
   
  个FFT程序,这个程序的算法是基2时分FFT第一种算法,它比经典的算法更复杂,需要对wr数组进行逆序排列。  
   
  ///这个程序不太直观的地方。  
     
   
  在计算wp是,虚部使用sin函数直接计算,但是实部没有直接计算,按照数学公式cos(x)=1-2*sin(x/2)^2,这里,wpr只取-2*s  
   
  in(x/2),比实际值小1,故在计算w时,采用以下算式:  
                      wr   =   wr   *   wpr   -   wi   *   wpi   +   wr;  
                      wi   =   wi   *   wpr   +   wtemp   *   wpi   +   wi;  
                    wr*wpr-wi*wpi+wr   -->   wr*(1+wpr)-wi*wpi,可以看到这里将1重新补上了。  
   
   
  //更复杂的FFT算法,除了基2   的FFT算法外,还有更加复杂的基4算法,基8算法,甚至基3,基5算法,纯粹的基4算法只能计算  
   
  长度为4^k的变换,但它比基2的算法速度更高。为了提高速度,很多FFT算法使用混合基算法。如我看到的2个效率很高程序均  
   
  使用了混合基算法。第一个程序是来自:http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html,它使用了基2,基4,甚至基8混  
   
  合算法,共提供了6同样功能的算法。可对长度为2^k的序列做FFT,这个程序的写的很复杂,我现在尚不能完全看懂。另一个  
   
  程序来自:http://hjem.get2net.dk/jjn/fft.htm。相对于前者,这个程序相对简单一点。它使用了基2,基3,基4,基5,基8,  
   
  基10   混合算法,几乎可以计算任意长度的FFT。具体的,当序列长度n为2,3,5,7,11,13,17,19,23,29,31,37等小素数时,或  
   
  者n的最大素因数小于等于37时,可计算这个序列的FFT。  
   
    关于FFT算法的其它文档:http://www.jjj.de/fxt/fxtbook.pdf,   websuite:   http://www.jjj.de/fxt/,   这是我见过的关于变换算法的最全面的文档。 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VS2008是微软开发的一款集成开发环境(IDE),用于开发和调试各种软件应用程序。而FFT(快速傅里叶变换)是一种用于将时域信号转换成频域信号的数学算法。 在VS2008中,可以使用C或C++编程语言来实现FFT算法。有两种常见的方法可以在VS2008中实现FFT算法:一种是使用现有的库函数,如FFTW(Fastest Fourier Transform in the West)库;另一种是手动编写FFT算法的代码。 如果选择使用现有的库函数,可以下载并安装FFTW库,并将其链接到VS2008项目中。使用库函数可以简化FFT算法的实现过程,因为库函数已经实现了优化的FFT算法,并提供了一系列的函数和参数来进行不同规模的FFT计算。 如果选择手动编写FFT算法的代码,可以根据FFT算法的原理和公式来实现。FFT算法基于分治法的思想,通过递归将输入信号划分为较小规模的子问题,并通过变换子问题的输出来得到最终结果。 通过在VS2008中创建一个C或C++项目,并编写相应的代码,可以实现FFT算法的计算。在代码中,需要定义输入信号的数组,并根据FFT算法的原理计算出频域信号的输出结果。可以使用循环和递归等控制结构来实现算法的迭代和分治过程。 总之,无论是使用现有的库函数还是手动编写代码,VS2008都提供了开发环境和工具,可以帮助开发者实现和调试FFT算法。选择哪种方式取决于具体的需求和开发者的偏好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值