|
来阿莫混了很久了,发帖很少,但是在论坛里学到了很多东西,前段时间参加了ADI比赛的做了FFT的谱分析部分,和大家分享。
由于签了协议,东西不能公布。但是这个FFT绝对能用。数据结构也可以取舍,但是要注意溢出问题。
/*---------------------------1024点FFT----------------------------------*/
void FFT_Proc(void)
{
uint16_t i,j,k;
uint16_t LH,K,B;
uint16_t P;
uint8_t cout_dx;
float temp_dx;
float temp_re;
float temp_im;
float FFT_tempnum1r;
float FFT_tempnum2r;
float FFT_tempnum1i;
float FFT_tempnum2i;
LH=512;
j=LH;
for(i=1;i<1023;i++) //倒序最高位加1,逢2向次高位进位
{
if(i<j)
{
temp_dx=FFT_Re;
FFT_Re=FFT_Re[j];
FFT_Re[j]=temp_dx;
}
K=512;
while((j<K)==0)
{
j=j-K;
K=K/2;
}
j=j+K;
} //对1024点输入序列进行位
for(i=1;i<=10;i++) //第一重循环控制蝶形的级数
{
B=pow(2,(i-1));
for(j=0;j<=(B-1);j++) //控制每级的蝶形和旋转因子
{
// P=pow(2,(i-1))-1;
P=pow(2,(10-i))*j;
temp_re=cos(2*PI*P/1024);
temp_im=sin(2*PI*P/1024);
for(k=j;k<=1023;k=k+pow(2,i))
{
FFT_tempnum1r=FFT_Re[k];
FFT_tempnum2r=FFT_Re[k+B];
FFT_tempnum1i=FFT_Im[k];
FFT_tempnum2i=FFT_Im[k+B];
FFT_Re[k]=FFT_tempnum1r+FFT_tempnum2r*temp_re+FFT_tempnum2i*temp_im;
FFT_Im[k]=FFT_tempnum1i+FFT_tempnum2i*temp_re-FFT_tempnum2r*temp_im;
FFT_Re[k+B]=FFT_tempnum1r-FFT_tempnum2r*temp_re-FFT_tempnum2i*temp_im;
FFT_Im[k+B]=FFT_tempnum1i-FFT_tempnum2i*temp_re+FFT_tempnum2r*temp_im;
}
}
}
for(i=0;i<1024;i++)
Res=sqrt(FFT_Re*FFT_Re+FFT_Im*FFT_Im); //结果取模
}
发个效果图。
![](http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492097.JPG)
(原文件名:123.JPG) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|