DFT 展开式和 FFT推导

时间:2022-12-09 01:36:29

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 的展开式子

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

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

DFT 展开式和 FFT推导

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

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

DFT 展开式和 FFT推导

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