📄 1 fft.c
字号:
//*********************************************************
// 快速付里叶变换
//*********************************************************
#include<reg51.h>
#include <math.h>
#define N 128
#define pi 3.14159
struct complex
{
float real;
float image;
};
struct complex xdata s[N];
struct complex mul(struct complex,struct complex); /*定义复数乘*/
void FFT(struct complex *s);
main()
{
unsigned char data i;
for(i=0;i<N;i++)
{
s[i].real=i;
s[i].image=0;
}
FFT(s);
while(1);
}
struct complex mul(struct complex x,struct complex y)
{
struct complex z;
z.real=x.real*y.real-x.image*y.image;
z.image=x.real*y.image+x.image*y.real;
return (z);
}
void FFT(struct complex *s)
{
unsigned char data nv2,nm1,k,level,i,j=0;
unsigned char ip,le,lei;
struct complex data v,w,t;
nv2=N>>1;
nm1=N-1;
for(i=0;i<nm1;i++) /*变址运算*/
{
if(i<j)
{
t=s[j];
s[j]=s[i];
s[i]=t;
}
k=nv2;
while(k<=j)
{
j-=k;
k=k>>1;
}
j+=k;
}
le=1;
for(level=1;level<=7;level++)
{
lei=le;
le<<=1;
v.real=1.0;
v.image=0.0;
w.real=cos(pi/lei);
w.image=-sin(pi/lei);
for(j=0;j<lei;j++)
{
for(i=j;i<N;i+=le)
{
ip=i+lei;
t=mul(s[ip],v);
s[ip].real=s[i].real-t.real;
s[ip].image=s[i].image-t.image;
s[i].real+=t.real;
s[i].image+=t.image;
}
v=mul(v,w);
}
}
for(i=0;i<N;i++)
s[i].real=sqrt(s[i].real*s[i].real+s[i].image*s[i].image)/100; //幅值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -