zoukankan      html  css  js  c++  java
  • DFT 展开式和 FFT推导

    C语言的FFT

    //----------------------------------------------------------------------------------

    //----------------------------------------------------------------------------------

    01.void      dft()  
    02.{  
    03.          extern int     inv;  
    04.          extern long    npt;  
    05.          long           k,n;  
    06.          double         WN,wk,c,s,XR[size],XI[size];  
    07.          extern complex x[size];  
    08.  
    09.          WN=2*pi/npt;  
    10.  
    11.          if(inv==1)  
    12.              WN=-WN;  
    13.  
    14.          for(k=0;k<npt;++k)  
    15.          {  
    16.              XR[k]=0.0;XI[k]=0.0;  
    17.              wk=k*WN;  
    18.  
    19.              for(n=0;n<npt;++n)  
    20.              {  
    21.                    c=cos(n*wk);s=sin(n*wk);  
    22.                    XR[k]=XR[k]+x[n+1].real*c+x[n+1].imag*s;  
    23.                    XI[k]=XI[k]-x[n+1].real*s+x[n+1].imag*c;  
    24.              }  
    25.              if(inv==1)  
    26.              {  
    27.                XR[k]=XR[k]/npt;   
    28.                XI[k]=XI[k]/npt;  
    29.              }  
    30.          }  
    31.  
    32.          for(k=1;k<=npt;++k)  
    33.          {  
    34.              x[k].real=XR[k-1];  
    35.              x[k].imag=XI[k-1];  
    36.          }  
    37.  
    38.} 

    //----------------------------------------------------------------------------------

    //----------------------------------------------------------------------------------

    离散DFT 的展开式子

       图 (a)为实现这一运算的一般方法,它需要两次乘法、两次加减法。考虑到-bW和bW两个乘法仅相差一负号,可将图 (a)简化成图2.7(b),此时仅需一次乘法、两次加减法。图 (b)的运算结构像一蝴蝶通常称作蝶形运算结构简称蝶形结,采用这种表示法,就可以将以上所讨论的分解过程用流图表示。

    按照这个办法,继续把N/2用2除,由于N=2M,仍然是偶数,可以被2整除,因此可以对两个N/2点的DFT再分别作进一步的分解。即对{G(k)}和{H(k)}的计算,又可以分别通过计算两个长度为N/4=2点的DFT,进一步节省计算量,见图。这样,一个8点的DFT就可以分解为四个2点的DFT。

    如果用反推法,把上图的蝶形运算FFT,展开求出X(0),其结果和DFT的结果完全一致。

  • 相关阅读:
    团队冲刺第五天
    团队冲刺第四天
    学习进度条---第八周
    团队冲刺第三天
    团队冲刺第二天
    团队冲刺第一天
    学习进度条--第七周
    课堂练习--第7周(两人结对)
    学习进度条--第六周
    第一次 在Java课上的编程
  • 原文地址:https://www.cnblogs.com/touchblue/p/4574817.html
Copyright © 2011-2022 走看看