《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于FPGA的apFFT算法實現(xiàn)
基于FPGA的apFFT算法實現(xiàn)
來源:微型機(jī)與應(yīng)用2010年第18期
孫 林, 黃曉紅, 蔡江利
(河北理工大學(xué), 河北 唐山063000)
摘要: 全相位頻譜分析(apFFT)是傳統(tǒng)FFT的一種改進(jìn)算法,能改善FFT的柵欄效應(yīng)和截斷效應(yīng),具有頻譜泄露少,、相位不變的特性,。介紹采用FPGA器件實現(xiàn)apFFT算法,,精度高于模擬式測量,并且適用性強(qiáng),、成本低,,所得到的QuratusII仿真結(jié)果與Matlab軟件仿真結(jié)果一致,。
Abstract:
Key words :

摘  要: 全相位頻譜分析(apFFT)是傳統(tǒng)FFT的一種改進(jìn)算法,能改善FFT的柵欄效應(yīng)和截斷效應(yīng),具有頻譜泄露少,、相位不變的特性,。介紹采用FPGA器件實現(xiàn)apFFT算法,精度高于模擬式測量,,并且適用性強(qiáng),、成本低,所得到的QuratusII仿真結(jié)果與Matlab軟件仿真結(jié)果一致,。
關(guān)鍵詞: 現(xiàn)場可編程門陣列,; 全相位快速傅里葉變換; 頻譜泄露; 相位不變性

    全相位頻譜分析apFFT(all phase FFT)是近幾年提出的頻譜分析方法,,該方法具有比傳統(tǒng)FFT更優(yōu)良的頻譜抑制性能,;具有“不變性">相位不變性”,該性質(zhì)意味著即使是在“不同步采樣的情況”,無需借助任何附加的校正措施即可精確提取出信號相位信息,因而在相位計的設(shè)計、激光測距,、雷達(dá)等多個應(yīng)用領(lǐng)域具有較高的實用價值,。對于apFFT 的理論研究已有一些論文,但是硬件實現(xiàn)此算法的研究還很少見,。本文對此新型頻譜分析算法用FPGA來實現(xiàn),,并進(jìn)行了仿真和分析。
    目前,,通常采用兩種途徑通過硬件方式實現(xiàn)FFT算法:(1)使用DSP器件實現(xiàn);(2)通過FPGA器件實現(xiàn),。一般來說,DSP器件多用于數(shù)字信號處理領(lǐng)域,,而且開發(fā)過程相對簡單,,易于實現(xiàn),但速度較慢,,無法完成對速度要求較高的算法,。而FPGA器件由于內(nèi)部嵌入了硬件乘法器、可編程寄存器和M4K內(nèi)存塊,,在速度上具有明顯的優(yōu)勢,。考慮到apFFT對速度要求較高,,故選用FPGA器件作為硬件開發(fā)平臺,。
1 全相位頻譜分析
    apFFT理論推導(dǎo)詳見參考文獻(xiàn)[1,2],本文以FFT點數(shù)N=3點為例簡化此頻譜分析圖如圖1,。其中的卷積窗wc=[wc(-N+1),…, wc(-1), wc(0), wc(1),…, wc(N-1) ] 由兩個長度為N的對稱窗卷積而來,,用這個長為(2N-1)的卷積窗wc 對輸入樣本加窗后,再將間隔為N的兩數(shù)據(jù)平移相加生成N個數(shù)據(jù)y(n) (n=0,1,…,N-1),,最后對y(n)進(jìn)行FFT 即得譜分析結(jié)果,。

2 軟硬件簡介
 在FPGA開發(fā)過程中,常用的是VHDL和Verilog HDL語言,。VHDL語言比較適合做大型的系統(tǒng)級設(shè)計,而Verilog HDL則適合邏輯級,、門級設(shè)計,。所以,考慮到兩種語言各自特點,,本文選用VHDL語言完成設(shè)計,。
 采用FPGA實現(xiàn)apFFT算法,對硬件資源要求較高,,故開發(fā)芯片選擇Altera公司的EP2C35F672C8,。該芯片內(nèi)部包含有33 216個邏輯單元,105個M4K RAM模塊,,以及18 bit×18 bit嵌入式乘法器,。
    軟件選用Altera公司開發(fā)的QuartusII平臺,。該軟件提供了豐富的開發(fā)工具供用戶使用,可以完成代碼輸入,、編譯、仿真以及下載到芯片的全部功能,。
