微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 求计算FFT函数!

求计算FFT函数!

时间:10-02 整理:3721RD 点击:
想通过快速的fft变换计算出的结果,再来求有效值,
不知道是怎么操作,我用的是2812。
由于新手上路,希望大家多多指导!

FFT可以在TI免费下载到代码,有效值就用程序自己来实现了

在网络找了个程序,然后自己修改了一下,运行后的根据得到的数据看了波形,我都不知道对不对,把代码发上来,高手们多多拍砖?!

const float cos_tab[0x20]={
1,0.980785281,0.923879535,0.923879535,0.707106791,0.555570247,0.382683451,0.195090345,
0,-0.195090292,-0.382683401,-0.555570202,-0.707106753,-0.831469588,-0.923879515,-0.980785271,
-1,-0.980785292,-0.923879556,-0.831469648,-0.707106829,-0.555570292,-0.3826835,-0.195090398,
0,0.19509024,0.382683352,0.555570158,0.707106715,0.831469558,0.923879494,0.98078526};
const float sin_tab[0x20]={
0,0.195090319,0.382683426,0.555570225,0.707106772,0.831469603,0.923879525,0.980785276,
1,0.980785286,0.923879545,0.831469633,0.70710681,0.555570269,0.382683476,0.195090371,
0,-0.195090266,-0.382683377,-0.55557018,-0.707106734,-0.831469573,-0.923879504,-0.980785265,
-1,-0.980785297,-0.923879566,-0.831469663,-0.707106848,-0.555570314,-0.382683525,-0.195090424};

/* 采样来的数据放在dataR[ ]数组中,运算前dataI[ ]数组初始化为0 */
void FFT(float dataR[],float dataI[])
{
int x0,x1,x2,x3,x4,x5,xx;
int L,i,j,k,b,p;
float TR,TI,temp;
/********** following code invert sequence ************/
for(i=0;i<32;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;
xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;
dataI[xx]=dataR;
}
for(i=0;i<32;i++)
{
dataR=dataI;
dataI=0;
}
/************** following code FFT *******************/
for(L=1;L<=5;L++) /* for(1) */
{
b=1; i=L-1;
while(i>0)
{
b=b*2; /* b= 2^(L-1) */
i--;
}
for(j=0;j<=b-1;j++) /* for (2) */
{
p=1;
i=5-L;
while(i>0) /* p=pow(2,5-L)*j; */
{
p=p*2;
i--;
}
p=p*j;
for(k=j;k<32;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) */
} /* END FFT */

我在ti上下载了fftr128代码,修改编译后,出现了下面的问题:

symbol in file
--------- ----------------
_CFFT32_calc F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
_RFFT32_split F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
_RFFT32_brev F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
_RFFT32_acq F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
_RFFT32_mag F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
_CFFT32_init F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
_RFFT32_win F:\\projct\\lubo\\program\\test7\\Debug\\Main.obj
>> error: symbol referencing errors - \'./Debug/test4.out\' not built

函数calc , split……没有定义!其中有个头文件无法找到:stb.h!是不是这些函数在这个头文件中,还是在ccs编译器中?

添加库

后来,我发现了那几个文件
_CFFT32_calc
_RFFT32_split
_RFFT32_brev
_RFFT32_acq
_RFFT32_mag
_CFFT32_init
_RFFT32_win
他们都是以汇编文件的形式出现的,不知道该怎么添加!
请多多指点! 谢谢!

首先,在你的主程序中要添加DSPLIB.H,在编译选项(BUILD OPTION)中要添加DSPLIB.H的路径,这样就OK了

顺便问个问题,我用的5509,为什么没有看到CFFT32()的库函数?我也想用32位的库函数,16位的精度损失太大了。我先用CFFT()求出结果后,再用此结果做CIFFT(),但由于库函数都是16位的,所以我不得不舍弃低位,造成了精度损失,应该怎么解决,能找到CFFT32()的库函数吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top