include < stdio.h>
# include < conio.h >
include < stdlib.h>
include < math.h>
include ” fft.h”
complex x[N], W; /输入序列,变换核*/
int size_x=N; /输入序列的大小,在本程序中仅限2的次幂/
void add(complex a,complex b,complex *c) //复数加法的定义
{
c->real=a.real+b.real;
c->img=a.img+b.img;
}
void mul(complex a,complex b,complex *c) //复数乘法的定义
{
c->real=a.real*b.real - a.img*b.img;
c->img=a.real*b.img + a.img*b.real;
}
void sub(complex a,complex b,complex *c) //复数减法的定义
{
c->real=a.real-b.real;
c->img=a.img-b.img;
}
void fft()
{
int i=0,j=0,k=0,l=0;
complex up,down,product;
double PI=atan(1.0) * 4; /*圆周率*/
initW(size_x,PI);
change(); //调用变址函数
for(i=0;i< log((double)size_x)/log(2.0) ;i++) /*一级蝶形运算 stage */
{
l=1<<i;
printf("l=%d\n",l);
for(j=0;j<size_x;j+= 2*l ) /*一组蝶形运算 group,每个group的蝶形因子乘数不同*/
{
printf("j=%d\n",j);
for(k=0;k<l;k++) /*一个蝶形运算 每个group内的蝶形运算*/
{
printf("k=%d\n",k);
mul(x[j+k+l],W[size_x*k/2/l],&product);
printf("x[%d]*W[%d]\n",j+k+l,size_x*k/2/l);
printf("size_x*k/2/l=%d\tW[size_x*k/2/l].real=%f\tW[size_x*k/2/l].img=%f\n",size_x*k/2/l,W[size_x*k/2/l].real+W[size_x*k/2/l].img);
add(x[j+k],product,&up);
printf("--首项----x[%d]\n",j+k);
printf("--首项+l----x[%d]\n",j+k+l);
/*printf("j+k=%d\n",i+k);*/
sub(x[j+k],product,&down);
x[j+k]=up;
x[j+k+l]=down;
}
}
printf( "%f%c%f%c\n", x[i].real,' ',x[i].img,' ');
}
//write_file1(x, 128);
free(W);
}
void initW(int size_x,double PI)
{
int i;
/printf(“size_x=%d\n”,size_x);/
W=(complex )malloc(sizeof(complex) size_x/2); //生成变换核
for(i=0;i<size_x/2;i++)
{
W[i].real=cos(2*PI/size_x*i); //用欧拉公式计算旋转因子
W[i].img=-1*sin(2*PI/size_x*i);
/*printf("W[%d]=%f\n",i,W[i].real);
printf("W[%d]=%f\n",i,W[i].img);*/
}
}
void change()
{
complex temp;
unsigned short i=0,j=0,k=0;
double t;
for(i=0 ;i