鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > .net技术 > vs2010 > >

FFT和IFFT实现——分别用控制台和MFC实现

来源:互联网 作者:佚名 时间:2013-06-19 11:36
这个学期学了《数字信号处理》,当中最重要的就是快速傅里叶变换(FFT)了,FFT发展到现在已经出现了好几种算法,他们各有优劣,我这里就不一一列出来,因为我不想搞的博客又臭又长。我这里的FFT是FFT-DIT(时域抽取法FFT),算法来自西安电子科技大学出版社

  这个学期学了《数字信号处理》,当中最重要的就是快速傅里叶变换(FFT)了,FFT发展到现在已经出现了好几种算法,他们各有优劣,我这里就不一一列出来,因为我不想搞的博客又臭又长。我这里的FFT是FFT-DIT(时域抽取法FFT),算法来自西安电子科技大学出版社的教材《数字信号处理》(高西全,丁美玉),这本书里面有对FFT-DIT适用于计算机算法的详细介绍,香港虚拟主机,我这里也不讲具体算法,香港服务器租用,要想清楚我的程序为什么是这样子,香港空间,请自己看教材里面的内容。软件是VS2008。

  这里接直接贴代码。先是用C++控制台的代码:

头文件:

1 #include <complex> std; complex<double> *bitRev(complex<double> *x ,int N) 7 { 8 complex<double> temp = 0; // r = k; (n = 0; n <= N-2;n++) 14 { { 17 temp = x[n]; 18 x[n] = x[r]; 19 x[r] = temp; 20 } 21 22 k = N/2; //even n: adds to the previous r ( r>k || r==k) 26 { k = k/ } 30 31 r = r + k; 32 } x; 35 } complex<double> *FFTdit(complex<double> *a,int N) 39 { 40 int t=2; 41 int m,L = 1 ,L2 ,ir ,ib, it; 42 complex<double> temp(0,0),j(0,1); 43 complex<double> *x; complex< nu; x = bitRev(a,N); 50 51 nu = (int)(log((double)N)/log((double)t)); (m = 1; m <= nu; m++) 54 { 55 L = L*2; 56 57 L2 = L/2; (ir = 0; ir < L2; ir++) 60 { 61 W = exp(-j*(complex<double>)2*pi*(complex<double>)ir/(complex<double>)L); 62 for(it = ir; it < N;it = it + L) 63 { 64 ib = it + L2; 65 temp = x[ib] * W; 66 x[ib] = x[it] - temp; 67 x[it] = x[it] + temp; 68 } 69 } 70 } x; 73 } complex<double> *IFFT(complex<double> *X,int N) 77 { 78 int m = (int)ceil(log((double)N)/log(2.0)); 79 int n = 1 << m; 80 int i; 81 complex<double> *tempx ; 82 complex<double> *x = new complex<double>[n]; (i = 0; i < n; i++) 85 X[i].imag(-imag(X[i])); 86 87 tempx = FFTdit(X,n); (i = 0; i < N; i++) 90 { 91 if((real<double>(tempx[i]))/n < 1e-14) 92 x[i].real(0); x[i].real((real<double>(tempx[i]))/n); ((imag<double>(tempx[i]))/n < 1e-14) 97 x[i].imag(0); x[i].imag(-(imag<double>(tempx[i]))/n); 100 } x; 103 }

网友评论
<