📄 fft.c
字号:
/***********************************************************************************/
/* FFT operation Math function */
/* */
/* Author: Guo zhi qian / Gan da */
/* Ver1.0: 2003/08/25 */
/* Osc limit: No */
/* Notice: Data in: xreal[] after operation Data out: xreal[] */
/***********************************************************************************/
#include "config.h"
volatile float xreal[FFTSIZE];
volatile float ximag[FFTSIZE];
/***********************************************/
/* Funtion: Reverse the bit consequence */
/***********************************************/
uint32 Ibitr(uint32 j, uint32 nu)
{ int32 b,j1,i,j2;
j1=j;
b=0;
for(i=1;i<=nu;i++)
{ j2=j1/2;
b=b*2+(j1-2*j2);
j1=j2;
}
return(b);
}
/***********************************************/
/* Funtion: FFT operation */
/* unit n : the operation point Number */
/* uint nu: 2^X=n => X=nu */
/***********************************************/
void Fft(uint32 n, uint32 nu)
{ float treal,timag,arg,c,s;
int32 p,n2,nu1,l,i,j,k,kn2;
n2=n;
nu1=nu;
for (l=0;l<nu;l++)
{ nu1=nu1-1;
n2=n2/2;
k=0;
while(k+n2<n)
{ for(i=0;i<n2;i++)
{ j=k>>nu1;
p=Ibitr(j,nu);
arg=6.28315*p/n;
c=cos(arg);
s=sin(arg);
kn2=k+n2;
treal=xreal[kn2]*c-ximag[kn2]*s;
timag=ximag[kn2]*c+xreal[kn2]*s;
xreal[kn2]=xreal[k]-treal;
ximag[kn2]=ximag[k]-timag;
xreal[k]=xreal[k]+treal;
ximag[k]=ximag[k]+timag;
k=k+1;
}
k=k+n2;
}
}
for(k=0;k<n;k++)
{ i=Ibitr(k,nu);
if(i>k)
{ treal=xreal[k];
timag=ximag[k];
xreal[k]=xreal[i];
ximag[k]=ximag[i];
xreal[i]=treal;
ximag[i]=timag;
}
}
}
/***********************************************/
/* Funtion: Clear FFT buffer */
/***********************************************/
void Fft_buffer_clr(void)
{ uint32 i;
for(i=0;i<FFTSIZE;i++)
{ xreal[i]=0;
ximag[i]=0;
}
}
/***********************************************/
/* Funtion: Genarate a wave data to xreal[] */
/***********************************************/
void Sinwave(void)
{ uint16 i;
for (i=0;i<FFTSIZE;i++) xreal[i] = sin(2.0 * PI * (i) / FFTSIZE);
}
void Sqrwave(void)
{ uint16 i;
for (i=0;i<FFTSIZE/2;i++) xreal[i] = 0;
for (;i<FFTSIZE;i++) xreal[i] = 5;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -