基于DSP的FFT實現(xiàn)設(shè)計報告_第1頁
基于DSP的FFT實現(xiàn)設(shè)計報告_第2頁
基于DSP的FFT實現(xiàn)設(shè)計報告_第3頁
基于DSP的FFT實現(xiàn)設(shè)計報告_第4頁
基于DSP的FFT實現(xiàn)設(shè)計報告_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、.DSP課程設(shè)計 姓名: 學(xué)號: 日期:一、實驗?zāi)康?. 加深對DFT算法原理和基本性質(zhì)的理解;2. 熟悉FFT的算法原理和FFT子程序的算法流程和應(yīng)用;3. 學(xué)習(xí)用FFT對連續(xù)信號和時域信號進(jìn)行頻譜分析的方法;4. 學(xué)習(xí)DSP中FFT的設(shè)計和編程思想;5. 學(xué)習(xí)使用CCS的波形觀察器觀察波形和頻譜情況;二、實驗內(nèi)容 用DSP匯編語言及C語言進(jìn)行編程,實現(xiàn)FFT運(yùn)算、對輸入信號進(jìn)行頻譜分析。三、實驗原理快速傅里葉變換FFT旋轉(zhuǎn)因子WN 有如下的特性。對稱性:WNk+N/2=-WNk (2)周期性:WNn(N-k)=WNk(N-n)=WN-nk (3)利用這些特性,既可以使DFT中有些項合并,減

2、少了乘法積項,又可以將長序列的DFT分解成幾個短序列的DFT。FFT就是利用了旋轉(zhuǎn)因子的對稱性和周期性來減少運(yùn)算量的。FFT的算法是將長序列的DFT分解成短序列的DFT。例如:N為偶數(shù)時,先將N點(diǎn)的DFT分解為兩個N/2點(diǎn)的DFT,使復(fù)數(shù)乘法減少一半:再將每個N/2點(diǎn)的DFT分解成N/4點(diǎn)的DFT,使復(fù)數(shù)乘又減少一半,繼續(xù)進(jìn)行分解可以大大減少計算量。最小變換的點(diǎn)數(shù)稱為基數(shù),對于基數(shù)為2的FFT算法,它的最小變換是2點(diǎn)DFT。一般而言,F(xiàn)FT算法分為按時間抽取的FFT(DIT FFT)和按頻率抽取的FFT(DIF FFT)兩大類。DIF FFT算法是在時域內(nèi)將每一級輸入序列依次按奇偶分成2個短序

3、列進(jìn)行計算。而DIF FFT算法是在頻域內(nèi)將每一級輸入序列依次奇偶分成2個短序列進(jìn)行計算。兩者的區(qū)別是旋轉(zhuǎn)因子出現(xiàn)的位置不同,得算法是一樣的。在DIF FFT算法中,旋轉(zhuǎn)因子WN出現(xiàn)在輸入端,而在DIF FFT算法中它出現(xiàn)在輸入端。假定序列x(n)的點(diǎn)數(shù)N是2的冪,按照DIF FFT算法可將其分為偶序列和奇序列。偶序列:x(2r)=x1(r)奇序列:x(2r+1)=x2(r)其中:r=0,1,2,N/2-1,則x(n)的DFT表示為 式中,X1 (k)和X2(k)分別為X1(r)和X2(r)的N/2的DFT。 由于對稱性,WNk+N/2=-WNk。因此,N點(diǎn)DFT可分為兩部分:前半部分:x(k

4、)=x1(k)+WkNx2(k) (4)后半部分:x(N/2+k)=x1(k)-WkNx2(k) k=0,1,N/2-1 (5)從式(4)和式(5)可以看出,只要求出0N/2-1區(qū)間x1(k)和x2(k)的值,就可求出0N-1區(qū)間x(k)的N點(diǎn)值。以同樣的方式進(jìn)行抽取,可以求得N/4點(diǎn)的DFT,重復(fù)抽取過程,就可以使N點(diǎn)的DFT用上組2點(diǎn)的DFT來計算,這樣就可以大減少運(yùn)算量?;? DIF FFT的蝶形運(yùn)算如圖3.1所示。設(shè)蝶形輸入為x1(k)和x2(k),輸出為x(k)和x(N/2+K),則有 x(k)=x1(k)+WkNx2(k) (6)x(N/2+k)=x1(k)-WkNx2(k) (7

5、)在基數(shù)為2的FFT中,設(shè)N=2M,共有M級運(yùn)算,每級有N/2個2點(diǎn)FFT蝶形運(yùn)算,因此,N點(diǎn)FFT總共有MN/2個蝶形運(yùn)算。 圖3.1 基2 DIF FFT的蝶形運(yùn)算例如:基數(shù)為2的FFT,當(dāng)N=8時,共需要3級,12個基2 DIT FFT的蝶形運(yùn)算。其信號流程如圖3.2所示。x(0) x(0) WN0x(4) x(1) -1 WN0x(2) x(2) -1 WN0 WN2x(6) x(3) -1 -1 WN0x(1) x(4) -1 WN0 WN1x(5) x(5) -1 -1 WN0 WN2x(3) x(6) -1 -1 WN0 WN2 WN3x(7) x(7) -1 -1 -1圖3.2

