現(xiàn)代信號(hào)通信課程設(shè)計(jì)_第1頁
現(xiàn)代信號(hào)通信課程設(shè)計(jì)_第2頁
現(xiàn)代信號(hào)通信課程設(shè)計(jì)_第3頁
現(xiàn)代信號(hào)通信課程設(shè)計(jì)_第4頁
現(xiàn)代信號(hào)通信課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄第 1 章引言.2第 2 章 fft 算法簡介 .62.1 離散傅里葉變換 dft.62.2 快速傅里葉變換 fft.6第 3章 fft算法的 dsp實(shí)現(xiàn).53.1 實(shí)現(xiàn)數(shù)據(jù)的比特反轉(zhuǎn) .53.2 實(shí)現(xiàn) n點(diǎn)復(fù)數(shù) fft .5 3.3 輸出 fft結(jié)果.6第 4 章 系統(tǒng)開發(fā)平臺(tái)與環(huán)境 .64.1 ccs 開發(fā)環(huán)境 .64.2seed-dec2812 開發(fā)試驗(yàn)箱 .錯(cuò)誤! 未定義書簽。第 5 章 軟件設(shè)計(jì) .錯(cuò)誤! 未定義書簽。5.1 流程圖 .75.2 源程序 .8第 6 章 系統(tǒng)仿真 .14 第七章 總結(jié) . .19 參考文獻(xiàn) .191. 引言傅里葉變換是將信號(hào)從時(shí)域變換到頻域的一種

