FFT流程图.docx
《FFT流程图.docx》由会员分享,可在线阅读,更多相关《FFT流程图.docx(15页珍藏版)》请在冰豆网上搜索。
FFT流程图
voiddelay(inti)//延时bb速度控制
{
charb;
while(i--)
{
b=bb;
while(b--);
}
}
AutoFlowChart:
Au
website:
w
email:
suppoN
Y
张辉
email:
supp
website:
Y
voidFFT()
{
intxdatai,bb,j,k,p;
intmax,a[8];
intxdataTR,TI,temp;
for(i=0;i<64;i++)
{
Real[BRTable[i]]=STC_ADC();
Image[i]=0;
}
for(i=1;i<=6;i++)
{bb=1;
bb<<=(i-1);
for(j=0;j<=bb-1;j++)
{p=1;
p<<=(6-i);
p=p*j;
for(k=j;k<64;k=k+2*bb)
for(k=j;k<64;k=k+2*bb)
{
if(amenu==1)//1频段列显示
{
sendbyte1(~table1[num*8+0],~table1[num*8+1],~table1[num*8+2],~table1[num*8+3]);
sendbyte1(~table1[num*8+4],~table1[num*8+5],~table1[num*8+6],~table1[num*8+7]);
ST_CP=1;
ST_CP=0;
}
elseif(amenu==2)//2频段列显示
{
sendbyte1(~table2[num*8+0],~table2[num*8+1],~table2[num*8+2],~table2[num*8+3]);
sendbyte1(~table2[num*8+4],~table2[num*8+5],~table2[num*8+6],~table2[num*8+7]);
ST_CP=1;
ST_CP=0;
}
elseif(amenu==3)//3频段列显示
{
sendbyte1(~table3[num*8+0],~table3[num*8+1],~table3[num*8+2],~table3[num*8+3]);
sendbyte1(~table3[num*8+4],~table3[num*8+5],~table3[num*8+6],~table3[num*8+7]);
ST_CP=1;
ST_CP=0;
}
elseif(amenu==4)//4频段列显示
{
sendbyte1(~table4[num*8+0],~table4[num*8+1],~table4[num*8+2],~table4[num*8+3]);
sendbyte1(~table4[num*8+4],~table4[num*8+5],~table4[num*8+6],~table4[num*8+7]);
ST_CP=1;
ST_CP=0;
}
elseif(amenu==5)//5频段列显示
{
sendbyte1(~table5[num*8+0],~table5[num*8+1],~table5[num*8+2],~table5[num*8+3]);
sendbyte1(~table5[num*8+4],~table5[num*8+5],~table5[num*8+6],~table5[num*8+7]);
ST_CP=1;
ST_CP=0;
}
elseif(amenu==6)//6频段列显示
{
sendbyte1(~table6[num*8+7],~table6[num*8+6],~table6[num*8+5],~table6[num*8+4]);
sendbyte1(~table6[num*8+3],~table6[num*8+2],~table6[num*8+1],~table6[num*8+0]);
ST_CP=1;
ST_CP=0;
}
elseif(amenu==7)//7频段列显示
{
sendbyte1(~table7[num*8+7],~table7[num*8+6],~table7[num*8+5],~table7[num*8+4]);
sendbyte1(~table7[num*8+3],~table7[num*8+2],~table7[num*8+1],~table7[num*8+0]);
ST_CP=1;
ST_CP=0;
}
else//8频段列显示
{
sendbyte1(~table8[num*8+7],~table8[num*8+6],~table8[num*8+5],~table8[num*8+4]);
sendbyte1(~table8[num*8+3],~table8[num*8+2],~table8[num*8+1],~table8[num*8+0]);
ST_CP=1;
ST_CP=0;
}
TR=Real[k];
TI=Image[k];
temp=Real[k+bb];
Real[k]=Real[k]+((Real[k+bb]*cos_tabb[p])>>7)+((Image[k+bb]*sin_tabb[p])>>7);
Image[k]=Image[k]-((Real[k+bb]*sin_tabb[p])>>7)+((Image[k+bb]*cos_tabb[p])>>7);
Real[k+bb]=TR-((Real[k+bb]*cos_tabb[p])>>7)-((Image[k+bb]*sin_tabb[p])>>7);
Image[k+bb]=TI+((temp*sin_tabb[p])>>7)-((Image[k+bb]*cos_tabb[p])>>7);
Real[k]>>=1;
Image[k]>>=1;
Real[k+bb]>>=1;
Image[k+bb]>>=1;
}//for(k=j;k<64;k=k+2*bb)
}//for(j=0;j<=bb-1;j++)
}//for(i=1;i<=6;i++)
max=0;
for(i=0;i<6;i++)
{
a[i]=sqrt_16((Real[i+1]*Real[i+1]+Image[i+1]*Image[i+1])>>1);
if(a[i]<1)
a[i]=0;
else
a[i]-=1;
if(maxmax=a[i];
}
if(max>8)
{
max/=8;
for(i=0;i<8;i++)
a[i]/=max;
}
for(i=0;i<9;i++)
c[i]=a[i];
}
AutoFlowChar
voidprint1()interrupt3//定时器1中断函数
{
TR1=0;//关闭定时器1
TH1=(65536-2500)/256;//定时time=F63C;104.1us
TL1=(65536-2500)%256;
if(num>=(amenu-1))
num=0;
else
num++;
if(b[num]{b[num]++;}
if(b[num]>c[num])//确定频谱高度显示
{b[num]--;}
if(b[num]>8)//确定频谱高度显示
{b[num]=8;}
switch(yp)//频谱显示方式显示切换
{
case1:
send_data2(~tuku2[b[num]]);
if(amenu<=2){}
elsedelay(50);
break;
case2:
send_data2(~tuku1[b[num]]);
if(amenu<=2){}
elsedelay(50);
break;
case3:
send_data2(~tuku3[b[num]]);
if(amenu<=2){}
elsedelay(50);
default:
break;
}
TR1=1;//启动定时器1
}
voidADC_Finish()interrupt5//AD中断函数
{
yinpin++;
if(yinpin==20000)//变量yinpin加到20000切换频段显示
{
yinpin=0;
yp++;
if(yp==4)
yp=1;
amenu++;//amenu变量切换频段显示方式
if(amenu==9)amenu=1;
}
if(ADC_CONTR&0x10)//判断ADC-FLGA位是否为1,为1表明A/D已转换完成。
delay
(1);
}