simon21 发表于 2005-9-20 09:48

[讨论]关于fft算法问题

本帖最后由 wdhd 于 2016-3-14 14:51 编辑

傅立叶变换的程序贴出如下:



#include <stdio.h>
#include <math.h>
#define N 64
#define m 6 //2^m=N
/*
float twiddle={1.0,0.707,0.0,-0.707,};
float x_r={1,1,1,1,0,0,0,0,};
float x_i; //N=8
*/
float twiddle={1,0.9951,0.9808,0.9570,0.9239,0.8820,0.8317,0.7733,
0.7075,0.6349,0.5561,0.4721,0.3835,0.2912,0.1961,0.0991,
0.0000,-0.0991,-0.1961,-0.2912,-0.3835,-0.4721,-0.5561,-0.6349,
-0.7075,-0.7733,0.8317,-0.8820,-0.9239,-0.9570,-0.9808,-0.9951,}; //N=64
float x_r={1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,};
float x_i;

void fft_init()
{
int i;
for(i=0;i<N;i++)
x_i=0.0;
}
void bitrev()
{
int p=1,q,i;
int bit_rev;
float xx_r;
bit_rev=0;
while(p<N)
{
for(q=0;q<p;q++)
{
bit_rev=bit_rev*2;
bit_rev=bit_rev+1;
}
p=p*2;
}
for(i=0;i<N;i++)
{
xx_r=x_r;
}
for(i=0;i<N;i++)
{
x_r=xx_r];
}
}

void display()
{
int i;
for(i=0;i<N;i++)
printf("%f\t%f\n",x_r,x_i);
}

void fft1()
{
int L,i,b,j,p,k,tx1,tx2;
float TI,TR,temp;
float tw1,tw2;

for(L=1;L<=m;L++)
{ /* for(1) */
b=1; i=L-1;
while(i>0)
{b=b*2;i--;} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{ p=1; i=m-L;
while(i>0) /* p=pow(2,7-L)*j; */
{p=p*2; i--;}
p=p*j;
tx1=p%(N);
tx2=tx1+(3*N)/4;
tx2=tx2%(N);
if (tx1>=(N/2))
tw1=-twiddle;
else
tw1=twiddle;
if (tx2>=(N/2))
tw2=-twiddle;
else
tw2=twiddle;
for(k=j;k<N;k=k+2*b) /* for (3) */
{TR=x_r; TI=x_i; temp=x_r;
x_r=x_r+x_r*tw1+x_i*tw2;
x_i=x_i-x_r*tw2+x_i*tw1;
x_r=TR-x_r*tw1-x_i*tw2;
x_i=TI+temp*tw2-x_i*tw1;
}
}
}

}

void dft()
{
int i,n,k,tx1,tx2;
float tw1,tw2;
float xx_r,xx_i;
//clear any data in Real and Imaginary result arrays prior to DFT
for(k=0;k<=N-1;k++)
xx_r=xx_i=x_i=0.0;
//caculate the DFT
for(k=0;k<=(N-1);k++)
{
for(n=0;n<=(N-1);n++)
{
tx1=(n*k);
tx2=tx1+(3*N)/4;
tx1=tx1%(N);
tx2=tx2%(N);
if (tx1>=(N/2))
tw1=-twiddle;
else
tw1=twiddle;
if (tx2>=(N/2))
tw2=-twiddle;
else
tw2=twiddle;
xx_r=xx_r+x_r*tw1;
xx_i=xx_i+x_r*tw2;
}
xx_i=-xx_i;
}
//display
for(i=0;i<N;i++)
printf("%f\t%f\n",xx_r,xx_i);

}

void main()
{
/*
fft_init();
bitrev();
fft1();
display(); //FFT
*/
dft(); //DFT
}

simon21 发表于 2005-9-20 09:49

回复:(simon21)[讨论]关于fft算法问题

本帖最后由 wdhd 于 2016-3-14 14:51 编辑

  其中分别使用fft和dft做变换

  源程序如上: 其中函数fft1()代表fft变换,函数dft()代表dft变换.

  当取N=8的时候,fft和dft算出来的数据是一样的.

  fft和dft计算结果如下:

  4.000000 0.000000

  1.000000 -2.414000

  0.000000 0.000000

  1.000000 -0.414000

  0.000000 0.000000

  1.000000 0.414000

  0.000000 0.000000

  1.000000 2.414000

  Press any key to continue

  但是,当N=64的时候,fft和dft算出的数据x_r[ i ],x_ i就不相同:

  fft算出的结果如下:

  32.000000 0.000000

  0.968460 -20.365383

  0.000000 0.000000

  0.993620 -6.749197

  0.000000 0.000000

  3.875856 -1.388196

  0.000000 0.000000

  ... ... ... ... ;这里只取i=0~6的x_r[ i ],x_ i显示

  dft算出的结果如下:

  32.000000 0.000000

  2.663399 -18.705200

  -0.000000 0.000001

  2.663400 -8.407199

  0.000000 0.000000

  2.663400 -2.332000

  0.000000 0.000000

  ... ... ... ... ;这里只取i=0~6的x_r[ i ],x_ i显示

  书上说,dft和fft的计算结果应该是完全一样的.这是怎么会事?是不是程序中有问题,谢谢!

Anonymous 发表于 2005-9-22 21:28

回复:(simon21)[讨论]关于fft算法问题

本帖最后由 wdhd 于 2016-8-31 15:29 编辑

  fft的源程序不是现成的吗?看看这个网站,上面有世界上最优秀的fft算法,而且是免费的,matlab的fft就是用的他的算法。

  http://www.fftw.org/

simon21 发表于 2005-9-23 09:00

回复:(Anonymous)回复:(simon21)[讨论]关于fft算...

在某些场合也不完全通用吧,需要自己更具情况写

Anonymous 发表于 2005-9-23 15:45

回复:(simon21)回复:(Anonymous)回复:(simon2...

本帖最后由 wdhd 于 2016-3-14 14:51 编辑

  以下是引用simon21在2005-9-23 9:00:07的发言:

  在某些场合也不完全通用吧,需要自己更具情况写

  有啥不能通用的地方说来听听,长长见识啦,偶没有自己编过,

  //一向都觉得只是调用个子程序罢了

  

  [此贴子已经被作者于2005-9-23 15:45:38编辑过]

AaronSpark 发表于 2005-9-23 18:14

如果只是用在信号处理里这些程序基本够了,不过我见过一篇文章将FFT和其他算法结合起来做数值分析的,用通用程序就不行了

TNC 发表于 2005-9-24 19:03

回复:(simon21)[讨论]关于fft算法问题

个人感觉自己写一遍对FFT的理解程度能提高一个层次<BR>要用FFT的还是要自己写一下,不管最后用不用

陆雯 发表于 2006-3-3 10:52

我也正在编程中.

zhyuer 发表于 2006-3-4 16:19

好主意!
页: [1]
查看完整版本: [讨论]关于fft算法问题