2、變換形式,是信號(hào)處理領(lǐng)域中一種重要的分析工具。離散傅里葉變換(dft )是連續(xù)傅里葉變換在離散系統(tǒng)中的表現(xiàn)形式。 由于 dft的計(jì)算量很大, 因此在很長一段時(shí)間內(nèi)使其應(yīng)用受到很大的限制。20 世紀(jì) 60 年代由 cooley 和 tukey 提出了快速傅里葉變換( fft )算法,它是快速計(jì)算 dft的一種高效方法, 可以明顯地降低運(yùn)算量, 大大地提高 dft的運(yùn)算速度,從而使 dft在實(shí)際中得到了廣泛的應(yīng)用, 已成為數(shù)字信號(hào)處理最為重要的工具之一。dsp芯片的出現(xiàn)使 fft的實(shí)現(xiàn)變得更加方便。由于多數(shù)的dsp芯片都能在單指令周期內(nèi)完成乘法累加運(yùn)算,而且還提供了專門的fft 指令(如實(shí)現(xiàn)fft

3、算法所必需的比特反轉(zhuǎn)等) ,使得 fft算法在 dsp芯片上實(shí)現(xiàn)的速度更快。 本節(jié)首先簡要介紹 fft算法的基本原理,然后介紹fft算法的 dsp實(shí)現(xiàn)。2.fft 算法的簡介快速傅里葉變換 (fft )是一種高效實(shí)現(xiàn)離散傅里葉變換(dft )的快速算法,是數(shù)字信號(hào)處理中最為重要的工具之一,它在聲學(xué), 語音,電信和信號(hào)處理等領(lǐng)域有著廣泛的應(yīng)用。2.1 離散傅里葉變換 dft 對(duì)于長度為 n的有限長序列 x(n) ,它的離散傅里葉變換(dft )為1, 1 ,0,)()(10nkwnxkxnnnkn(1)式中,njnew/2,稱為旋轉(zhuǎn)因子或蝶形因子。從 dft的定義可以看出, 在 x(n) 為復(fù)數(shù)

4、序列的情況下, 對(duì)某個(gè) k 值,直接按(1)式計(jì)算 x(k) 只需要 n次復(fù)數(shù)乘法和( n-1)次復(fù)數(shù)加法。因此,對(duì)所有 n個(gè) k 值,共需要 n2次復(fù)數(shù)乘法和 n(n-1) 次復(fù)數(shù)加法。對(duì)于一些相當(dāng)大有n值(如 1024 點(diǎn))來說,直接計(jì)算它的dft所需要的計(jì)算量是很大的,因此dft運(yùn)算的應(yīng)用受到了很大的限制。2.2 快速傅里葉變換 fft 旋轉(zhuǎn)因子 wn有如下的特性。對(duì)稱性:2/nknknww周期性:nknknww利用這些特性,既可以使dft中有些項(xiàng)合并,減少了乘法積項(xiàng),又可以將長序列的 dft分解成幾個(gè)短序列的dft 。fft就是利用了旋轉(zhuǎn)因子的對(duì)稱性和周期性來減少運(yùn)算量的。fft的算法

5、是將長序列的dft分解成短序列的 dft 。例如:n為偶數(shù)時(shí), 先將n點(diǎn)的 dft分解為兩個(gè) n/2 點(diǎn)的 dft ,使復(fù)數(shù)乘法減少一半:再將每個(gè)n/2 點(diǎn)的dft分解成 n/4 點(diǎn)的 dft ,使復(fù)數(shù)乘又減少一半,繼續(xù)進(jìn)行分解可以大大減少計(jì)算量。最小變換的點(diǎn)數(shù)稱為基數(shù),對(duì)于基數(shù)為2 的 fft算法,它的最小變換是2點(diǎn) dft 。一般而言,fft算法分為按時(shí)間抽取的fft (dit ) 和按頻率抽取的( dif fft)兩大類。 if fft 算法是在時(shí)域內(nèi)將每一級(jí)輸入序列依次按奇偶分成個(gè)短序列進(jìn)行計(jì)算。而 dif fft算法是在頻域內(nèi)將每一級(jí)輸入序列依次奇偶分成個(gè)短序列進(jìn)行計(jì)算。兩者的區(qū)別是

6、旋轉(zhuǎn)因子出現(xiàn)的位置不同,得算法是一樣的。在dif fft算法中,旋轉(zhuǎn)因子knw出現(xiàn)在輸入端,而在dif fft算法中它出現(xiàn)在輸入端。假定序列 x(n) 的點(diǎn)數(shù) n 是 2 的冪,按照 dif fft 算法可將其分為偶序列和奇序列。偶序列:12/, 1 , 0),2(2),-(n(4),(2),(0),1nrrxxxxxx即奇序列:12/, 1 , 0),12(1),-(n(5),(3),(1),2nrrxxxxxx即則 x(n) 的 dft表示為)2()()() 12()2()()()(12/02212/02112/0) 12(12/021010nrrknknnrrknnrkrnnrrknnn

7、nknnnnknwrxwwrxwrxwrxnnwnxwnxkx為奇數(shù)為偶數(shù)由于2/)2/(22)/2(2nnjnjnweew,則(3)式可表示為)3(12/, 1 ,0)()()()()(2112/02/212/02/1nkkxwkxwrxwwrxkxknnrrknknnrrkn式中,)(1kx和)(2kx分別為)(1nx和)(2nx的 n/2 的 dft 。由于對(duì)稱性,,2/knnknww則)()()2/(21kxwkxnkxkn。因此, n 點(diǎn))(kx可分為兩部分:前半部分:12/, 1 , 0)()()(21nkkxwkxkxkn(4)后半部分:12/, 1 , 0)()()2/(21n

8、kkxwkxnkxkn(5)從式(4)和式(5)可以看出,只要求出 0n/2-1 區(qū)間)(1kx和)(2kx的值,就可求出 0n-1 區(qū)間)(kx的 n點(diǎn)值。以同樣的方式進(jìn)行抽取,可以求得n/4 點(diǎn)的 dft ,重復(fù)抽取過程,就可以使n點(diǎn)的 dft用上組 2 點(diǎn)的 dft 來計(jì)算,這樣就可以大減少運(yùn)算量?;?2 dif fft的蝶形運(yùn)算如圖 (a) 所示。設(shè)蝶形輸入為)(1pxm和)(1qxm,輸出為)(pxm和)(qxm,則有knmmmwqxpxpx)()()(11(6)knmmmwqxpxqx)()()(11(7)在基數(shù)為 2 的 fft中,設(shè) n=2m,共有 m級(jí)運(yùn)算,每級(jí)有 n/2 個(gè)

9、 2 點(diǎn) fft蝶形運(yùn)算,因此, n點(diǎn) fft總共有nn2log)2/(個(gè)蝶形運(yùn)算。)(1qxm)(pxm)(1qxm)(qxm -1 圖(a) 基 2 dif fft 的蝶形運(yùn)算例如:基數(shù)為 2 的 fft ,當(dāng) n=8時(shí),共需要 3 級(jí),12 個(gè)基 2 dit fft的蝶形運(yùn)算。其信號(hào)流程如圖 (b) 所示。x(0) x(0) wn0 x(4) x(1) -1 wn0 x(2) x(2) -1 wn0 wn2x(6) x(3) -1 -1 wn0 x(1) x(4) -1 wn0 wn1x(5) x(5) -1 -1 wn0 wn2x(3) x(6) -1 -1 wn0 wn2 wn3x(

10、7) x(7) -1 -1 -1 圖(b) 8點(diǎn)基 2 dif fft 蝶形運(yùn)算從圖(b) 可以看出,輸入是經(jīng)過比特反轉(zhuǎn)的倒位序列,稱為位碼倒置,其排列順序?yàn)?7(),3(),5(),1(),6(),2(),4(),0(xxxxxxxx。輸出是按自然順序排列,其順序?yàn)?7(),6(,),1 (),0(xxxx。3.fft 算法的 dsp實(shí)現(xiàn)dsp 芯片的出現(xiàn)使 fft的實(shí)現(xiàn)方法變得更為方便。 由于大多數(shù) dsp芯片都具有在單指令周期內(nèi)完成乘法累加操作,并且提供了專門的fft指令,使得 fft算法在 dsp芯片實(shí)現(xiàn)的速度更快。fft算法可以分為按時(shí)間抽取fft (dif fft) 和按頻率抽取f

11、ft (dif fft)兩大類,輸入也有實(shí)數(shù)和復(fù)數(shù)之分,一般情況下,都假定輸入序列為復(fù)數(shù)。下面以 n復(fù)數(shù)點(diǎn) fft算法為例,介紹用 dsp芯片實(shí)現(xiàn)的方法。實(shí)現(xiàn) fft算法主要分為三步 : 3.1 實(shí)現(xiàn)輸入數(shù)據(jù)的比特反轉(zhuǎn)輸入數(shù)據(jù)的比特反轉(zhuǎn)實(shí)際上就是將輸入數(shù)據(jù)進(jìn)行位碼倒置, 以便在整個(gè)運(yùn)算后的輸出序列是一個(gè)自然序列。 在用匯編指令進(jìn)行位碼倒置是, 使用位碼倒置尋址可以大大擔(dān)高程序執(zhí)行速度和使用存儲(chǔ)器的效率。在這種尋址方式下,ar0存放的整數(shù) n是 fft點(diǎn)的一半,一個(gè)輔助寄存器指向一個(gè)數(shù)據(jù)存放的章元。當(dāng)使用位碼倒置尋址將 ar0加到輔助寄存器時(shí),地址將以位碼倒置的方式產(chǎn)生。3.2 實(shí)現(xiàn) n點(diǎn)復(fù)數(shù)

12、fft n點(diǎn)復(fù)數(shù) fft算法的實(shí)現(xiàn)可分為三個(gè)功能塊,即第一級(jí)蝶形運(yùn)算,第二蝶形運(yùn)算,第三級(jí)至n2log級(jí)蝶形運(yùn)算。對(duì)于任何一個(gè) 2 的整數(shù)冪 n=2m ,總可以通過 m次分解最后成為2 點(diǎn)的 dft計(jì)算。通過這樣的m次分解,可構(gòu)成 m (即n2log)級(jí)迭代運(yùn)算完成。3.3 輸出 fft結(jié)果四. 系統(tǒng)開發(fā)平臺(tái)與環(huán)境4.1 ccs 開發(fā)環(huán)境ccs 提供了配置、建立、調(diào)試、跟蹤和分析程序的工具,它便于實(shí)時(shí)、嵌入式信號(hào)處理程序的編制和測試,它能夠加速開發(fā)進(jìn)程,提高工作效率。ccs提供了基本的代碼生成工具,它們具有一系列的調(diào)試、分析能力。ccs支持如下圖 1.1 所示的開發(fā)周期的所有階段。圖 1.1

13、4.2 seed-dec2812開發(fā)實(shí)驗(yàn)箱設(shè)計(jì)概念性規(guī)劃編程和編譯創(chuàng)建工程文件、編寫源代碼和配置文件調(diào)試語法檢查、探測點(diǎn)設(shè)置和日志保存等分析實(shí)時(shí)調(diào)試、統(tǒng)計(jì)和跟蹤 seed-decxxxx 系列嵌入式 dsp開發(fā)板本著模塊化、總線型、開放式、系列化的設(shè)計(jì)思想, 采用統(tǒng)一的系統(tǒng)結(jié)構(gòu)、 模塊結(jié)構(gòu)和機(jī)械結(jié)構(gòu), 以多種典型 dsp處理器構(gòu)成具有標(biāo)準(zhǔn)總線和相同物理尺寸的高性能嵌入式dsp開發(fā)板。seed-dec2812 嵌入式 dsp開發(fā)板原理框圖如圖1.2 所示:圖 1.2五. 軟件設(shè)計(jì)5.1 程序流程圖開始初始化工作變量調(diào)用波形發(fā)生子程序產(chǎn)生波形(3個(gè)正弦波)調(diào)用 fft 子程序計(jì)算功率譜波形發(fā)生計(jì)算

14、步長用標(biāo)準(zhǔn)的 c 的 sin 函數(shù)計(jì)算當(dāng)前波形值結(jié)束5.2 源程序#include dsp281x_device.h / dsp281x headerfile include file #include dsp281x_examples.h / dsp281x examples include file #include f2812a.h #includemath.h #define pi 3.1415926 #define samplenumber 128 #include dsp281x_device.h / dsp281x headerfile include file #include

15、 dsp281x_examples.h / dsp281x examples include file / prototype statements for functions found within this file. interrupt void adc_isr(void); / global variables used in this example: void admain(); void initforfft(); 開始按照編碼逆序排列輸入序列用蝶形算法計(jì)算計(jì)算功率譜返回計(jì)算結(jié)果void makewave(); /void fft(float datarsamplenumber

16、,float dataisamplenumber); uint16 loopcount; uint16 conversioncount; uint16 voltage11024; uint16 voltage21024; uint16 nmixing1024; int inputsamplenumber,datasamplenumber; float fwaversamplenumber,fwaveisamplenumber,wsamplenumber; float sin_tabsamplenumber,cos_tabsamplenumber; admain(void) initsysctr

17、l();/初始化 cpu dint;/關(guān)中斷 initpiectrl();/初始化 pie 寄存器 ier = 0 x0000;/禁止所有的中斷 ifr = 0 x0000; initpievecttable();/初始化 pie 中斷向量表/ interrupts that are used in this example are re-mapped to / isr functions found within this file. eallow; / this is needed to write to eallow protected register pievecttable.adc

18、int = &adc_isr; edis; / this is needed to disable write to eallow protected registers adcregs.adctrl1.bit.reset = 1; / reset the adc module asm( rpt #10 | nop); / must wait 12-cycles (worst-case) adcregs.adctrl3.all = 0 x00c8; / first power-up ref and bandgap circuits adcregs.adctrl3.bit.adcbgrf

19、dn = 0 x3; / power up bandgap/reference circuitry adcregs.adctrl3.bit.adcpwdn = 1; / power up rest of adc / enable adcint in pie piectrlregs.pieier1.bit.intx6 = 1; ier |= m_int1; / enable cpu interrupt 1 eint; / enable global interrupt intm ertm; / enable global realtime interrupt dbgm loopcount = 0

20、; conversioncount = 0; / configure adc adcregs.adcmaxconv.all = 0 x0001; / setup 2 convs on seq1 adcregs.adcchselseq1.bit.conv00 = 0 x0; / setup adcina3 as 1st seq1 conv. adcregs.adcchselseq1.bit.conv01 = 0 x1; / setup adcina2 as 2nd seq1 conv. adcregs.adctrl2.bit.eva_soc_seq1 = 1; / enable evasoc t

21、o start seq1 adcregs.adctrl2.bit.int_ena_seq1 = 1; / enable seq1 interrupt (every eos) / configure eva / assumes eva clock is already enabled in initsysctrl(); evaregs.t1cmpr = 0 x0080; / setup t1 compare value evaregs.t1pr = 0 x10; / setup period register evaregs.gptcona.bit.t1toadc = 1; / enable e

22、vasoc in eva evaregs.t1con.all = 0 x1042; / enable timer 1 compare (upcount mode) / wait for adc interrupt while(1) loopcount+; interrupt void adc_isr(void) voltage1conversioncount = adcregs.adcresult0 4; voltage2conversioncount = adcregs.adcresult1 4; nmixingconversioncount=voltage1conversioncount+

23、voltage2conversioncount; / if 40 conversions have been logged, start over if(conversioncount = 1023) conversioncount = 0; else conversioncount+; / reinitialize for next adc sequence adcregs.adctrl2.bit.rst_seq1 = 1; / reset seq1 adcregs.adcst.bit.int_seq1_clr = 1; / clear int seq1 bit piectrlregs.pi

24、eack.all = pieack_group1; / acknowledge interrupt to pie return; void fft(float 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&0 x01; x1=(i/2

25、)&0 x01; x2=(i/4)&0 x01; x3=(i/8)&0 x01;x4=(i/16)&0 x01; x5=(i/32)&0 x01; x6=(i/64)&0 x01; xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; dataixx=datari; for ( i=0;isamplenumber;i+ ) datari=dataii; dataii=0; /* following code fft */ for ( l=1;l0 ) b=b*2; i-; /* b= 2(l-1) */ for ( j=

26、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_tabp+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-

27、dataik+b*cos_tabp; /* end for (3) */ /* end for (2) */ /* end for (1) */ for ( i=0;isamplenumber/2;i+ ) wi=sqrt(datari*datari+dataii*dataii); /* end fft */ 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 point void initforfft() int i; for ( i=0;isamplenumber;i+ ) sin_tabi=sin(pi*2*i/samplenumber); cos_tabi=cos(pi*2*i/samplenumber); void makewave() int

溫馨提示

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

評(píng)論

0/150

提交評(píng)論