📄 fft.c
字号:
#include <reg51.h>
#include "stdio.h"
#include <math.h> //调用源(头)文件
struct compx /*定义一个复数结构*/
{float real;float imag;
};
struct compx s[ 257 ]; //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.real=a1.real*b2.real-a1.imag*b2.imag; //两复数间的运算
b3.imag=a1.real*b2.imag+a1.imag*b2.real;
return(b3); /*返回结果*/
}
//-------------------------------------------
void FFT(struct compx xin,int N) /*FFT函数体*/
{int f,m,nv2,nm1,i,k,j=1,l; /*定义变量*/
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[ i ];xin[ i ] =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;
v.real=1.0; // 此次的v运于复数的初始化 v.imag=0.0;
w.real=cos(pi/lei); /*旋转因子*/
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 ].real-t.real; /*蝶形计算*/
xin[ ip ].imag=xin[ i ].imag-t.imag;
xin[ i ].real=xin[ i ].real+t.real;
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);
printf("j");
printf("\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -