- //完成顯示數據的轉換工作,包括定點下落速度控制以及定點更新定格
- // 對fft數據進行處理,得到各個頻率短的電壓增幅值
- //++++++++++++++++++++++++++++++++++++++//
- //復數乘法
- void ee(struct compx b1,uchar data b2)
- {
- temp.real=b1.real*iw[2*b2]-b1.imag*iw[2*b2+1];
- temp.imag=b1.real*iw[2*b2+1]+b1.imag*iw[2*b2];
- }
- //++++++++++++++++++++++++++++++++++++++//
- //乘方函數
- uint mypow(uchar data nbottom,uchar data ntop)
- {
- uint data result=1;
- uchar data t;
- for(t=0;t<ntop;t++)result*=nbottom;
- return result;
- }
- //++++++++++++++++++++++++++++++++++++++//
- //快速傅里葉變換
- void fft(struct compx *xin,uchar data N)
- {
- uchar data fftnum,i,j,k,l,m,n,disbuff,dispos,dissec;
- data struct compx t;
- fftnum=N; //傅里葉變換點數
- for(m=1;(fftnum=fftnum/2)!=1;m++);//求得M的值
- for(k=0;k<=N-1;k++) //碼位倒置
- {
- n=k;
- j=0;
- for(i=m;i>0;i--) //倒置
- {
- j=j+((n%2)<<(i-1));
- n=n/2;
- }
- if(k<j){t=xin[1+j];xin[1+j]=xin[1+k];xin[1+k]=t;}//交換數據
- }
- for(l=1;l<=m;l++) //FFT運算
- {
- disbuff=mypow(2,l); //求碟間距離
- dispos=disbuff/2; //求碟間兩點之間距離
- for(j=1;j<=dispos;j++)
- for(i=j;i<N;i=i+disbuff) //遍歷M級所有碟形
- {
- dissec=i+dispos; //求第二點位置
- ee(xin[dissec],(uint)(j-1)*(uint)N/disbuff);//復數乘法
- t=temp;
- xin[dissec].real=xin[i].real-t.real;
- xin[dissec].imag=xin[i].imag-t.imag;
- xin[i].real=xin[i].real+t.real;
- xin[i].imag=xin[i].imag+t.imag;
- }
- }
- }
-
- void processfft(void)
- {
- uchar data pt=0,tmp;
- for(pt=1;pt<65;pt++)
- {
- dd[pt].imag=0; //清零需部
- }
- fft(dd,64); //對當前數據進行傅里葉變換
-
- for(pt=1;pt<65;pt++)
- {
- dd[pt].real=sqrt(dd[pt].real*dd[pt].real+dd[pt].imag*dd[pt].imag);//取均方根
- }
- if(Menu==1)
- {
- for(pt=2;pt<34;pt+=2)
- {
- for(tmp=(dd[pt].real/32)+1,LEDBuf[pt]=0xFF;tmp>=1;tmp--)//tmp>1;不保留最低位那一行長亮
- {
- LEDBuf[pt]<<=1;
- }
- LEDBuf[pt]=~(LEDBuf[pt]);
-
- }
- }
- else if(Menu==2)
- {
- //ÏÂÂä¸D
- for(pt=2;pt<34;pt+=2)
- {
- tmp=(dd[pt].real/32)+1;
- if(refreshflag[pt]<tmp) //刷新數據取較大高度值 存儲顯示
- {
- for(LEDBuf[pt]=0xFF;tmp>1;tmp--)//tmp>1;不保留 最低位那一行長亮;{}一次也不執行
- {
- LEDBuf[pt]<<=1;
- }
- refreshflag[pt]=(dd[pt].real/32)+1;
- }
- else
- {
- if(refreshflag[pt]>1)refreshflag[pt]--; //定點下落速度控制 改變值可以改變下落速度
- for(LEDBuf[pt]=0xFF,tmp=refreshflag[pt];tmp>1;tmp--) //tmp>1;不保留 最低位 那一行長亮
- {
- LEDBuf[pt]<<=1;
- }
- }
- }
- }
- else if(Menu==0)
- {
- //ÏÂÂä¸DÆμÆ×
- for(pt=2;pt<34;pt+=2)
- {
- tmp=(dd[pt].real/32)+1;
- if(refreshflag[pt]<tmp) //刷新數據取較大高度值 存儲顯示
- {
- for(LEDBuf[pt]=0xFF;tmp>=1;tmp--)//tmp>1;不保留 最低位那一行長亮;{}一次也不執行
- {
- LEDBuf[pt]<<=1;
- }
- refreshflag[pt]=(dd[pt].real/32)+1;
- }
- else
- {
- if(refreshflag[pt]>1)refreshflag[pt]--;
- for(LEDBuf[pt]=0xFF,tmp=refreshflag[pt];tmp>=1;tmp--)
- {
- LEDBuf[pt]<<=1;
- }
- }
- LEDBuf[pt]=~(LEDBuf[pt]);
- }
- }
- }
復制代碼 |