資源簡(jiǎn)介
基于8051單片機(jī)的快速傅里葉變換,應(yīng)用蝶形算法,降低成本,已試過(guò)無(wú)問(wèn)題?。?img width=510 src=http://www.sh-liguang.com/pic/190952.jpg />
代碼片段和文件信息
//#include
#include??“fft.h“
void?Int_FFT(int?X[]unsigned?int?FFT_Nchar?windowtypechar?RealFlagchar?SignFlag)
{??int??DotDiv=2048/FFT_N;??//由于查的表是的角度步進(jìn)為2*pi/2048;故如果FFT點(diǎn)數(shù)少于2048時(shí)應(yīng)查的表的步進(jìn)要加倍.
???int??FFT_HFNum;????????//FFT點(diǎn)數(shù)?
???int??FFT_Level=0;????//FFT的級(jí)數(shù)?
???int??LCnt;?????????//級(jí)數(shù)的計(jì)數(shù)器?
???int??FFT_Seg;????????//當(dāng)前級(jí)FFT中的段數(shù)?
???int??SCnt;???????????//段數(shù)計(jì)數(shù)器?
???int??SeGBTF;?????????//每段包含的碟形算子的個(gè)數(shù)?
???int??ButterFlySCnt;??//每段中碟形算子序號(hào)?
???int??ButterFlyCnt; //碟形算子總的序號(hào)地址?
???int??ButterFlyCpl;???//碟形算子對(duì)的另外一個(gè)數(shù)據(jù)的地址?
???int??Ele_Inteval;????//每個(gè)碟形算子涉及的兩個(gè)元素的間隔?
//???int??RealDirCrtImagDirCrt;
?#if?MAC120
???int??Rx1buffRx2buffIx1buffIx2buff;
???int??RSxbuffISxbuff;
???char?SFRPAGBUFF;
?#else
???long??Rx1buffRx2buffIx1buffIx2buff;
???long??RSxbuffISxbuff;
???long??MACBUFMACBUF1MACBUF2MACBUF3;
?#endif
???int??Wnk;
???int??WnkInterval;//
???int??EXP2[16]={0x00010x00020x00040x00080x00100x00200x00400x0080
??????????????????????0x01000x02000x04000x08000x10000x20000x40000x8000
?????????????????????};//2的N次冪表.
?/*120MCU時(shí)的頁(yè)寄存器處理:
?*/
?#if?MAC120
?SFRPAGBUFF=SFRPAGE;
?SFRPAGE=MAC0_PAGE;
?#endif
?/*FFT前期數(shù)據(jù)準(zhǔn)備工作.
?*/
?if(SignFlag!=1)//如果為不是有符合數(shù)據(jù)需要轉(zhuǎn)化為有符合數(shù)據(jù).
? for(LCnt=0;LCnt ???{FFT_Seg=X[LCnt];
????SCnt=FFT_Seg-0x8000;
????X[LCnt]=SCnt;
???}
?FFT_N=FFT_N/2;????//用N/2點(diǎn)求是標(biāo)準(zhǔn)FFT數(shù)據(jù)量的1/2
?FFT_HFNum=FFT_N;
?FFT_Level=0;
?for(;FFT_N!=0x0001;FFT_N=FFT_N>>1)FFT_Level++;?//得到FFT級(jí)數(shù)?
?/*FFT加窗;
?*/
#if?MAC120
?MAC0CF=0x01;?//工作為乘法方式;
#endif
?switch(windowtype)
? ???{
????case?‘h‘:if(RealFlag)
??????????????{
????for(LCnt=0SCnt=0;SCnt ???????{RSxbuff=X[SCnt];
????#if?MAC120
? MAC0A=hammingwindow[LCnt];
????MAC0B=RSxbuff;
X[SCnt]=MACW1;
#else
// MACBUF1=hammingwindow[LCnt];
MACBUF=MACBUF1*RSxbuff;
MACBUF=MACBUF>>16;
X[SCnt]=MACBUF;
#endif
? SCnt++;
???}
???}
?break;
????case?‘T‘:break;
???}
?//if(Int16FullFlag)for(LCnt=0;LCnt>1;//如果輸入為16位滿刻度數(shù)據(jù)需要轉(zhuǎn)換為15位以防溢出.
?/*FFT碟形運(yùn)算:
?*/ /*
#if?MAC120
#else
?Rx1buff=0;
?Rx2buff=0;
?RSxbuff=0;
?for(LCnt=0;LCnt ? {Rx1buff=X[LCnt];
?RSxbuff=?RSxbuff+Rx1buff;
}
?
#endif*/
?/*****遍歷所有級(jí)***********/
?for(LCnt=0;LCnt ? {FFT_Seg=EXP2[LCnt];?????//得到本級(jí)FFT需要計(jì)算的段數(shù)?
?SeGBTF=EXP2[FFT_Level-LCnt-1];//得到本級(jí)FFT中每段的算子個(gè)數(shù)?
?Ele_Inteval=EXP2[FFT_Level-LCnt];//得到每個(gè)碟形算子涉及的兩個(gè)元素的距離*2?
?ButterFlyCnt=0;???//碟形算子序號(hào)復(fù)位
????#if?MAC120
?MAC0CF=0x01;??????//工作于乘法方式不是乘加方式?
?MAC0A=FFT_Seg;
?MAC0B=2;
?MAC0A=DotDiv;
?MAC0B=MACW0;
?WnkInterval=MACW0;//得到旋轉(zhuǎn)因子的旋轉(zhuǎn)間隔.WnkInterval=2*FFT_Seg*DotDiv;2是由于實(shí)數(shù)FFT時(shí)將N個(gè)點(diǎn)的FFT減少為N/2個(gè)點(diǎn)的FFT
?? ???//當(dāng)FFT點(diǎn)數(shù)少于2048時(shí)步進(jìn)為2048時(shí)的DotDiv(2048/FFT_N)倍.
?MAC0CF=0x00; ???????????????????//工作于乘加方式
#else
?WnkInterval=FFT_Seg*DotDiv;
?WnkInterval=WnkInterval<<1;
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
????I.A....??????9606??2007-09-01?22:57??FFT.c
-----------?---------??----------?-----??----
?????????????????9606????????????????????1
- 上一篇:攝影測(cè)量連續(xù)法相對(duì)定向
- 下一篇:圖像分割+GUI
評(píng)論
共有 條評(píng)論