6、 8點(diǎn)基2 DIF FFT蝶形運(yùn)算從圖(b)可以看出,輸入是經(jīng)過比特反轉(zhuǎn)的倒位序列,稱為位碼倒置,其排列順序為x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7),輸出是按自然順序排列,其順序為x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7).程序設(shè)計順序DSP初始化串口設(shè)置AD設(shè)置功率譜計算觀看轉(zhuǎn)換結(jié)果,保存數(shù)據(jù)串口發(fā)送轉(zhuǎn)換結(jié)果FFT運(yùn)算位碼倒置串口接收,AD采樣設(shè)置信號源類型、頻率幅值、和采樣點(diǎn)數(shù) 四、FFT算法的DSP實現(xiàn)過程:DSP芯片的出現(xiàn)使FFT的實現(xiàn)方法變得更為方便。由于大多數(shù)DSP芯片都具有在單指令周期內(nèi)完成乘法累加操作,

7、并且提供了專門的FFT指令,使得FFT算法在DSP芯片實現(xiàn)的速度更快。FFT算法可以分為按時間抽取FFT和按頻率抽取FFT兩大類,輸入也有實數(shù)和復(fù)數(shù)之分,一般情況下,都假定輸入序列為復(fù)數(shù)。(一)FFT運(yùn)算序列的存儲分配FFT運(yùn)算時間是衡量DSP芯片性能的一個重要指標(biāo),因此提高FFT的運(yùn)算速度是非常重要的。在用DSP芯片實現(xiàn)FFT算法時,應(yīng)允許利用DSP芯片所提供的各種軟、硬件資源。如何利用DSP芯片的有限資源,合理地安排好所使用的存儲空間是十分重要的。(二)FFT運(yùn)算的實現(xiàn)用TMS320C54x的匯編程序?qū)崿F(xiàn)FFT算法主要分為四步:1.實現(xiàn)輸入數(shù)據(jù)的比特反轉(zhuǎn)輸入數(shù)據(jù)的比特反轉(zhuǎn)實際上就是將輸入數(shù)

8、據(jù)進(jìn)行碼位倒置,以便在整個運(yùn)算后的輸出序列是一個自然序列。在用匯編指令進(jìn)行碼位倒置時,使用碼位倒置可以大大提高程序執(zhí)行速度和使用存儲器的效率。在這種尋址方式下,AR0存放的整數(shù)N是FFT點(diǎn)的一半,一個輔助寄存器指向一個數(shù)據(jù)存放的單元。當(dāng)使用位碼倒置尋址將AR0加到輔助寄存器時,地址將以位碼倒置的方式產(chǎn)生。2.實現(xiàn)N點(diǎn)復(fù)數(shù)FFTN點(diǎn)復(fù)數(shù)FFT算法的實現(xiàn)可分為三個功能塊,即第一級蝶形運(yùn)算、第二級蝶形運(yùn)算、第三級至log2N級蝶形運(yùn)算。對于任何一個2的整數(shù)冪,總可以通過M次分解最后成為2點(diǎn)的DFT計算。通過這樣的M次分解,可構(gòu)成M(即log2N)級迭代計算,每級由N/2個蝶形運(yùn)算組成。3.功率譜的計

9、算用FFT計算想x(n)的頻譜,即計算X(k)=X(k)一般是由實部XR(k)和虛部Xl(k)組成的復(fù)數(shù),即X(k)=XR(k)+jXl(k)因此,計算功率譜時只需將FFT變換好的數(shù)據(jù),按照實部實部XR(k)和虛部Xl(k)求它們的平方和,然后對平方和進(jìn)行開平方運(yùn)算。但是考慮到編程的難度,對于求FFT變換后數(shù)據(jù)的最大值,不開平方也可以找到最大值,并對功率譜的結(jié)果沒有影響,所以在實際的DSP編程中省去了開方運(yùn)算。4.輸出FFT結(jié)果(三)匯編語言程序程序主體由rfft-task、bit-rev、fft和power四個子程序組成。rfft-task:主調(diào)用子程序,用來調(diào)用其他子程序,實現(xiàn)統(tǒng)一的接口。

10、bit-rev:位碼倒置子程序,用來實現(xiàn)輸入數(shù)據(jù)的比特反轉(zhuǎn)。fft:FFT算法子程序,用來完成N點(diǎn)FFT運(yùn)算。在運(yùn)算過程中,為避免運(yùn)算結(jié)果的溢出,對每個蝶形的運(yùn)算結(jié)果右移一位。fft子程序分為三個功能塊:第一級蝶形運(yùn)算、第二級蝶形運(yùn)算、第三級至至log2N級蝶形運(yùn)算。(四)正弦系數(shù)表和余弦系數(shù)表:正弦系數(shù)表和余弦系數(shù)表可以由數(shù)據(jù)文件coeff.inc給出,主程序通過.copy匯編命令將正弦和余弦系數(shù)表與程序代碼匯編在一起。在本例中,數(shù)據(jù)文件coeff.inc給出1024復(fù)數(shù)點(diǎn)FFT的正弦、余弦系數(shù)各512個。利用此系數(shù)表可完成81024點(diǎn)FFT的運(yùn)算。(五)FFT算法的模擬信號輸入:FFT算法

