#include <reg51.h>
#include "stdio.h"
#include <math.h>      //調用源()文件
struct compx          /*定義一個複數結構*/
{float real;float imag;
};
struct compx s[ 256 ];      //FFT輸入輸出均從是s[1]開始存入
struct compx EE(struct compx,struct compx); //定義複數相乘結構
void FFT(struct compx xin,int N);  /*定義FFT函數*/
struct compx EE(struct compx a1,struct compx b2) //兩複數相乘的程序
{struct compx b3;  //b3保存兩複數間的結果
b3.al*b2.imag+a1.al;
return(b3);    /*返回結果*/
}
void FFT(struct compx xin,int N)  /*FFT函數體*/
{int f,m,nv2,nm1,i,k,j=1,l;  /*定義變量*/
单片机printf函数struct compx v,w,t;    /*定義結構變量*/
nv2=N/2;          /*最高位值的權值*/
f=N;                  /*f為中間變量*/
for(m=1;(f=f/2)!=1;m++){;}            /*求級數m*/
nm1=N-1;                              /*nm1為數組長度*/
for(i=1;i<=nm1;i++)                  /*倒序*/
{if(i<j) {t=xin[j];xin[j]=xin;xin=t;}        /*i<j則換位*/
k=nv2;                      /*k為倒序中相應位置的權值*/
while(k<j) {j=j-k;k=k/2;}            /*k<j時最高為變為0*/
j=j+k;                  /* j為數組中的位數,是一個十進制數*/
}
{int le,lei,ip;      //變量初始化,le為序列長度
float pi;
for(l=1;l<=m;l++)                /*l控制級數*/
{le=pow(2,l);                  /*le等於2的l次方*/
lei=le/2;                  /*蝶形兩節點間的距離*/
pi=3.14159265;
w.imag=-sin(pi/lei);
for(j=1;j<=lei;j++)      //外循環控制蝶行運算的級數
{for(i=j;i<=N;i=i+le)      //內循環控制每級間的運算次數
{ip=i+lei;                /*蝶形運算的下一個節點*/
t=EE(xin[ ip ],v);            /*第一個旋轉因子*/
xin[ ip ].real=xin[ i ].al;  /*蝶形計算*/
xin[ ip ].imag=xin[ i ].imag-t.imag;
xin[ i ].real=xin[ i ].al;
xin[ i ].imag=xin[ i ].imag+t.imag;
}
v=EE(v,w); //調用EE複數相乘程序,結果給下次的循環
}
}
}
}
main()                    /*定義主函數*/
{int N,i;    //變量初始化,N為總點數,i為每點數
printf("shu ru N de ge shu N=");  /*提示輸入*/
scanf("%d",&N);                  /*輸入N*/
for(i=1;i<=N;i++)              /*輸入*/
{printf("di %d ge shu real=",i);
getchar();
scanf("%f",&s[ i ].real);
getchar();
printf("\n");
printf("di %d ge shu imag=",i);
scanf("%f",&s[ i ].imag);
printf("\n");
}
FFT(s,N);              /*調用FFt*/
for(i=1;i<=N;i++)                /*輸出*/
{printf("%f",s[ i ].real);
printf(" + ");
printf("%f",s[ i ].imag);
prin
tf("j");
printf("\n");
}
}