📄 fft.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
void tra(float *x,float *y)
{
float t;
t=(*x);
(*x)=(*y);
(*y)=t;
}
void FFT(float *xr, float *xi, int n, int inv)
{
int i,j,a,b,k,m;
int ep,arg,mt,s0,s1;
float sign,pr,pi,ph;
float *c,*s;
c=(float *)calloc(n,sizeof(float));
if(c==NULL) exit(1);
s=(float *)calloc(n,sizeof(float));
if(s==NULL) exit(1);
j=0;
if(inv==0)
{
sign=1.0;
for(i=0;i<n;i++)
{
xr[i]=xr[i]/n;
xi[i]=xi[i]/n;
}
}
else sign=-1.0;
for(i=0; i<n-1;i++)
{
if(i<j)
{
tra(&xr[i],&xr[j]);
tra(&xi[i],&xi[j]);
}
k=n/2;
while(k<=j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
ep=0;
i=n;
while(i!=1)
{
ep=ep+1;
i=i/2;
}
ph=2*M_PI/n;
for(i=0;i<n;++i)
{
s[i]=sign*sin(ph*i);
c[i]=cos(ph*i);
}
a=2;
b=1;
for(mt=1;mt<=ep;mt++)
{
s0=n/a;
s1=0;
for(k=0;k<b;k++)
{
i=k;
while(i<n)
{
arg=i+b;
if(k==0)
{
pr=xr[arg];
pi=xi[arg];
}
else
{
pr=xr[arg]*c[s1]-xi[arg]*s[s1];
pi=xr[arg]*s[s1]+xi[arg]*c[s1];
}
xr[arg]=xr[i]-pr;
xi[arg]=xi[i]-pi;
xr[i]=xr[i]+pr;
xi[i]=xi[i]+pi;
i=i+a;
}
s1=s1+s0;
}
a=2*a;
b=b*2;
}
free(c);
free(s);
}
void SignalRect(int n, int m, unsigned char *y)
{
int i;
for(i=0;i<n;i++)
y[i]=0; /* Get the initial number*/
for(i=0;i<n/4;i++)
{
y[i]=10;
y[i+n/4]=2260;
y[i+n/2]=10;
y[i+3*n/4]=226;
}
}
void SignalCos(int n, float f, unsigned char *y)
{
int i;
for(i=0;i<n;i++)
y[i]=0;
for(i=0;i<n;i++)
y[i]=cos(2*M_PI*f*i/n)*127+128;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -