快速傅立葉變換(FFT)算法_DSP實驗_第1頁
快速傅立葉變換(FFT)算法_DSP實驗_第2頁
快速傅立葉變換(FFT)算法_DSP實驗_第3頁
已閱讀5頁,還剩45頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、快速傅立葉變換(FFT)算法實驗摘要:FFT (Fast Fourier Transformation ),即為快速傅里葉變換, 是離散傅里葉變換的快速算法,它是根據離散傅里葉變換的奇、偶、 虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。這種算法 大大減少了變換中的運算量,使得其在數字信號處理中有了廣泛的運 用。本實驗主要要求掌握在CCS環境下用窗函數法設計FFT快速傅里 葉的原理和方法;并且熟悉FFT快速傅里葉特性;以及通過本次試驗 了解各種窗函數對快速傅里葉特性的影響等。引言:快速傅里葉變換FFT是離散傅里葉變換DFT的一種快速算法。起 初DFT的計算在數字信號處理中就非常有用, 但

2、由于計算量太大,即 使采用計算機也很難對問題進行實時處理,所以并沒有得到真正的運 用。1965年J.W.庫利和T.W.圖基提出快速傅里葉變換,采用這種算 法能使計算機計算離散傅里葉變換所需要的乘法次數大為減少,特別 是被變換的抽樣點數N越多,FFT算法計算量的節省就越顯著。從此, 對快速傅里葉變換(FFT)算法的研究便不斷深入,數字信號處理這 門新興學科也隨FFT的出現和發展而迅速發展。根據對序列分解與選 取方法的不同而產生了 FFT的多種算法,基本算法是基2DIT和基2DIF FFT的出現,使信號分析從時域分析向頻域分析成為可能,極大地推動了信號分析在各領域的實際應用。FFT在離散傅里葉反變

3、換、線性 卷積和線性相關等方面也有重要應用。實驗原理:FFT并不是一種新的變換,它是離散傅立葉變換(DFT的一種 快速算法。由于我們在計算DFT時一次復數乘法需用四次實數乘法和 二次實數加法;一次復數加法則需二次實數加法。每運算一個X( k) 需要4N次復數乘法及2N+2( N-1)=2(2N-1)次實數加法。所以整個DFT運算總共需要4NT次實數乘法和N*2(2N-1)=2N(2N-1)次實數 加法。如此一來,計算時乘法次數和加法次數都是和 NT成正比的, 當N很大時,運算量是可觀的,因而需要改進對DFT的算法減少運算 速度。根據傅立葉變換的對稱性和周期性,我們可以將DFT運算中有些 項合并

4、。我們先設序列長度為N=2AL,L為整數。將N=2L的序列x(n)(n=0,1,N-1),按N的奇偶分成兩組,也就是說我們將一 個N點的DFT分解成兩個N/2點的DFT他們又從新組合成一個如下式所表達的N點DFTX( k)DFT x( n)x( n )WNnkn為偶N 2 1x( 2r )W(frkr 0N 1x(n)Wnk,0 k N 1n 0x( n )Wnkn為奇N 2 1x( 2r1)WN2r 1)kr 0N 21x( 2r )Wn2rkN 21WNkx( 2r1)WN2rkr0r 0N 21X1( n )WN2nkN 21WNkx 2( n )Wn2 nkn0n 0N 21X1( n

5、 )WNnk2N . 21WNkX2( n)WNnk2n0n 0X1(k )WNkX 2(k )N 2 1Xi(k)x/n)Mn 0其中,N2 10 k N 1X2(k)X2(n)W22n 0設x(n )為N項的復數序列,由DFT變換,任一 X (m的計算都 需要N次復數乘法和N-1次復數加法,而一次復數乘法等于四次實數 乘法和兩次實數加法,一次復數加法等于兩次實數加法,即使把一次 復數乘法和一次復數加法定義成一次“運算”(四次實數乘法和四次 實數加法),那么求出N項復數序列的X(n),即N點DFT變換大約 就需要NT次運算。當N=1024點甚至更多的時候,需要 N2=1048576 次運算,

6、在FFT中,利用WN勺周期性和對稱性,把一個N項序列(設 N=2k,k為正整數),分為兩個N/2項的子序列,每個N/2點DFT變換 需要(N/2)八2次運算,再用N次運算把兩個N/2點的DFT變換組合 成一個N點的DFT變換。這樣變換以后,總的運算次數就變成N+2*(N/2) A2=N+NA2/2O繼續上面的例子,N=1024時,總的運算次數就變成了 525312次,節省了大約50%勺運算量。而如果我們將這種“一分為二” 的思想不斷進行下去,直到分成兩兩一組的DFT運算單元,那么N點 的DFT變換就只需要Nlog2N次的運算,N在1024點時,運算量僅有 10240次,是先前的直接算法的1%點

7、數越多,運算量的節約就越大,這就是FFT的優越性。8點DFT的FFT運算流圖x(O) 工 工 工 x t % 卞wn? 乂乂 Z,嚴XX紐/7'I Xn(O)-1 巳0)< 乂血、.;軽(0)氷乂翹2)畤/弋Xu(O)XKO)t190X(l)X(2)XX(7)計算離散傅里葉變換的快速方法,有按時間抽取的FFT算法和按 頻率抽取的FFT算法。前者是將時域信號序列按偶奇分排,后者是將 頻域信號序列按偶奇分排。它們都借助于的兩個特點:一是的周期性; 另一是的對稱性,這里符號*代表其共軛。這樣,便可以把離散傅里 葉變換的計算分成若干步進行,計算效率大為提高。時間抽取算法令信號序列的長度為

8、N=2,其中M是正整數,可 以將時域信號序列x(n)分解成兩部分,一是偶數部分 x( 2n),另一是奇數部分x( 2n+1),其中。于是信號序列x(n )的離散傅里葉變換可以用兩個N/2抽樣點的離散傅里葉變換來表示和計算。一個抽樣點數為N的信號序列x(n)的離散傅里葉變換,可以由 兩個N/2抽樣點序列的離散傅里葉變換求出。依此類推,這種按時 間抽取算法是將輸入信號序列分成越來越小的子序列進行離散傅里葉變換計算,最后合成為N點的離散傅里葉變換。 N=2點的離散傅里葉變換的計算全由蝶形運算組成,需要M級運算,每級包括N/2個蝶形運算,總共有 個蝶形運算。所以,總 的計算量為次復數乘法運算和 N l

9、og2N次復數加法運算。 FFT算法按級迭代進行,N抽樣點的輸入信號具有N個原始數據xO(n),經第一級運算后,得出新的 N個數據x1(n),再經過第 二級迭代運算,又得到另外N個數據x2(n),依此類推,直至最后的 結果x(k)=xM(k)=X(k )在逐級迭代計算中,每個蝶形運算的輸出數 據存放在原來存貯輸入數據的單元中,實行所謂“即位計算”,這樣可以節省大量存放中間數據的寄存器。 蝶形運算中加權系數隨迭代級數成倍增加。對于N=8,M=3情 況,需進行三級迭代運算。在第一級迭代中,只用到一種加權系數; 蝶形運算的跨度間隔等于1。在第二級迭代中,用到兩種加權系數即、; 蝶形運算的跨度間隔等于

10、2。在第三級迭代中,用到4種不同的加權 系數即、;蝶形運算的跨度間隔等于 4。可見,每級迭代的不同加 權系數的數目比前一級迭代增加一倍;跨度間隔也增大一倍。 輸入數據序列x(n )需重新排列為x(0 )、x、x、x、x 、x、x、x,這是按照二進制數的碼位倒置所得到的反序數, 例如N=8中數“1”的二進制數為“001”,將其碼位倒轉變為“100”, 即為十進制數“ 4”。頻率抽取算法 按頻率抽取的FFT算法是將頻域信號序列 X(k) 分解為奇偶兩部分,但算法仍是由時域信號序列開始逐級運算,同樣是把N點分成N/2點計算FFT,可以把直接計算離散傅里葉變換所需 的N次乘法縮減到N/2次。頻率信號序

11、列X(21 )是時間信號序列x1(n)+x2(n )的N/2點離 散傅里葉變換,頻率信號序列X(21+1 )是時間信號序列【x1(n)-x2(n )】 的N/2點離散傅里葉變換,因此,N點離散傅里葉變換的計算,通過 兩次加(減)法和一次乘法,從原來序列獲得兩個子序列,所以,頻 率抽取算法也具有蝶形運算形式。其計算量完全和時間抽取算法一樣, 即只需次乘法運算和Nlog2N次加(減)法運算。實際上,頻率抽取算法與時間抽取算法的信號流圖之間存在著轉置關系,如將流圖適當變形,可以得出多種幾何形狀。除了基2的FFT算法之外,還有基4、基8等高基數的FFT算法以及任意數為基 數的FFT算法。、硬件框圖:“

12、數字信號處理”實驗室教學實驗箱結構圖a:DSP教學實驗W*ICEILK教學實驗箱結構圖F2812-A評估板原理框圖F2812-A評估板實物圖DSP教學實驗箱的硬件連接:1. 連接電源:打開實驗箱,取出三相電源連接線(如右圖),將電源線的一端插入實驗箱外部左惻箱壁上的電源 插孔中。確認實驗箱面板上電源總開關(位于實驗箱底板左上角)處于“關”的位置,連接電源線的另一端至 220V交流供電插座上,保證 穩固連接。2 .使用電源連接線(如右圖,插頭是帶孔的)連接各模塊 -/電源:確認實驗箱總電源斷開。連接ICETEK-CTR板上邊插座到實驗箱底板上+12V電源插座;ICETEK-CTR板下邊插座到實驗

13、箱底板上+5V電源插座;如使用 PP(并口 )型S仿真器,則連接仿真器上插座到實驗箱底板上 +5V電源插座連接DSP 評估板模塊電源插座到實驗箱底板上+5V電源插座。注意各插 頭要插到底,防止虛接或接觸不良。3. 連接DSP評估板信號線:當需要連接信號源輸出到 A/D輸入插座 時,使用信號連接線(如右圖)分別連接相應插座。4、接通電源:檢查實驗箱上220V電源插座(箱體左側)中保險管是否 完好,在連接電源線以后,檢查各模塊供電連線是否正確連接,打開 實驗箱上的電源總開關(位于實驗箱底板左上角),使開關位于“開” 的位置,電源開關右側的指示燈亮。I、軟件調試1. 實驗準備-設置軟件仿真模式。-啟

14、動CCS2. 打開工程,瀏覽程序,工程目錄為D:dspt7fftfft.pjt3. 編譯并下載程序4. 打開觀察窗口:選擇菜單View->Graph->Time/Frequency進行如下圖所示設選擇菜單View->Graph->Time/Frequency進行如下圖所示設置。選擇菜單View->Graph->Time/Frequency進行如下圖所示設置。Q藍;Uaitc:亡丄 | Meip5. 清除顯示:在以上打開的窗口中單擊鼠標右鍵,選擇彈出式菜單中“ Clear Display ” 功能。6. 設置斷點:在程序FFT.c中有注釋“ break poi

15、nt ”的語句上設置軟件斷點。7. 運行并觀察結果選擇“ Debug”菜單的“ Animate”項,或按F12鍵運行程序。觀察“ FFT'窗口中時域和頻域圖形。注意:由于實驗運算復雜,需要等一會才能看到運行完結果。8. 退出CCSII、硬件連接1.實驗準備:連接實驗設備準備信號源進行AD輸入。 取出2根實驗箱附帶的信號線(如右圖,兩端均為單聲道語音 插頭)。 用1根信號線連接實驗箱左側信號源的波形輸出 A端口和“A/D輸入”模塊的“ ADCIN0插座注意插頭要插牢、到底。這 樣,信號源波形輸出A的輸出波形即可送到ICETEK-F2812A板 的AD輸入通道0。 用1根信號線連接實驗箱左

16、側信號源的波形輸出B端口和“A/D輸入”模塊的“ ADCIN1插座注意插頭要插牢、到底。這 樣,信號源波形輸出B的輸出波形即可送到ICETEK-F2812A板 的AD輸入通道1。 設置波形輸出A:- 上下調節波形頻率選擇旋鈕,直到標有100-1KHZ的指示燈 點亮。-調節幅值調整旋鈕,將波形輸出 A的幅值調到適當位置。 設置波形輸出B:-向內側按波形頻率選擇旋鈕,直到標有正弦波的指示燈點亮。- 上下調節波形頻率選擇旋鈕,直到標有1K-10KHZ的指示燈 點亮。- 調節幅值調整旋鈕,將波形輸出 B的幅值調到適當位置。注意:由于模數輸入信號未經任何轉換就進入 DSP所以必須保 證輸入的模擬信號的幅

17、度在0-3V之間。必須用示波器檢測信號范 圍,保證最小值0V最大值3 V,否則容易損壞DSP芯片的模數采 集模塊。2 .設置 Code Composer Studio 2.21 在硬件仿真(Emulator)方式 下運行:3. 啟動 Code Composer Studio 2.21:選擇菜單 Debug->Reset CPU4. 打開工程文件:工程目錄: D:dspt8mixerfftmixerfft.pjt5 .編譯、下載程序。6. 運行程序觀察結果:按CTR空制板的K6鍵,可以顯示A B兩信號源頻譜,K7鍵實 現混頻顯示,按K8實現鍵A、B兩信號源分屏顯示。7. 退出CCS六、實驗

18、結果:七、結果分析:通過觀察軟件仿真結果中FFT窗口的時域圖形和頻域圖形可 知,由上述程序所計算出的測試波形的功率譜與 CCS計算出的快速 傅里葉變換的結果相近;通過硬件仿真結果可知,按 CTR空制板的 K6鍵,可以顯示出A、B兩信號源頻譜,按K7鍵可以實現混頻顯示, 按K8實現鍵A、B兩信號源分屏顯示。八、結束語:通過這次實驗更加深刻地理解了快速傅里葉變換的物理意義, 并且掌握了用窗函數法設計 FFT快速傅里葉變換的原理和方法,進 一步熟悉了 FFT快速傅里葉變換特性,通過對快速傅里葉變換的實 際應用了解了各種窗函數對快速傅里葉變換特性的影響。本科學習期間,通過學習數字信號處理了解到快速傅里

19、葉變換 的知識,但當時僅限于對其理論層面的理解,通過這次實驗,加強 了自己動手能力的鍛煉,使自己進一步認識到理論知識與實踐結合 起來的重要性,從而為自己以后的學習工作提供良好的發展方向。DSP原理與應用這門課程在介紹 DSPs芯片特點和應用的基 礎上,以TI公司C28x系列的TMS320F281芯片為描述對象,系統 的介紹了 DSPs芯片的基本特點、硬件結構、工作原理、開發環境和 使用方法,其中包括CPU內部結構、時鐘和系統控制、存儲空間及 通用I/O接口、中斷管理方式、片內外設、尋址方式和指令系統, 以及本實驗所用到的集成開發環境 CCS DSP最小系統和相應的軟件 設計。通過學習DSP原理

20、與應用我基本掌握了 DSPs芯片的主要知 識體系,并且通過上課老師的實物講解和課本概念的聯系,結合理 論知識和實際應用,基本建立了 DSP系統的基本概念與邏輯概念、 物理概念之間的聯系,同時通過這次實驗進一步把 DSPs的基本概念 和原理應用到了實際的DSF系統中。九、程序附錄:C語言程序代碼:程序1#i nclude "DSP281x_Device.h"/ DSP281x HeaderfileIn clude File#i nclude "DSP281x_Examples.h" / DSP281x ExamplesIn elude File#inclu

21、de "f2812a.h"#i nclude"math.h"#define PI 3.1415926#defi ne SAMPLENUMBER 128void Ini tForFFT();void MakeWave();/voidFFT(floatdataRSAMPLENUMBER,floatdatalSAMPLENUMBER);int INPUTSAMPLENUMBER,DATASAMPLENUMBER;float fWaveRSAMPLENUMBER,fWavelSAMPLENUMBER,wSAMPLENUMBER;float sin _tabSAM

22、PLENUMBER,cos_tabSAMPLENUMBER;voidFFT(floatdataRSAMPLENUMBER,floatdatalSAMPLENUMBER)int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p 丄;float TR,TI,temp;/*followi ngcode inv ert seque nee */for ( i=O;i<SAMPLENUMBER;i+)xO=x仁x2=x3=x4=x5=x6=0;x0=i&0 x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0

23、x01;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;datalxx二dataRi;for ( i=O;i<SAMPLENUMBER;i+)dataRi=datali; datali=0;*follow ing code FFT*for ( L=1;L<=7;L+ ) /* for(1) */ b=1; i=L-1; while ( i>0 ) b=b*2; i-; /* b= 2A(L-1) */for ( j=0;j<=

24、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二dataRk; Tl二datalk; temp二dataRk+b;dataRk=dataRk+dataRk+b*cos_tabp+datalk+b*sin_tabp;datalk=datalk-dataRk+b*sin_tabp+datalk+b*cos_tabp;dataRk+b=TR-dataRk+b*cos_tabp-dataI

25、k+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<SAMPLENUMBER/2;i+ )wi=sqrt(dataRi*dataRi+datali*datali); /* END FFT */mai n()int i;Ini tForFFT();MakeWave();for ( i=0;i<SAMPLENUMBER;i+ )fWaveRi=INPUTi;fWaveli=0.0f;wi=0.0

26、f;FFT(fWaveR,fWaveI);for ( i=0;i<SAMPLENUMBER;i+ )DATAi=wi;while ( 1 ); / break pointvoid In itForFFT()int i;for ( i=O;i<SAMPLENUMBER;i+)sin_tabi=si n( PI*2*i/SAMPLENUMBER);cos_tabi=cos(PI*2*i/SAMPLENUMBER);void MakeWave()int i;for ( i=0;i<SAMPLENUMBER;i+ )INPUTi=s in (PI*2*i/SAMPLENUMBER*3

27、)*1024;程序2#i nclude "DSP281x_Device.h"/ DSP281x HeaderfileIn clude File#i nclude "DSP281x_Examples.h" / DSP281x ExamplesIn elude File#include "f2812a.h"#i nclude "LCD.h"#i nclude "math.h"#defi ne ADCNUMBER 300file./ Prototype stateme nts for fun cti

28、ons found within thisin terrupt void adc_isr(void);void Delay (un sig ned int n Delay);struct struLCDGraph struGraph,struGraph1;unsigned int nScreenBuffer30*128;/ Global variables used in this example:Uint16 LoopCou nt;Uint16 ConversionCount;Uint16 Voltage11024;Uint16 Voltage21024;Ui nt16 Voltage_1,

29、Voltage_2,flage=0;Uin t16 n GraphBuf1ADCNUMBER, nGraphBuf2ADCNUMBER;int n GraphBuf3ADCNUMBER;int ci=0,keyflage, nAD;Ui nt16 n Mix in g1024;/液晶#define CTRLED (*(u nsig ned int *)0x108004) / port8004#define MCTRKE Y (*(u nsig ned int *)0x108005) / port8005#define CTRCLKE Y (*(u nsig ned int *)0x108006

30、) / port8006#define CTRSTATUS (*(u nsig ned int *)0x108000) /port8000/#defi ne pi 3.1415926int nModeAD;Uin t16 ad1,ad2;#define PI 3.1415926#defi ne SAMPLENUMBER 128int INPUTSAMPLENUMBER,DATASAMPLENUMBER;/int n GraphBuf1ADCNUMBER, nGraphBuf2ADCNUMBER;float fWaveRSAMPLENUMBER,fWavelSAMPLENUMBER;float

31、sin _tabSAMPLENUMBER,cos_tabSAMPLENUMBER;floatfDataRSAMPLENUMBER,fDatalSAMPLENUMBER,wSAMPLENUMBER;voidFFT(floatdataRSAMPLENUMBER,floatdatalSAMPLENUMBER);void Ini tForFFT();/void MakeWave();in t j,a=0;mai n()int j,uWork,uWork1;un sig ned int * pWork;InitSysCtrl();初始化 cpu/In itPII(0x5);DINT;/ 關中斷LCDTu

32、r nO ff();LCDSetScree nBuffer( nScree nBuffer);for(uWork=0,pWork=nScreenBuffer;uWork<30*128;uWork+,pWork+ )(*pWork)=0;LCDSetDelay(0);LCDTur nOn();/打開顯示LCDCLS();/清除顯示內存InitXin tf();In itPieCtrl();初始化pie寄存器/*for(j=0;j<1024;j+)Voltage1j=0;Voltage2j=0;*/IER = 0x0000;/ 禁止所有的中斷IFR = 0x0000;InitPieVe

33、ctTable(); 初始化pie中斷向量表/In terrupts that are used in this example are re-mappedto/ ISR functions found within this file.EALLOW; / This is needed to write to EALLOWrotected registerPieVectTable.ADCINT = & adc_isr;EDIS; / This is needed to disable write to EALLOWprotected registersmoduleasm("

34、RPT #10 | NOP");/ Must wait12-cycles (worst-case) for ADC reset to take effectref and ban dgap circuitsban dgap/refere nee circuitryrest of ADC/ En able ADCINT in PIENTx6 = 1;IER |= M_INT1; / En able CPU In terrupt 1EINT;/ En able Global in terrupt INTMERTM; II Enable Global realtime interrupt

35、DBGMLoopCo unt = 0;ConversionCount = 0;/ Con figure ADCAdcRegs.ADCMAXCONV.all = 0x0001;/Setup 2con v's on SEQ1AdcRegs.ADCCHSELSEQ1.bit.CONV00 =0x0;/SetupADCINA3 as 1st SEQ1 conv.AdcRegs.ADCCHSELSEQ1.bit.CONV01 =0x1;/SetupADCINA2 as 2nd SEQ1 conv.AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 =1;/En ableEVASOC

36、 to start SEQ1NT_ENA_SEQ1 = 1; / En able SEQ1in terrupt (every EOS)/ Con figure EVA/ Assumes EVA Clock is already en abled in In itSysCtrl();EvaRegs.T1CMPR = 0x0080;/ Setup T1compare valueEvaRegs.T1PR = 0x5000;/Setup periodregister/En ableEn able timer仃OADC = 1;EVASOC in EVA1 compare (upco unt mode)

37、/struGraph.uLi neMode二LINEMODE;/LCDDrawGraph(struGraph);keyflage=0;Ini tForFFT();/ Wait for ADC in terruptfor(;)j=0;uWork 仁MCTRKE Y;uWork1 &=0xff;CTRCLKE Y=0;if(uWork 仁=128)keyflage=0;if(uWork 仁=64)keyflage=1;if(uWork 仁=32)keyflage=2;if(flage=1) flage=0;LCDSetScree nBuffer( nScree nBuffer);LCDCL

38、S();/清除顯示內存*/if(keyflage=0)struGraph.pData二Voltage2;struGraph.uDataMode二DATAUINTMODE;struGraph.uDataLe ngth=256;struGraph.uMaxValue=2048;struGraph.uWi ndowX0=0;struGraph.uWi ndow Y0=0;struGraph.uWi ndowX 1二240;struGraph.uWi ndow Y1二 128;struGraph. nOrigi nX=0;struGraph. nOrigi nY=0;struGraph.uLi neM

39、ode二LINEMODE;LCDGraph(&struGraph);/ struGraph.uLi neMode二LINEMODE;struGraph.pData二Voltagel;struGraph.uDataMode二DATAUINTMODE;struGraph.uDataLe ngth=256;struGraph.uMaxValue=1024;struGraph.uWi ndowX0=0;struGraph.uWi ndow Y0=0;struGraph.uWi ndowX 仁240;struGraph.uWi ndow Y1二 128;struGraph. nOrigi nX=

40、0;struGraph. nOrigi nY=64;struGraph.uLi neMode二LINEMODE;LCDGraph(&struGraph);for ( j=0;j<20;j+ )_Delay(414);LCDSetScree nBuffer( nScree nBuffer);LCDCLS();/清除顯示內存if(keyflage=1)struGraph.pData=n Mixi ng;struGraph.uDataMode二DATAUINTMODE;struGraph.uDataLe ngth=256;struGraph.uMaxValue=2048;struGra

41、ph.uWi ndowX0=0;struGraph.uWi ndow Y0=0;struGraph.uWi ndowX 仁240;struGraph.uWi ndow Y仁 128;struGraph. nOrigi nX=0;struGraph. nOrigi nY=0;struGraph.uLi neMode二LINEMODE;LCDGraph(&struGraph);for ( j=0;j<20;j+ )_Delay(414);LCDSetScree nBuffer( nScree nBuffer);LCDCLS();if(keyflage=2)Ini tForFFT();

42、for ( j=0;j<SAMPLENUMBER;j+ )fDataRj=(Voltage1j+Voltage2j)/2.0;fDataIj=0; wj=0;FFT(fDataR,fDatal);for ( j=O;j<SAMPLENUMBER;j+ )DATAj=wj;struGraph.pData二DATA;/struGraph.pData二 nGraphBuf3+20;struGraph.uDataMode二DATAUINTMODE;struGraph.uDataLe ngth=128;struGraph.uMaxValue=20000;struGraph.uWi ndowX

43、0=0;struGraph.uWi ndow Y0=0;struGraph.uWi ndowX 仁240;struGraph.uWi ndow Y仁 128;struGraph. nOrigi nX=0;struGraph. nOrigi nY=0;struGraph.uLi neMode二LINEMODE;LCDGraph(&struGraph);for ( j=0;j<20;j+ )_Delay(414);LCDSetScree nBuffer( nScree nBuffer);LCDCLS();in terrupt void adc_isr(void)Voltage_1二V

44、oltage1Co nversio nCou ntAdcRegs.ADCRESULTO >>4;Voltage_2=Voltage2C onversionCountAdcRegs.ADCRESULT1 >>4;Voltage1C onv ersio nCou nt二Voltage1C onv ersio nCount /4;Voltage2C onversionCoun t=Voltage2C onversionCount/4;n Mixi ngC onv ersio nCoun t=Voltage1C onv ersio nCou nt+Voltage2Convers

45、ionCoun t;/If 40 conversions have been logged, start overif(Co nversio nCou nt = 300)ConversionCount = 0;flage=1;else ConversionCoun t+;n GraphBuf1C onv ersio nCoun t=Voltage1C onv ersio nCount;n GraphBuf2C onv ersio nCoun t=Voltage2C onv ersio nCoun t;II Reinitialize for next ADC sequeneeNT_SEQ1_CL

46、R = 1; II Clear INTSEQ1 bitPieCtrIRegs.PIEACK.all=PIEACK_GROUP1; IIAck no wledge in terrupt to PIE return;voidFFT(floatdatalSAMPLENUMBER)int x0,x1,x2,x3,x4,x5,x6,xx;dataRSAMPLENUMBER,floatint i,j,k,b,p 丄;float TR,TI,temp;*followi ngcode inv ertsequenee*for ( i=O;i<SAMPLENUMBER;i+) x0=x仁x2=x3=x4=x

47、5=x6=0;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;datalxx二dataRi;for ( i=0;i<SAMPLENUMBER;i+)dataRi=datali; dataIi=0;*follow ing code FFT*for ( L=1;L<=7;L+ ) /* for(1) */b=1; i=L-1;while ( i>0 )b=b*2; i-; /* b= 2A(L-1) *

48、/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二dataRk; Tl二datalk; temp二dataRk+b;dataRk=dataRk+dataRk+b*cos_tabp+datalk+b*sin_tabp;datalk=datalk-dataRk+b*sin_tabp+datalk+b*cos_tabp;dataRk+b=TR-dataRk

49、+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<SAMPLENUMBER/2;i+ )wi=sqrt(dataRi*dataRi+datali*datali); /* END FFT */void In itForFFT()int i;for ( i=O;i<SAMPLENUMBER;i+)sin_tabi=si n( PI*2*i/SAMPLENUMB

50、ER);cos_tabi=cos(PI*2*i/SAMPLENUMBER);匯編語言程序:k_stack_size.set10K_DATA_IDX_1.set2K_DATA_IDX_2.set4K_DATA_IDX_3.set8K_TWID_TBL_SIZE.set512K_TWID_IDX_3.set128K_FLY_COUNT_3.set4K FFT SIZE.set32;N=32.setK LOGN;log(N)=log(32)=5PA0.set0PA1.set1sine:.usect"si ne",512cos ine:.usect"cosi ne&quo

51、t;,512fft_data:.usect"fft_data",2048d_in put:.usect"dn put",2048fft_out:.usect"fft_out",1024k_stack.usect"STACK",k_stack_sizek_stack_bottorm.setk_stack+k_stack_size.bssd_twiddx,1.bssd_datadx,1.bssd_grps_c nt,1;.sect"fft_prg".text.copy"coeff.i nc

52、"Bit Reversal Rout ine.asgAR2,REORDERED.asgAR3,ORIGINALNPUT.asgAR7,DATA_PROC_BUF_c_in tOO: start:SSBX FRCTSTM #k_stack_bottorm,SPSTM #dnput,AR1 ;從PA1 口輸入2N個數據RPT #2*K_FFT_SIZE-1PORTRPA1,*AR1+;這部分改為偽采樣數5STM#si ne,AR1RPT#511MVPDsi nel,*AR1 +STM#cosi ne,AR1RPT#511MVPDcosi nel,*AR1 +STM #dn put,ORIGINAL_INPUTSTM #fft_data,DATA_PROC_BUFMVMM DATA_PROC_BUF,REORDEREDSTM #K_FFT_S

溫馨提示

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

評論

0/150

提交評論