共2条
1/1 1 跳转至页
FFT64 单片机中用的FFT64点算法

问
改后
void FFT(float dataR[],float dataI[])
{
U16 x0,x1,x2,x3,x4,x5,x6,xx;
U16 L,j,k,b,p;
float TR,TI,temp,w[32];
float sin_tab[64],cos_tab[64];
U8 i;
for(i=0;i<64;i++)
{
float t =PI2*i/64;
sin_tab[i]=sin(t);
cos_tab[i]=cos(t);
}
/********** following code invert sequence ************/
for(i=0;i<64;i++)
{
x0=x1=x2=x3=x4=x5=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01;
// x6=(i/64)&0x01;
xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;
dataI[xx]=dataR[i];
}
for(i=0;i<64;i++)
{ dataR[i]=dataI[i]; dataI[i]=0; }
/************** following code FFT *******************/
for(L=1;L<=6;L++)
{
/* for(1) */
b=1; i=L-1;
while(i>0) {b=b*2; i--;} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{
p=1; i=6-L;
while(i>0) /* p=pow(2,7-L)*j; */
{p=p*2; i--;}
p=p*j;
for(k=j;k<64;k=k+2*b) /* for (3) */
{
TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for(i=0;i<32;i++)
{ /* 只需要32次以下的谐波进行分析 */
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
w[i]=w[i]/64;
}
w[0]=w[0]/2;
return (w);
}
这个程序我现在测试下来,所有的数据与源送过来的值符合,而且没有规律,我采样是用锁相环倍频到3.2kHz的,在任意时刻采64点,送到fft计算,请问这样对吗?请gg们帮帮忙!zzx7969@sina.com
答 1: 有人知道我程序错在哪儿了吗? 答 2: 我正想学习一下FFT!目前还没有任何资料,先帮你顶顶还能帮忙吧你受上的资料给一份给我吗?谢谢!
lhkjg@163.com 答 3: 建议你还是看一下数字信号处理教程(第二版)这种贴子发到这是得不到实质上的帮助的。
建议你还是看一下数字信号处理教程(第二版) 答 4: 这程序是你从网上下的吧?这程序是你从网上下的吧?
变量的定义就有问题或者不是很好,
这种东西就不要指望能够从网上得到了。
还是自己动手看信号处理吧,要不就外包。
答 5: 本来是128点的吧?字节改数字肯定有问题的.
我也刚好用了这个程序,128点的. 不过改成定点数了 答 6: fft我在VC6.0试了一下此程序,可能是正常的,我们可讨论,不正常是什么情况.
void FFT(float dataR[],float dataI[])
{
U16 x0,x1,x2,x3,x4,x5,x6,xx;
U16 L,j,k,b,p;
float TR,TI,temp,w[32];
float sin_tab[64],cos_tab[64];
U8 i;
for(i=0;i<64;i++)
{
float t =PI2*i/64;
sin_tab[i]=sin(t);
cos_tab[i]=cos(t);
}
/********** following code invert sequence ************/
for(i=0;i<64;i++)
{
x0=x1=x2=x3=x4=x5=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01;
// x6=(i/64)&0x01;
xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;
dataI[xx]=dataR[i];
}
for(i=0;i<64;i++)
{ dataR[i]=dataI[i]; dataI[i]=0; }
/************** following code FFT *******************/
for(L=1;L<=6;L++)
{
/* for(1) */
b=1; i=L-1;
while(i>0) {b=b*2; i--;} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{
p=1; i=6-L;
while(i>0) /* p=pow(2,7-L)*j; */
{p=p*2; i--;}
p=p*j;
for(k=j;k<64;k=k+2*b) /* for (3) */
{
TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for(i=0;i<32;i++)
{ /* 只需要32次以下的谐波进行分析 */
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
w[i]=w[i]/64;
}
w[0]=w[0]/2;
return (w);
}
这个程序我现在测试下来,所有的数据与源送过来的值符合,而且没有规律,我采样是用锁相环倍频到3.2kHz的,在任意时刻采64点,送到fft计算,请问这样对吗?请gg们帮帮忙!zzx7969@sina.com
答 1: 有人知道我程序错在哪儿了吗? 答 2: 我正想学习一下FFT!目前还没有任何资料,先帮你顶顶还能帮忙吧你受上的资料给一份给我吗?谢谢!
lhkjg@163.com 答 3: 建议你还是看一下数字信号处理教程(第二版)这种贴子发到这是得不到实质上的帮助的。
建议你还是看一下数字信号处理教程(第二版) 答 4: 这程序是你从网上下的吧?这程序是你从网上下的吧?
变量的定义就有问题或者不是很好,
这种东西就不要指望能够从网上得到了。
还是自己动手看信号处理吧,要不就外包。
答 5: 本来是128点的吧?字节改数字肯定有问题的.
我也刚好用了这个程序,128点的. 不过改成定点数了 答 6: fft我在VC6.0试了一下此程序,可能是正常的,我们可讨论,不正常是什么情况.
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |