版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、快速傅立葉變換(FFT)算法實驗摘要:FFT(Fast Fourier Transformation),即為快速傅里葉變換,是離散傅里葉變換的快速算法,它是根據(jù)離散傅里葉變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進(jìn)行改進(jìn)獲得的。這種算法大大減少了變換中的運(yùn)算量,使得其在數(shù)字信號處理中有了廣泛的運(yùn)用。本實驗主要要求掌握在CCS環(huán)境下用窗函數(shù)法設(shè)計FFT快速傅里葉的原理和方法;并且熟悉FFT快速傅里葉特性;以及通過本次試驗了解各種窗函數(shù)對快速傅里葉特性的影響等。引言:快速傅里葉變換FFT是離散傅里葉變換DFT的一種快速算法。起初DFT的計算在數(shù)字信號處理中就非常有用,但由于計算量太大,即使
2、采用計算機(jī)也很難對問題進(jìn)行實時處理,所以并沒有得到真正的運(yùn)用。1965年J.W.庫利和T.W.圖基提出快速傅里葉變換,采用這種算法能使計算機(jī)計算離散傅里葉變換所需要的乘法次數(shù)大為減少,特別是被變換的抽樣點(diǎn)數(shù)N越多,FFT算法計算量的節(jié)省就越顯著。從此,對快速傅里葉變換(FFT)算法的研究便不斷深入,數(shù)字信號處理這門新興學(xué)科也隨FFT的出現(xiàn)和發(fā)展而迅速發(fā)展。根據(jù)對序列分解與選取方法的不同而產(chǎn)生了FFT的多種算法,基本算法是基2DIT和基2DIF。FFT 的出現(xiàn),使信號分析從時域分析向頻域分析成為可能,極大地推動了信號分析在各領(lǐng)域的實際應(yīng)用。FFT在離散傅里葉反變換、線性卷積和線性相關(guān)等方面也有重
3、要應(yīng)用。一、 實驗原理:FFT并不是一種新的變換,它是離散傅立葉變換(DFT)的一種快速算法。由于我們在計算DFT時一次復(fù)數(shù)乘法需用四次實數(shù)乘法和二次實數(shù)加法;一次復(fù)數(shù)加法則需二次實數(shù)加法。每運(yùn)算一個X(k)需要4N次復(fù)數(shù)乘法及2N+2(N-1)=2(2N-1)次實數(shù)加法。所以整個DFT運(yùn)算總共需要4N2次實數(shù)乘法和N*2(2N-1)=2N(2N-1)次實數(shù)加法。如此一來,計算時乘法次數(shù)和加法次數(shù)都是和N2成正比的,當(dāng)N很大時,運(yùn)算量是可觀的,因而需要改進(jìn)對DFT的算法減少運(yùn)算速度。根據(jù)傅立葉變換的對稱性和周期性,我們可以將DFT運(yùn)算中有些項合并。我們先設(shè)序列長度為N=2L,L為整數(shù)。將N=2
4、L的序列x(n)(n=0,1,,N-1),按N的奇偶分成兩組,也就是說我們將一個N點(diǎn)的DFT分解成兩個N/2點(diǎn)的DFT,他們又從新組合成一個如下式所表達(dá)的N點(diǎn)DFT:其中,設(shè)x(n)為N項的復(fù)數(shù)序列,由DFT變換,任一X(m)的計算都需要N次復(fù)數(shù)乘法和N-1次復(fù)數(shù)加法,而一次復(fù)數(shù)乘法等于四次實數(shù)乘法和兩次實數(shù)加法,一次復(fù)數(shù)加法等于兩次實數(shù)加法,即使把一次復(fù)數(shù)乘法和一次復(fù)數(shù)加法定義成一次“運(yùn)算”(四次實數(shù)乘法和四次實數(shù)加法),那么求出N項復(fù)數(shù)序列的X(m),即N點(diǎn)DFT變換大約就需要N2次運(yùn)算。當(dāng)N=1024點(diǎn)甚至更多的時候,需要N2=1048576次運(yùn)算,在FFT中,利用WN的周期性和對稱性,
5、把一個N項序列(設(shè)N=2k,k為正整數(shù)),分為兩個N/2項的子序列,每個N/2點(diǎn)DFT變換需要(N/2)2次運(yùn)算,再用N次運(yùn)算把兩個N/2點(diǎn)的DFT變換組合成一個N點(diǎn)的DFT變換。這樣變換以后,總的運(yùn)算次數(shù)就變成N+2*(N/2)2=N+N2/2。繼續(xù)上面的例子,N=1024時,總的運(yùn)算次數(shù)就變成了525312次,節(jié)省了大約50%的運(yùn)算量。而如果我們將這種“一分為二”的思想不斷進(jìn)行下去,直到分成兩兩一組的DFT運(yùn)算單元,那么N點(diǎn)的DFT變換就只需要Nlog2N次的運(yùn)算,N在1024點(diǎn)時,運(yùn)算量僅有10240次,是先前的直接算法的1%,點(diǎn)數(shù)越多,運(yùn)算量的節(jié)約就越大,這就是FFT的優(yōu)越性。8點(diǎn)DF
6、T的FFT運(yùn)算流圖 計算離散傅里葉變換的快速方法,有按時間抽取的FFT算法和按頻率抽取的FFT算法。前者是將時域信號序列按偶奇分排,后者是將頻域信號序列按偶奇分排。它們都借助于的兩個特點(diǎn):一是的周期性;另一是的對稱性,這里符號*代表其共軛。這樣,便可以把離散傅里葉變換的計算分成若干步進(jìn)行,計算效率大為提高。時間抽取算法 令信號序列的長度為N=2,其中M是正整數(shù),可以將時域信號序列x(n)分解成兩部分,一是偶數(shù)部分x(2n),另一是奇數(shù)部分x(2n+1),其中。于是信號序列x(n)的離散傅里葉變換可以用兩個N/2抽樣點(diǎn)的離散傅里葉變換來表示和計算。一個抽樣點(diǎn)數(shù)為N 的信號序列x(n)的離散傅里葉
7、變換,可以由兩個 N/2抽樣點(diǎn)序列的離散傅里葉變換求出。依此類推,這種按時間抽取算法是將輸入信號序列分成越來越小的子序列進(jìn)行離散傅里葉變換計算,最后合成為N點(diǎn)的離散傅里葉變換。N=2點(diǎn)的離散傅里葉變換的計算全由蝶形運(yùn)算組成,需要M級運(yùn)算,每級包括N/2個蝶形運(yùn)算,總共有 個蝶形運(yùn)算。所以,總的計算量為次復(fù)數(shù)乘法運(yùn)算和N log2N次復(fù)數(shù)加法運(yùn)算。FFT算法按級迭代進(jìn)行,N抽樣點(diǎn)的輸入信號具有N個原始數(shù)據(jù)x0(n),經(jīng)第一級運(yùn)算后,得出新的N個數(shù)據(jù)x1(n),再經(jīng)過第二級迭代運(yùn)算,又得到另外N個數(shù)據(jù)x2(n),依此類推,直至最后的結(jié)果x(k)=xM(k)=X(k)在逐級迭代計算中,每個蝶形運(yùn)算的
8、輸出數(shù)據(jù)存放在原來存貯輸入數(shù)據(jù)的單元中,實行所謂“即位計算”,這樣可以節(jié)省大量存放中間數(shù)據(jù)的寄存器。蝶形運(yùn)算中加權(quán)系數(shù)隨迭代級數(shù)成倍增加。對于N=8,M=3情況,需進(jìn)行三級迭代運(yùn)算。在第一級迭代中,只用到一種加權(quán)系數(shù);蝶形運(yùn)算的跨度間隔等于1。在第二級迭代中,用到兩種加權(quán)系數(shù)即、;蝶形運(yùn)算的跨度間隔等于2。在第三級迭代中,用到4種不同的加權(quán)系數(shù)即、;蝶形運(yùn)算的跨度間隔等于4??梢?,每級迭代的不同加權(quán)系數(shù)的數(shù)目比前一級迭代增加一倍;跨度間隔也增大一倍。輸入數(shù)據(jù)序列x(n)需重新排列為x(0)、x、x、x、x、x、x、x,這是按照二進(jìn)制數(shù)的碼位倒置所得到的反序數(shù),例如N=8中數(shù)“1”的二進(jìn)制數(shù)為“
9、001”,將其碼位倒轉(zhuǎn)變?yōu)椤?00”,即為十進(jìn)制數(shù)“4”。頻率抽取算法按頻率抽取的 FFT算法是將頻域信號序列X(k)分解為奇偶兩部分,但算法仍是由時域信號序列開始逐級運(yùn)算,同樣是把N點(diǎn)分成N/2點(diǎn)計算FFT,可以把直接計算離散傅里葉變換所需的N次乘法縮減到N/2次。頻率信號序列X(2l)是時間信號序列x1(n)+x2(n)的N/2點(diǎn)離散傅里葉變換,頻率信號序列X(2l+1)是時間信號序列【x1(n)-x2(n)】的N/2點(diǎn)離散傅里葉變換,因此,N點(diǎn)離散傅里葉變換的計算,通過兩次加(減)法和一次乘法,從原來序列獲得兩個子序列,所以,頻率抽取算法也具有蝶形運(yùn)算形式。其計算量完全和時間抽取算法一樣
10、,即只需次乘法運(yùn)算和Nlog2N次加(減)法運(yùn)算。實際上,頻率抽取算法與時間抽取算法的信號流圖之間存在著轉(zhuǎn)置關(guān)系,如將流圖適當(dāng)變形,可以得出多種幾何形狀。除了基2的FFT算法之外,還有基4、基8等高基數(shù)的FFT算法以及任意數(shù)為基數(shù)的FFT算法。二、 硬件框圖:“數(shù)字信號處理”實驗室教學(xué)實驗箱結(jié)構(gòu)圖教學(xué)實驗箱結(jié)構(gòu)圖F2812-A評估板原理框圖F2812-A評估板實物圖DSP教學(xué)實驗箱的硬件連接:1連接電源:打開實驗箱,取出三相電源連接線(如右圖),將電源線的一端插入實驗箱外部左惻箱壁上的電源插孔中。確認(rèn)實驗箱面板上電源總開關(guān)(位于實驗箱底板左上角)處于“關(guān)”的位置,連接電源線的另一端至220V交
11、流供電插座上,保證穩(wěn)固連接。2使用電源連接線(如右圖,插頭是帶孔的)連接各模塊電源:確認(rèn)實驗箱總電源斷開。連接ICETEK-CTR板上邊插座到實驗箱底板上+12V電源插座;ICETEK-CTR板下邊插座到實驗箱底板上+5V電源插座;如使用PP(并口)型仿真器,則連接仿真器上插座到實驗箱底板上+5V電源插座連接DSP評估板模塊電源插座到實驗箱底板上+5V電源插座。注意各插頭要插到底,防止虛接或接觸不良。3連接DSP評估板信號線:當(dāng)需要連接信號源輸出到A/D輸入插座 時,使用信號連接線(如右圖)分別連接相應(yīng)插座。4、接通電源:檢查實驗箱上220V電源插座(箱體左側(cè))中保險管是否完好,在連接電源線以
12、后,檢查各模塊供電連線是否正確連接,打開實驗箱上的電源總開關(guān)(位于實驗箱底板左上角),使開關(guān)位于“開”的位置,電源開關(guān)右側(cè)的指示燈亮。三、 軟件流程圖:開始初始化工作變量調(diào)用波形發(fā)生子程序產(chǎn)生波形(3個正弦波)調(diào)用FFT子程序計算功率譜波形發(fā)生計算步長用標(biāo)準(zhǔn)C的sin函數(shù)計算當(dāng)前波形值(128點(diǎn))結(jié)束FFT按照編碼逆序排列輸入序列返回計算結(jié)果用蝶形算法計算計算功率譜五、 調(diào)試過程和步驟: I、軟件調(diào)試1實驗準(zhǔn)備-設(shè)置軟件仿真模式。-啟動CCS。2打開工程,瀏覽程序,工程目錄為D:dspt7fftfft.pjt3編譯并下載程序4打開觀察窗口:選擇菜單View->Graph->Time
13、/Frequency進(jìn)行如下圖所示設(shè)置。 選擇菜單View->Graph->Time/Frequency進(jìn)行如下圖所示設(shè)置。 選擇菜單View->Graph->Time/Frequency進(jìn)行如下圖所示設(shè)置。 5清除顯示:在以上打開的窗口中單擊鼠標(biāo)右鍵,選擇彈出式菜單中“Clear Display”功能。6設(shè)置斷點(diǎn):在程序FFT.c中有注釋“break point”的語句上設(shè)置軟件斷點(diǎn)。7.運(yùn)行并觀察結(jié)果選擇“Debug”菜單的“Animate”項,或按F12鍵運(yùn)行程序。觀察“FFT”窗口中時域和頻域圖形。注意:由于實驗運(yùn)算復(fù)雜,需要等一會才能看到運(yùn)行完結(jié)果。8.退出C
14、CSII、硬件連接1實驗準(zhǔn)備: 連接實驗設(shè)備。 準(zhǔn)備信號源進(jìn)行AD輸入。取出2根實驗箱附帶的信號線(如右圖,兩端均為單聲道語音插頭)。用1根信號線連接實驗箱左側(cè)信號源的波形輸出A端口和“A/D輸入”模塊的“ADCIN0”插座注意插頭要插牢、到底。這樣,信號源波形輸出A的輸出波形即可送到ICETEK-F2812A板的AD輸入通道0。用1根信號線連接實驗箱左側(cè)信號源的波形輸出B端口和“A/D輸入”模塊的“ADCIN1”插座注意插頭要插牢、到底。這樣,信號源波形輸出B的輸出波形即可送到ICETEK-F2812A板的AD輸入通道1。設(shè)置波形輸出A:-向內(nèi)側(cè)按波形頻率選擇旋鈕,直到標(biāo)有正弦波的指示燈點(diǎn)亮
15、。 -上下調(diào)節(jié)波形頻率選擇旋鈕,直到標(biāo)有100-1KHz的指示燈點(diǎn)亮。-調(diào)節(jié)幅值調(diào)整旋鈕,將波形輸出A的幅值調(diào)到適當(dāng)位置。設(shè)置波形輸出B:-向內(nèi)側(cè)按波形頻率選擇旋鈕,直到標(biāo)有正弦波的指示燈點(diǎn)亮。 -上下調(diào)節(jié)波形頻率選擇旋鈕,直到標(biāo)有1K-10KHz的指示燈點(diǎn)亮。 -調(diào)節(jié)幅值調(diào)整旋鈕,將波形輸出B的幅值調(diào)到適當(dāng)位置。注意:由于模數(shù)輸入信號未經(jīng)任何轉(zhuǎn)換就進(jìn)入DSP,所以必須保證輸入的模擬信號的幅度在0-3V之間。必須用示波器檢測信號范圍,保證最小值0V最大值3 V,否則容易損壞DSP芯片的模數(shù)采集模塊。2設(shè)置Code Composer Studio 2.21在硬件仿真(Emulator)方式下運(yùn)行
16、:3啟動Code Composer Studio 2.21:選擇菜單Debug->Reset CPU。4打開工程文件:工程目錄: D:dspt8mixerfftmixerfft.pjt 5編譯、下載程序。6運(yùn)行程序觀察結(jié)果: 按CTR控制板的K6鍵,可以顯示A、B兩信號源頻譜,K7鍵實現(xiàn)混頻顯示,按K8實現(xiàn)鍵A、B兩信號源分屏顯示。7退出CCS:六、 實驗結(jié)果:七、 結(jié)果分析:通過觀察軟件仿真結(jié)果中FFT”窗口的時域圖形和頻域圖形可知,由上述程序所計算出的測試波形的功率譜與CCS計算出的快速傅里葉變換的結(jié)果相近;通過硬件仿真結(jié)果可知,按CTR控制板的K6鍵,可以顯示出A、B兩信號源頻譜,
17、按K7鍵可以實現(xiàn)混頻顯示,按K8實現(xiàn)鍵A、B兩信號源分屏顯示。八、 結(jié)束語:通過這次實驗更加深刻地理解了快速傅里葉變換的物理意義,并且掌握了用窗函數(shù)法設(shè)計FFT快速傅里葉變換的原理和方法,進(jìn)一步熟悉了FFT快速傅里葉變換特性,通過對快速傅里葉變換的實際應(yīng)用了解了各種窗函數(shù)對快速傅里葉變換特性的影響。本科學(xué)習(xí)期間,通過學(xué)習(xí)數(shù)字信號處理了解到快速傅里葉變換的知識,但當(dāng)時僅限于對其理論層面的理解,通過這次實驗,加強(qiáng)了自己動手能力的鍛煉,使自己進(jìn)一步認(rèn)識到理論知識與實踐結(jié)合起來的重要性,從而為自己以后的學(xué)習(xí)工作提供良好的發(fā)展方向。 DSP原理與應(yīng)用這門課程在介紹DSPs芯片特點(diǎn)和應(yīng)用的基礎(chǔ)上,以TI公
18、司C28x系列的TMS320F2812芯片為描述對象,系統(tǒng)的介紹了DSPs芯片的基本特點(diǎn)、硬件結(jié)構(gòu)、工作原理、開發(fā)環(huán)境和使用方法,其中包括CPU內(nèi)部結(jié)構(gòu)、時鐘和系統(tǒng)控制、存儲空間及通用I/O接口、中斷管理方式、片內(nèi)外設(shè)、尋址方式和指令系統(tǒng),以及本實驗所用到的集成開發(fā)環(huán)境CCS、DSP最小系統(tǒng)和相應(yīng)的軟件設(shè)計。通過學(xué)習(xí)DSP原理與應(yīng)用我基本掌握了DSPs芯片的主要知識體系,并且通過上課老師的實物講解和課本概念的聯(lián)系,結(jié)合理論知識和實際應(yīng)用,基本建立了DSP系統(tǒng)的基本概念與邏輯概念、物理概念之間的聯(lián)系,同時通過這次實驗進(jìn)一步把DSPs的基本概念和原理應(yīng)用到了實際的DSP系統(tǒng)中。九、 程序附錄:C語
19、言程序代碼:程序1#include "DSP281x_Device.h" / DSP281x Headerfile Include File#include "DSP281x_Examples.h" / DSP281x Examples Include File#include "f2812a.h"#include"math.h"#define PI 3.1415926#define SAMPLENUMBER 128void InitForFFT();void MakeWave();/void FFT(float
20、dataRSAMPLENUMBER,float dataISAMPLENUMBER);int INPUTSAMPLENUMBER,DATASAMPLENUMBER;float fWaveRSAMPLENUMBER,fWaveISAMPLENUMBER,wSAMPLENUMBER;float sin_tabSAMPLENUMBER,cos_tabSAMPLENUMBER;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,t
21、emp;/* following code invert sequence */for ( i=0;i<SAMPLENUMBER;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=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataIxx=dataRi;for ( i=0;i<SAMPLE
22、NUMBER;i+ )dataRi=dataIi; dataIi=0; /* following code FFT */for ( L=1;L<=7;L+ ) /* for(1) */b=1; i=L-1;while ( i>0 ) b=b*2; i-; /* b= 2(L-1) */for ( j=0;j<=b-1;j+ ) /* for (2) */p=1; i=7-L;while ( i>0 ) /* p=pow(2,7-L)*j; */p=p*2; i-;p=p*j;for ( k=j;k<128;k=k+2*b ) /* for (3) */TR=dat
23、aRk; 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-dataIk+b*cos_tabp; /* END for (3) */ /* END for (2) */ /* END for (1) */for ( i=0;i<SAMPLENUM
24、BER/2;i+ ) wi=sqrt(dataRi*dataRi+dataIi*dataIi); /* END FFT */main()int i;InitForFFT();MakeWave();for ( i=0;i<SAMPLENUMBER;i+ )fWaveRi=INPUTi;fWaveIi=0.0f;wi=0.0f;FFT(fWaveR,fWaveI);for ( i=0;i<SAMPLENUMBER;i+ )DATAi=wi;while ( 1 );/ break pointvoid InitForFFT()int i;for ( i=0;i<SAMPLENUMBE
25、R;i+ )sin_tabi=sin(PI*2*i/SAMPLENUMBER);cos_tabi=cos(PI*2*i/SAMPLENUMBER);void MakeWave()int i;for ( i=0;i<SAMPLENUMBER;i+ )INPUTi=sin(PI*2*i/SAMPLENUMBER*3)*1024;程序2#include "DSP281x_Device.h" / DSP281x Headerfile Include File#include "DSP281x_Examples.h" / DSP281x Examples I
26、nclude File#include "f2812a.h"#include "LCD.h"#include "math.h"#define ADCNUMBER 300 / Prototype statements for functions found within this errupt void adc_isr(void);void Delay(unsigned int nDelay);struct struLCDGraph struGraph,struGraph1;unsigned int nScreenBuf
27、fer30*128;/ Global variables used in this example:Uint16 LoopCount;Uint16 ConversionCount;Uint16 Voltage11024;Uint16 Voltage21024;Uint16 Voltage_1,Voltage_2,flage=0;Uint16 nGraphBuf1ADCNUMBER,nGraphBuf2ADCNUMBER;int nGraphBuf3ADCNUMBER;int ci=0,keyflage,nAD;Uint16 nMixing1024;/ 液晶 -#define CTRLED (*
28、(unsigned int *)0x108004) / port8004#define MCTRKEY (*(unsigned int *)0x108005) / port8005#define CTRCLKEY (*(unsigned int *)0x108006) / port8006#define CTRSTATUS (*(unsigned int *)0x108000) /port8000/#define pi 3.1415926int nModeAD;Uint16 ad1,ad2;#define PI 3.1415926#define SAMPLENUMBER 128int INPU
29、TSAMPLENUMBER,DATASAMPLENUMBER;/int nGraphBuf1ADCNUMBER,nGraphBuf2ADCNUMBER;float fWaveRSAMPLENUMBER,fWaveISAMPLENUMBER;float sin_tabSAMPLENUMBER,cos_tabSAMPLENUMBER;float fDataRSAMPLENUMBER,fDataISAMPLENUMBER,wSAMPLENUMBER;void FFT(float dataRSAMPLENUMBER,float dataISAMPLENUMBER);void InitForFFT();
30、/void MakeWave();int j,a=0;main() int j,uWork,uWork1; unsigned int * pWork; InitSysCtrl();/初始化cpu /InitPll(0x5); DINT;/關(guān)中斷 LCDTurnOff(); LCDSetScreenBuffer(nScreenBuffer); for ( uWork=0,pWork=nScreenBuffer;uWork<30*128;uWork+,pWork+ )(*pWork)=0; LCDSetDelay(0); LCDTurnOn();/ 打開顯示 LCDCLS();/ 清除顯示內(nèi)
31、存 InitXintf(); InitPieCtrl();/初始化pie寄存器 /*for(j=0;j<1024;j+) Voltage1j=0; Voltage2j=0; */ IER = 0x0000;/禁止所有的中斷 IFR = 0x0000; 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 EALL
32、OW protected register PieVectTable.ADCINT = &adc_isr; EDIS; / This is needed to disable write to EALLOW protected registers AdcRegs.ADCTRL1.bit.RESET = 1;/ Reset the ADC moduleasm(" RPT #10 | NOP");/ Must wait 12-cycles (worst-case) for ADC reset to take effect AdcRegs.ADCTRL3.all = 0x
33、00C8;/ first power-up ref and bandgap circuits AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;/ 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 inte
34、rrupt INTM ERTM; / Enable Global realtime interrupt DBGM LoopCount = 0; ConversionCount = 0;/ Configure ADC AdcRegs.ADCMAXCONV.all = 0x0001; / Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; / Setup ADCINA3 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; / Setup ADCINA2 as
35、 2nd SEQ1 conv. AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; / Enable EVASOC to 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 = 0x0080; / Setup T1 compare value EvaRegs.T1PR = 0x5000
36、; / Setup period register EvaRegs.GPTCONA.bit.T1TOADC = 1; / Enable EVASOC in EVA EvaRegs.T1CON.all = 0x1042; / Enable timer 1 compare (upcount mode) /struGraph.uLineMode=LINEMODE; /LCDDrawGraph(struGraph); keyflage=0; InitForFFT(); / Wait for ADC interrupt for(;) j=0; uWork1=MCTRKEY; uWork1 &=0
37、xff; CTRCLKEY=0; if(uWork1=128) keyflage=0; if(uWork1=64) keyflage=1; if(uWork1=32) keyflage=2; if(flage=1) flage=0; LCDSetScreenBuffer(nScreenBuffer); LCDCLS();/ 清除顯示內(nèi)存*/ if(keyflage=0) struGraph.pData=Voltage2; struGraph.uDataMode=DATAUINTMODE; struGraph.uDataLength=256; struGraph.uMaxValue=2048;
38、struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240; struGraph.uWindowY1=128; struGraph.nOriginX=0; struGraph.nOriginY=0; struGraph.uLineMode=LINEMODE; LCDGraph(&struGraph); / struGraph.uLineMode=LINEMODE; struGraph.pData=Voltage1; struGraph.uDataMode=DATAUINTMODE; struGraph.uD
39、ataLength=256; struGraph.uMaxValue=1024; struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240; struGraph.uWindowY1=128; struGraph.nOriginX=0; struGraph.nOriginY=64; struGraph.uLineMode=LINEMODE; LCDGraph(&struGraph); for ( j=0;j<20;j+ )_Delay(414); LCDSetScreenBuffer(nScreenB
40、uffer); LCDCLS();/ 清除顯示內(nèi)存 if(keyflage=1) struGraph.pData=nMixing; struGraph.uDataMode=DATAUINTMODE; struGraph.uDataLength=256; struGraph.uMaxValue=2048; struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240; struGraph.uWindowY1=128; struGraph.nOriginX=0; struGraph.nOriginY=0; struGra
41、ph.uLineMode=LINEMODE; LCDGraph(&struGraph); for ( j=0;j<20;j+ )_Delay(414); LCDSetScreenBuffer(nScreenBuffer); LCDCLS(); if(keyflage=2) InitForFFT(); for ( j=0;j<SAMPLENUMBER;j+ )fDataRj=(Voltage1j+Voltage2j)/2.0;fDataIj=0; wj=0;FFT(fDataR,fDataI); for ( j=0;j<SAMPLENUMBER;j+ )DATAj=wj
42、; struGraph.pData=DATA; /struGraph.pData=nGraphBuf3+20; struGraph.uDataMode=DATAUINTMODE; struGraph.uDataLength=128; struGraph.uMaxValue=20000; struGraph.uWindowX0=0; struGraph.uWindowY0=0; struGraph.uWindowX1=240; struGraph.uWindowY1=128; struGraph.nOriginX=0; struGraph.nOriginY=0; struGraph.uLineM
43、ode=LINEMODE; LCDGraph(&struGraph); for ( j=0;j<20;j+ )_Delay(414); LCDSetScreenBuffer(nScreenBuffer); LCDCLS(); interrupt void adc_isr(void) Voltage_1 =Voltage1ConversionCount = AdcRegs.ADCRESULT0 >>4; Voltage_2 =Voltage2ConversionCount = AdcRegs.ADCRESULT1 >>4; Voltage1Conversio
44、nCount=Voltage1ConversionCount /4; Voltage2ConversionCount=Voltage2ConversionCount /4; nMixingConversionCount=Voltage1ConversionCount+Voltage2ConversionCount; / If 40 conversions have been logged, start over if(ConversionCount = 300) ConversionCount = 0; flage=1; else ConversionCount+; nGraphBuf1Con
45、versionCount=Voltage1ConversionCount; nGraphBuf2ConversionCount=Voltage2ConversionCount; / 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.PIEACK.all = PIEACK_GROUP1; / Acknowledge interrupt to PIE
46、 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;i<SAMPLENUMBER;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)&am
47、p;0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataIxx=dataRi;for ( i=0;i<SAMPLENUMBER;i+ )dataRi=dataIi; dataIi=0; /* following code FFT */for ( L=1;L<=7;L+ ) /* for(1) */b=1; i=L-1;while ( i>0 ) b=b*2; i-; /* b= 2(L-1) */for ( j=0;j<=b-1;j+ ) /* f
48、or (2) */p=1; i=7-L;while ( i>0 ) /* p=pow(2,7-L)*j; */p=p*2; i-;p=p*j;for ( k=j;k<128;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;
49、dataIk+b=TI+temp*sin_tabp-dataIk+b*cos_tabp; /* END for (3) */ /* END for (2) */ /* END for (1) */for ( i=0;i<SAMPLENUMBER/2;i+ ) wi=sqrt(dataRi*dataRi+dataIi*dataIi); /* END FFT */void InitForFFT()int i;for ( i=0;i<SAMPLENUMBER;i+ )sin_tabi=sin(PI*2*i/SAMPLENUMBER);cos_tabi=cos(PI*2*i/SAMPLEN
50、UMBER);匯編語言程序:k_stack_size .set 10 K_DATA_IDX_1 .set 2 K_DATA_IDX_2 .set 4 K_DATA_IDX_3 .set 8 K_TWID_TBL_SIZE .set 512 K_TWID_IDX_3 .set 128 K_FLY_COUNT_3 .set 4 K_FFT_SIZE .set 32;N=32 K_LOGN .set 5;log(N)=log(32)=5 PA0 .set 0 PA1 .set 1 sine: .usect "sine",512 cosine: .usect "cosine",512 fft_data:.usect "fft_data",2048 d_input: .usect "d_input",2048 fft_out: .usect &qu
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年貢緞蠶絲被項目可行性研究報告
- 2025-2030年(全新版)中國家用洗潔精行業(yè)前景展望及未來投資規(guī)劃研究報告
- 2025-2030年中國銅加工材市場競爭格局及投資前景規(guī)劃研究報告
- “2021年現(xiàn)代癌癥研究主要趨勢”模擬同傳口譯報告
- 2025年度酒店員工勞動合同及員工培訓(xùn)與發(fā)展計劃協(xié)議
- 2025年度輔導(dǎo)員學(xué)生團(tuán)隊協(xié)作與領(lǐng)導(dǎo)力培養(yǎng)聘用合同
- 2025年度洗浴中心客戶關(guān)系管理及滿意度提升合同
- 安寧療護(hù)中的患者護(hù)理安全考核試卷
- 寵物收養(yǎng)家庭寵物養(yǎng)護(hù)與寵物友好戶外活動考核試卷
- 2025年度展覽館消毒管理服務(wù)合同
- GB/T 24128-2018塑料塑料防霉劑的防霉效果評估
- 福建省地方標(biāo)準(zhǔn)《先張法預(yù)應(yīng)力混凝土管樁基礎(chǔ)技術(shù)規(guī)程》DBJ13-2023
- 危險作業(yè)監(jiān)護(hù)人員培訓(xùn)
- 職業(yè)病防治企業(yè)臺賬樣本
- 充電樁驗收表
- 城市水環(huán)境新型污染物的去除新技術(shù)課件
- 中長期貸款按實際投向統(tǒng)計統(tǒng)計制度
- 新媒體營銷完整版教學(xué)課件最全ppt整套教程電子講義(最新)
- 鍋爐專業(yè)2020年防非停措施
- 鼻炎營銷模式策劃書課件(PPT 40頁)
- 中國鐵塔股份有限公司通信鐵塔、機(jī)房施工及驗收規(guī)范(試行)
評論
0/150
提交評論