3 apFFT模塊設(shè)計
 本文所設(shè)計的apFFT模塊由三部分構(gòu)成,,分別為:地址發(fā)生模塊、數(shù)據(jù)存儲模塊和FFT運(yùn)算模塊,。各個模塊間的關(guān)系如圖2所示,。

3.1 地址發(fā)生模塊
 為了保證測試數(shù)據(jù)能夠完整無誤地輸入到EP2C35F672C8,需要選擇合適的存儲地址來保存數(shù)據(jù),。本文以做8點FFT為例,,所涉及的所有數(shù)據(jù)總線寬度均為8 bit,序列長度取15 bit,。為了保證15 bit的存儲數(shù)據(jù)都能夠及時存儲到寄存器中,需要至少4 bit的地址總線才能滿足設(shè)計需求,。
 地址發(fā)生模塊的結(jié)構(gòu)體部分程序如圖3所示。


   編譯通過之后,,得到的Symbol文件如圖4所示,。


3.2存儲器設(shè)計
3.2.1 數(shù)據(jù)存儲器

 由于輸入數(shù)據(jù)由總線寬度為8 bit的實部和虛部兩部分構(gòu)成,所以需要雙口RAM對數(shù)據(jù)進(jìn)行存儲,。這樣設(shè)計的優(yōu)勢在于能夠很好地將輸入數(shù)據(jù)按其順序輸入到FFT核當(dāng)中,而且方便對不同地址的數(shù)據(jù)進(jìn)行實時調(diào)用,。
 在對模塊設(shè)計過程中,可以直接調(diào)用QuratusII里的MegaWizard Plus-In Manager工具定制RAM,。定制過程中,,需要對RAM的控制線、地址線和數(shù)據(jù)線進(jìn)行選擇,,這里選擇地址線寬度為4 bit,,輸入,、輸出數(shù)據(jù)線寬度為8 bit,讀取時鐘信號rdclock同時控制讀地址和RAM的輸出。
    在該存儲器中,,時鐘信號wrclock和rdclock分別控制隨機(jī)存儲器的寫,、讀狀態(tài),均為高電平有效,。同時,,wrclock和rdclock作為寫、讀數(shù)據(jù)的地址發(fā)生器工作,。即對wrclock和rdclock的上升沿進(jìn)行計數(shù),,并根據(jù)計數(shù)結(jié)果產(chǎn)生相應(yīng)的地址位。生成的數(shù)據(jù)存儲器如圖5所示,。

    需要注意的是,,由于EP2C35F672C8屬于CycloneII器件,在調(diào)用RAM模塊時,,必須做如下設(shè)置:選擇Assignments→Setting命令,,在彈出的對話框中選擇Analysis & Synthesis Settings下的Default Parameters選項,并在該選項的Name文本框中輸入CYCLONEII_SAFE_WRITE,;在Default Setting文本框中輸入VERIFIED_SAFE,,并分別點擊Add和OK按鈕關(guān)閉Settings窗口。這樣才能在最后綜合以及仿真時,,得到正確的結(jié)果,。
3.2.2 窗函數(shù)存儲器
    apFFT相比傳統(tǒng)FFT,最大的區(qū)別在于其FFT運(yùn)算模塊輸入數(shù)據(jù)是經(jīng)過預(yù)處理的數(shù)據(jù),,而非采集電路直接采集到的數(shù)據(jù),。在進(jìn)行數(shù)據(jù)預(yù)處理的過程中, 非常重要的部分就是窗系數(shù)的選擇,。以N=8點FFT為例,, 全相位輸入數(shù)據(jù)是2N-1=15個, 采集余弦函數(shù)的15個數(shù)據(jù)為: -0.173 65,-0.990 27,,-0.438 37,,0.719 34,0.882 95,,-0.173 65,,-0.990 27,-0.438 37,,0.719 34,,0.88 295,-0.173 65,-0.990 27,-0.438 37,,0.719 34,,0.882 95。
    按照參考文獻(xiàn)[1,,2] 選擇的窗函數(shù)為: 0.013 684,, 0.096 665,0.346 18,, 0.846  66,, 1.590 8,2.431 7,, 3.111 8,,3.375,3.111 8,,2.431 7,,1.590 8,0.846 66,,0.346 18,,0.096 665,0.013 684,。將窗函數(shù)轉(zhuǎn)換為8 bit二進(jìn)制的形式,,并存儲到只讀存儲器當(dāng)中以方便運(yùn)算,。如圖6所示,。

    將輸入數(shù)據(jù)經(jīng)加窗處理并疊加后,在matlab中得到的結(jié)果為:-1.479 5,,2.236 1,,2.051 3,-0.428 0,,-0.229 4,,1.252 9,-0.352 7,,-3.069 4,。此時, 在QuartusII中得到的結(jié)果為-1.236 8,, 2.339 7,, 2.004 9, -0.402 9,, -0.180 3,, 1.118 6,-0.348 5,-2.985 6,??梢钥闯鰞烧哂幸欢ǖ恼`差,其原因是在QuartusII中得到的結(jié)果是以二進(jìn)制形式表示,,在轉(zhuǎn)換過程中存在一定的量化誤差,。
3.2.3量化誤差
    在FPGA中實現(xiàn)算法,一般要對十進(jìn)制的小數(shù)進(jìn)行量化,,即將十進(jìn)制的小數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),,并運(yùn)用二進(jìn)制補(bǔ)碼表示,兼顧舍入誤差,,由于將十進(jìn)制小數(shù)轉(zhuǎn)換為二進(jìn)制比較繁瑣,,現(xiàn)編寫matlab程序進(jìn)行轉(zhuǎn)換:下面是將整數(shù)部分不為零的十進(jìn)制的小數(shù)轉(zhuǎn)換為二進(jìn)制小數(shù)的部分程序:
  function [num,numint,numf]=dectobin1(innum,N);
  %clc;clear;close all;
  %十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)
  %輸入為十進(jìn)制數(shù)innum,以及小數(shù)部分的位數(shù)N
  %輸出為三個參數(shù)num,numint,numf
  %num為輸出的二進(jìn)制形式
  %numint為整數(shù)部分的二進(jìn)制表達(dá)式
  %numf為小數(shù)部分的二進(jìn)制表達(dá)式
  sep=5;%整數(shù)和小數(shù)部分的分隔符
  if(mod(innum,1)==0)%判斷輸入是否為整數(shù),mod為取余函數(shù)
      numint=dec2bin(innum);
      numint=double(numint)-48;
      numf=zeros(1,N);
      num=[numint,sep,numf];
      return
  end;
  %輸入為非整數(shù)的情況
  nint=floor(innum);%整數(shù)部分
  nf=innum-nint;%小數(shù)部分
  res_nint=dec2bin(nint);
  res_nint=double(res_nint)-48;
  res_nf=dectobin(nf,N);
  numint=res_nint;
  numf=res_nf;
  num=[numint,sep,numf];
    在FPGA中只能進(jìn)行定點運(yùn)算,根據(jù)對系數(shù)的量化誤差及有效字長效應(yīng),,對加卷積窗的系數(shù)進(jìn)行量化,,所有的系數(shù)均采用二進(jìn)制補(bǔ)碼的形式表示,也就是采用有符號的八位二進(jìn)制補(bǔ)碼表示,,在量化過程中,,由于計算相對復(fù)雜,工作量比較大,,如果采用手工計算來進(jìn)行量化顯然是不可取的,,而且也容易出現(xiàn)錯誤,為此利用前面為量化誤差編寫的程序進(jìn)行量化,,這樣大大減少了工作量,,提高了工作效率。而且在設(shè)計中系數(shù)還具有線性相位的特性,,利用這一特性更加減少計算的工作量,。
    對系數(shù)進(jìn)行量化的數(shù)值如表1所示。

3.3  FFT運(yùn)算模塊
    這里的FFT模塊,,可以通過兩種方式得到,。
    第一種是自己編寫一個FFT算法的子程序,編譯通過后將該子程序打包成一個Symbol文件,,并在最后的頂層文件中進(jìn)行調(diào)用,。這種方法的好處在于對FFT的算法能夠很好表達(dá),并根據(jù)需要進(jìn)行靈活修改,,缺點是開發(fā)周期較長,,硬件資源利用率不是太高。
    第二種設(shè)計方法是安裝Altera公司提供的IP核,,并對其進(jìn)行相應(yīng)的參數(shù)設(shè)定,。這種開發(fā)方法的好處在于簡單易用,,并且能夠很好利用硬件資源。缺點是由于該核包含知識產(chǎn)權(quán),,商用時需繳納一定版權(quán)費(fèi)用,。考慮到本設(shè)計尚處于研究階段,,故選擇后一種開發(fā)方式,,也便于減少硬件資源的消耗。在使用IP核的過程中需要對FFT核的參數(shù)進(jìn)行設(shè)置,,過程分為三步:參數(shù)設(shè)定(Parameterize),,仿真設(shè)定(Set Up simulation)以及產(chǎn)生FFT核(Generate)。
4 編譯及仿真
 對最終的頂層文件進(jìn)行編譯,,并對其進(jìn)行時序仿真,。其仿真結(jié)果如圖7所示。

 在圖7中,,可看到最終仿真之后得到的波形情況,,圖中所有值均以二進(jìn)制形式顯示。
 本設(shè)計所得到的硬件仿真結(jié)果與Matlab軟件仿真得到的結(jié)果基本一致,,說明apFFT的FPGA的可行性,。下一步將對此設(shè)計進(jìn)行改進(jìn),可以根據(jù)FFT點數(shù)實時地對apFFT模塊進(jìn)行參數(shù)化設(shè)置,。
    最終設(shè)計的FFT模塊使用了2 755個邏輯單元,,僅占硬件資源的8%??梢娫撛O(shè)計的資源耗用與直接對數(shù)據(jù)進(jìn)行FFT運(yùn)算的資源耗用大體相當(dāng),,apFFT和FFT計算效率分別是NlogN+2N和NlogN+N。因為apFFT相對于傳統(tǒng)的FFT,,雖然采樣點數(shù)多了N-1,,但最終都用一個N階FFT實現(xiàn),,而計算量主要體現(xiàn)在FFT中,。在不增加FFT點數(shù)情況下,硬件資源耗用沒有明顯增加,,但相對于傳統(tǒng)的FFT可以降低頻譜泄露,,并且用apFFT測相位不用任何校正,所以在后續(xù)開發(fā)做頻譜分析或者相位計時計算量會很小,,有利于實時實現(xiàn),。
參考文獻(xiàn)
[1] 王兆華, 侯正信, 蘇飛. 全相位FFT頻譜分析[J]. 通信學(xué)報, 2003, 24(11A): 16-19.
[2] 黃曉紅,王兆華. 一種減少泄漏的新型譜估計方法[J]. 信號處理,,2007,,23(1):144-147.
[3] 胡廣書. 數(shù)字信號處理理論、算法與實現(xiàn).第2版[M]. 北京:清華大學(xué)出版社,2003.
[4] UWE M B. Digital signal processing with field programmable gate arrays[M].New York:Springer-Veriag Berlin Heidelberg, 2003.
[5] (美)阿森頓(Ashenden P J.).VHDL設(shè)計指南.第二版[M].葛紅,譯.北京:機(jī)械工業(yè)出版社,,2005.
[6] 曾繁泰,,陳美金.VHDL程序設(shè)計[M]. 北京:清華大學(xué)出版社,2007:5-22.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。