11、的模擬信號輸入可以采用C語言編程來生成一個文本文件sindata,然后在rfft-task匯編程序中,通過.copy匯編命令將生成的數(shù)據(jù)文件復(fù)制到數(shù)據(jù)存儲器中,作為FFT算法的輸入數(shù)據(jù)參與FFT運(yùn)算。這種方法的優(yōu)點(diǎn)是程序的可讀性強(qiáng),缺點(diǎn)是當(dāng)輸入數(shù)據(jù)修改后,必須重新編譯、匯編和鏈接。五、設(shè)計步驟:1.啟動CCS,在CCS中建立一個C源文件和一個命令文件,并將這兩個文件添加到工程,再編譯并裝載程序:閱讀Dsp原理及應(yīng)用中fft 用dsp實現(xiàn)的有關(guān)程序。2.雙擊,啟動CCS的仿真平臺的配著選項。選擇C5502 Simulator。3.啟動ccs2后建立工程文件FFT.pjt4.建立源文件FFT.c與

12、鏈接文件FFT.cmd5.將這兩個文件加到FFT.pjt這個工程中。6.創(chuàng)建out文件7.加載out文件六、編譯程序int INPUTSAMPLENUMBER,DATASAMPLENUMBER;float fWaveRSAMPLENUMBER,fWaveISAMPLENUMBER,wSAMPLENUMBER;float sin_tabSAMPLENUMBER,cos_tabSAMPLENUMBER;void InitForFFT()int i;for ( i=0;iSAMPLENUMBER;i+ )sin_tabi=sin(PI*2*i/SAMPLENUMBER);cos_tabi=cos(P

13、I*2*i/SAMPLENUMBER);void MakeWave()int i;for ( i=0;iSAMPLENUMBER;i+ )INPUTi=sin(PI*2*i/SAMPLENUMBER*3)*1024;main()int i;InitForFFT();MakeWave();for ( i=0;iSAMPLENUMBER;i+ )fWaveRi=INPUTi;fWaveIi=0.0f;wi=0.0f;FFT(fWaveR,fWaveI);for ( i=0;iSAMPLENUMBER;i+ )DATAi=wi;while ( 1 );/ break pointvoid FFT(fl

14、oat dataRSAMPLENUMBER,float dataISAMPLENUMBER)int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p,L;float TR,TI,temp;/* following code invert sequence */for ( i=0;iSAMPLENUMBER;i+ )x0=x1=x2=x3=x4=x5=x6=0;x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x

15、0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataIxx=dataRi;for ( i=0;iSAMPLENUMBER;i+ )dataRi=dataIi; dataIi=0; for ( L=1;L0 ) b=b*2; i-; /* b= 2(L-1) */for ( j=0;j0 ) /* p=pow(2,7-L)*j; */p=p*2; i-;p=p*j;for ( k=j;k128;k=k+2*b ) /* for (3) */TR=dataRk; TI=dataIk; temp=dataRk+b;dataRk=dataRk+dataRk+b*cos_tab

16、p+dataIk+b*sin_tabp;dataIk=dataIk-dataRk+b*sin_tabp+dataIk+b*cos_tabp;dataRk+b=TR-dataRk+b*cos_tabp-dataIk+b*sin_tabp;dataIk+b=TI+temp*sin_tabp-dataIk+b*cos_tabp; /* END for (3) */ /* END for (2) */ /* END for (1) */for ( i=0;iGraph-Time/Frequency進(jìn)行如下圖所示設(shè)置。圖1圖2圖33清除顯示:在以上打開的窗口中單擊鼠標(biāo)右鍵,選擇彈出式菜單中“Clear

17、Display”功能。4設(shè)置斷點(diǎn):在程序FFT.c 中有注釋“break point”的語句上設(shè)置軟件斷點(diǎn)。圖45運(yùn)行并觀察結(jié)果。 選擇“Debug”菜單的“Animate”項,或按Alt+F5 鍵運(yùn)行程序。 觀察“Test Wave”窗口中時域圖形;圖5 在“Test Wave”窗口中點(diǎn)擊右鍵,選擇屬性,更改圖形顯示為FFT。觀察頻域圖形。圖6 觀察“FFT”窗口中的由CCS 計算出的正弦波的FFT。圖7(5)改變輸入函數(shù)INPUTi=(sin(PI*2*i/SAMPLENUMBER*3)+sin(PI*2*i/SAMPLENUMBER*4+sin(PI*2*i/SAMPLENUMBER*8)*1024;圖8(5)改變輸入函數(shù)INPUTi=(sin(PI*2*i/SAMPLENUMBER*3)+sin(PI*2*i/SAMPLENUMBER*10)+sin(PI*2*i/SAMPLENUMBER*20)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論