⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr做fft,用浮点太慢了,怎么改成定点运算啊?.txt

📁 网上搜集的FFT算法C程序集
💻 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 + -