?? avr做fft,用浮點太慢了,怎么改成定點運算啊?.txt
字號:
float dataR[64]={127,115,102,90,78,67,56,46,37,29,21,15,10,
5,2,1,0,1,2,5,10,15,21,29,37,46,56,67,78,90,102,114,127,139,
152,164,175,187,197,207,217,225,232,239,244,248,252,253,254,
253,252,249,244,239,233,225,217,208,198,187,176,164,152,140};
float dataI[64]={0};
float p=0;
float sin_tab[64]={0,0.0980,0.1951,0.2903,0.3827,0.4714,0.5556,0.6344,0.7071,0.7730,0.8315,0.8819,0.9239,0.9569,0.9808,0.9952,1.0000,0.9952,0.9808,0.9569,0.9239,0.8819,0.8315,0.7730,0.7071,0.6344,0.5556,0.4714,0.3827,0.2903,0.1951,0.0980,0.0000,-0.0980,-0.1951,-0.2903,-0.3827,-0.4714,-0.5556,-0.6344,-0.7071,-0.7730,-0.8315,-0.8819,-0.9239,-0.9569,-0.9808,-0.9952,-1.0000,-0.9952,-0.9808,-0.9569,-0.9239,-0.8819,-0.8315,-0.7730,-0.7071,-0.6344,-0.5556,-0.4714,-0.3827,-0.2903,-0.1951,-0.0980};
float cos_tab[64]={1.0000,0.9952,0.9808,0.9569,0.9239,0.8819,0.8315,0.7730,0.7071,0.6344,0.5556,0.4714,0.3827,0.2903,0.1951,0.0980,0.0000,-0.0980,-0.1951,-0.2903,-0.3827,-0.4714,-0.5556,-0.6344,-0.7071,-0.7730,-0.8315,-0.8819,-0.9239,-0.9569,-0.9808,-0.9952,-1.0000,-0.9952,-0.9808,-0.9569,-0.9239,-0.8819,-0.8315,-0.7730,-0.7071,-0.6344,-0.5556,-0.4714,-0.3827,-0.2903,-0.1951,-0.0980,-0.0000,0.0980,0.1951,0.2903,0.3827,0.4714,0.5556,0.6344,0.7071,0.7730,0.8315,0.8819,0.9239,0.9569,0.9808,0.9952};
void FFT(void)
{
unsigned char i=0;
unsigned char q=0;
int x0,x1,x2,x3,x4,x5;
int L,j,k,b,p;
int xx; /*my added*/
long TR,TI,temp;
/********** 逆序部分************/
for(q=0;q<64;q++)
{ x0=x1=x2=x3=x4=x5=0;
x0=q&0x01; x1=(q/2)&0x01;x2=(q/4)&0x01; x3=(q/8)&0x01;x4=(q/16)&0x01;x5=(q/32)&0x01;
xx=x0*32+x1*16+x2*8+x3*4+x4*2+x5;
dataI[xx]=dataR[i];
i++;
}
i=0;
for(q=0;q<64;q++)
{ dataR[i]=dataI[i];
dataI[i]=0;
i++;
}
/************** 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=2^(6-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) */
i=0;
for (q=0;q<127;q++)
{
d1[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
}
i=0;
}
如果用定點運算,應該怎么寫啊? 望高手幫忙
小數乘以65536整數化,計算完乘法后取舍去低16位即可。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -