输入参数:*xin 复数结构体组的首地址指针,struct 型
*****************************************************************/
void FFT(struct compx *xin)
{
int f,m,nv2,nm1,i,k,l,j=0;
struct compx u,w,t;
nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法
nm1=FFT_N-1;
for(i=0;i<nm1;i++)
{
if(i<j) //如果 i<j,即进行变址
{
t=xin[j];
xin[j]=xin[i];
xin[i]=t;
}
k=nv2; //求 j 的下一个倒位序
while(k<=j) //如果 k<=j,表示 j 的最高位为 1
{
j=j-k; //把最高位变成 0
k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为 0
}
j=j+k; //把 0 改为 1
}
{
int le,lei,ip; //FFT 运算核,使用蝶形运算完成 FFT 运算
f=FFT_N;
for(l=1;(f=f/2)!=1;l++) //计算 l 的值,即计算蝶形级数
;
for(m=1;m<=l;m++) // 控制蝶形结级数
{ //m 表示第 m 级蝶形,l 为蝶形级总数 l=log(2)N
le=2<<(m-1); //le 蝶形结距离,即第 m 级蝶形的蝶形结相距 le 点
lei=le/2; //同一蝶形结中参加运算的两点的距离
u.real=1.0; //u 为蝶形结运算系数,初始值为 1
u.imag=0.0;
w.real=cos(PI/lei); //w 为系数商,即当前系数与前一个系数的商
w.imag=-sin(PI/lei);
for(j=0;j<=lei-1;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结
{
for(i=j;i<=FFT_N-1;i=i+le) //控制同一蝶形结运算,即计算系数相同蝶形结
{
ip=i+lei; //i,ip 分别表示参加蝶形运算的两个节点