FPGA在apFFT算法中的實(shí)現(xiàn)
出處:孫 林, 黃曉紅, 蔡江利 發(fā)布于:2011-08-26 22:55:49
傳統(tǒng)FFT利用三角函數(shù)的正交性,將信號(hào)分離出來,從而將時(shí)域的信號(hào)變換到頻域。但是,它有一個(gè)很重要的前提:輸入的序列必須是周期內(nèi)等間隔采樣的值,這樣,F(xiàn)FT計(jì)算的結(jié)果才是我們想要的。傳統(tǒng)FFT的結(jié)果可以通過一些算法實(shí)現(xiàn)頻譜校正,如重心法、比值法等等。但都是基于FFT的結(jié)果,有限。全相位FFT算法是天津大學(xué)的王兆華和候正信教授提出的,具有初始相位不變和有效防止頻譜泄露的特性,并有相應(yīng)的matlab程序。對(duì)于apFFT 的理論研究已有一些論文,但是硬件實(shí)現(xiàn)此算法的研究還很少見。本文對(duì)此新型頻譜分析算法用FPGA來實(shí)現(xiàn),并進(jìn)行了仿真和分析。
目前,通常采用兩種途徑通過硬件方式實(shí)現(xiàn)FFT算法:(1)使用DSP器件實(shí)現(xiàn);(2)通過FPGA器件實(shí)現(xiàn)。一般來說,DSP器件多用于數(shù)字信號(hào)處理領(lǐng)域,而且開發(fā)過程相對(duì)簡(jiǎn)單,易于實(shí)現(xiàn),但速度較慢,無法完成對(duì)速度要求較高的算法。而FPGA器件由于內(nèi)部嵌入了硬件乘法器、可編程寄存器和M4K內(nèi)存塊,在速度上具有明顯的優(yōu)勢(shì)。考慮到apFFT對(duì)速度要求較高,故選用FPGA器件作為硬件開發(fā)平臺(tái)。
1 全相位頻譜分析
FFT(Fast Fourier Transformation),即為快速傅氏變換,是離散傅氏變換的快速算法,它是根據(jù)離散傅氏變換的奇、偶、虛、實(shí)等特性,對(duì)離散傅立葉變換的算法進(jìn)行改進(jìn)獲得的。它對(duì)傅氏變換的理論并沒有新的發(fā)現(xiàn),但是對(duì)于在計(jì)算機(jī)系統(tǒng)或者說數(shù)字系統(tǒng)中應(yīng)用離散傅立葉變換,可以說是進(jìn)了一大步。
apFFT理論推導(dǎo)詳見參考文獻(xiàn),本文以FFT點(diǎn)數(shù)N=3點(diǎn)為例簡(jiǎn)化此頻譜分析圖如圖1.其中的卷積窗wc=[wc(-N+1),…, wc(-1), wc(0), wc(1),…, wc(N-1) ] 由兩個(gè)長(zhǎng)度為N的對(duì)稱窗卷積而來,用這個(gè)長(zhǎng)為(2N-1)的卷積窗wc 對(duì)輸入樣本加窗后,再將間隔為N的兩數(shù)據(jù)平移相加生成N個(gè)數(shù)據(jù)y(n) (n=0,1,…,N-1),對(duì)y(n)進(jìn)行FFT 即得譜分析結(jié)果。

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

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

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

3.2存儲(chǔ)器設(shè)計(jì)
存儲(chǔ)器(Memory)是計(jì)算機(jī)系統(tǒng)中的記憶設(shè)備,用來存放程序和數(shù)據(jù)。計(jì)算機(jī)中全部信息,包括輸入的原始數(shù)據(jù)、計(jì)算機(jī)程序、中間運(yùn)行結(jié)果和終運(yùn)行結(jié)果都保存在存儲(chǔ)器中。它根據(jù)控制器指定的位置存入和取出信息。有了存儲(chǔ)器,計(jì)算機(jī)才有記憶功能,才能保證正常工作。按用途存儲(chǔ)器可分為主存儲(chǔ)器(內(nèi)存)和輔助存儲(chǔ)器(外存),也有分為外部存儲(chǔ)器和內(nèi)部存儲(chǔ)器的分類方法。外存通常是磁性介質(zhì)或光盤等,能長(zhǎng)期保存信息。內(nèi)存指主板上的存儲(chǔ)部件,用來存放當(dāng)前正在執(zhí)行的數(shù)據(jù)和程序,但僅用于暫時(shí)存放程序和數(shù)據(jù),關(guān)閉電源或斷電,數(shù)據(jù)會(huì)丟失。
3.2.1 數(shù)據(jù)存儲(chǔ)器
由于輸入數(shù)據(jù)由總線寬度為8 bit的實(shí)部和虛部?jī)刹糠謽?gòu)成,所以需要雙口RAM對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。這樣設(shè)計(jì)的優(yōu)勢(shì)在于能夠很好地將輸入數(shù)據(jù)按其順序輸入到FFT核當(dāng)中,而且方便對(duì)不同地址的數(shù)據(jù)進(jìn)行實(shí)時(shí)調(diào)用。
在對(duì)模塊設(shè)計(jì)過程中,可以直接調(diào)用QuratusII里的MegaWizard Plus-In Manager工具定制RAM.定制過程中,需要對(duì)RAM的控制線、地址線和數(shù)據(jù)線進(jìn)行選擇,這里選擇地址線寬度為4 bit,輸入、輸出數(shù)據(jù)線寬度為8 bit,讀取時(shí)鐘信號(hào)rdclock同時(shí)控制讀地址和RAM的輸出。
在該存儲(chǔ)器中,時(shí)鐘信號(hào)wrclock和rdclock分別控制隨機(jī)存儲(chǔ)器的寫、讀狀態(tài),均為高電平有效。同時(shí),wrclock和rdclock作為寫、讀數(shù)據(jù)的地址發(fā)生器工作。即對(duì)wrclock和rdclock的上升沿進(jìn)行計(jì)數(shù),并根據(jù)計(jì)數(shù)結(jié)果產(chǎn)生相應(yīng)的地址位。生成的數(shù)據(jù)存儲(chǔ)器如圖5所示。

需要注意的是,由于EP2C35F672C8屬于CycloneII器件,在調(diào)用RAM模塊時(shí),必須做如下設(shè)置:選擇Assignments→Setting命令,在彈出的對(duì)話框中選擇Analysis & Synthesis Settings下的Default Parameters選項(xiàng),并在該選項(xiàng)的Name文本框中輸入CYCLONEII_SAFE_WRITE;在Default Setting文本框中輸入VERIFIED_SAFE,并分別點(diǎn)擊Add和OK按鈕關(guān)閉Settings窗口。這樣才能在綜合以及仿真時(shí),得到正確的結(jié)果。
3.2.2 窗函數(shù)存儲(chǔ)器
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點(diǎn)FFT為例, 全相位輸入數(shù)據(jù)是2N-1=15個(gè), 采集余弦函數(shù)的15個(gè)數(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)制的形式,并存儲(chǔ)到只讀存儲(chǔ)器當(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.此時(shí), 在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(Field-Programmable Gate Array),即現(xiàn)場(chǎng)可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)。FPGA一般來說比ASIC(專用集成芯片)的速度要慢,無法完成復(fù)雜的設(shè)計(jì),而且消耗更多的電能。但是他們也有很多的優(yōu)點(diǎn)比如可以快速成品,可以被修改來改正程序中的錯(cuò)誤和更便宜的造價(jià)。廠商也可能會(huì)提供便宜的但是編輯能力差的FPGA.因?yàn)檫@些芯片有比較差的可編輯能力,所以這些設(shè)計(jì)的開發(fā)是在普通的FPGA上完成的,然后將設(shè)計(jì)轉(zhuǎn)移到一個(gè)類似于ASIC的芯片上。另外一種方法是用CPLD(復(fù)雜可編程邏輯器件備)。
在FPGA中實(shí)現(xiàn)算法,一般要對(duì)十進(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
%輸出為三個(gè)參數(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)行定點(diǎn)運(yùn)算,根據(jù)對(duì)系數(shù)的量化誤差及有效字長(zhǎng)效應(yīng),對(duì)加卷積窗的系數(shù)進(jìn)行量化,所有的系數(shù)均采用二進(jìn)制補(bǔ)碼的形式表示,也就是采用有符號(hào)的八位二進(jìn)制補(bǔ)碼表示,在量化過程中,由于計(jì)算相對(duì)復(fù)雜,工作量比較大,如果采用手工計(jì)算來進(jìn)行量化顯然是不可取的,而且也容易出現(xiàn)錯(cuò)誤,為此利用前面為量化誤差編寫的程序進(jìn)行量化,這樣大大減少了工作量,提高了工作效率。而且在設(shè)計(jì)中系數(shù)還具有線性相位的特性,利用這一特性更加減少計(jì)算的工作量。
對(duì)系數(shù)進(jìn)行量化的數(shù)值如表1所示。

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

在圖7中,可看到終仿真之后得到的波形情況,圖中所有值均以二進(jìn)制形式顯示。
本設(shè)計(jì)所得到的硬件仿真結(jié)果與Matlab軟件仿真得到的結(jié)果基本一致,說明apFFT的FPGA的可行性。下一步將對(duì)此設(shè)計(jì)進(jìn)行改進(jìn),可以根據(jù)FFT點(diǎn)數(shù)實(shí)時(shí)地對(duì)apFFT模塊進(jìn)行參數(shù)化設(shè)置。
終設(shè)計(jì)的FFT模塊使用了2 755個(gè)邏輯單元,僅占硬件資源的8%.可見該設(shè)計(jì)的資源耗用與直接對(duì)數(shù)據(jù)進(jìn)行FFT運(yùn)算的資源耗用大體相當(dāng),apFFT和FFT計(jì)算效率分別是NlogN+2N和NlogN+N.因?yàn)閍pFFT相對(duì)于傳統(tǒng)的FFT,雖然采樣點(diǎn)數(shù)多了N-1,但終都用一個(gè)N階FFT實(shí)現(xiàn),而計(jì)算量主要體現(xiàn)在FFT中。在不增加FFT點(diǎn)數(shù)情況下,硬件資源耗用沒有明顯增加,但相對(duì)于傳統(tǒng)的FFT可以降低頻譜泄露,并且用apFFT測(cè)相位不用任何校正,所以在后續(xù)開發(fā)做頻譜分析或者相位計(jì)時(shí)計(jì)算量會(huì)很小,有利于實(shí)時(shí)實(shí)現(xiàn)。
參考文獻(xiàn):
[1]. N-1 datasheet http://www.hbjingang.com/datasheet/N-1_1997158.html.
[2]. Memory datasheet http://www.hbjingang.com/datasheet/Memory_1082507.html.
[3]. EP2C35F672C8 datasheet http://www.hbjingang.com/datasheet/EP2C35F672C8_2559049.html.
[4]. CPLD datasheet http://www.hbjingang.com/datasheet/CPLD_1136600.html.
[5]. clear datasheet http://www.hbjingang.com/datasheet/clear_2527248.html.
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識(shí)介紹2025/8/29 16:58:56
- SQL核心知識(shí)點(diǎn)總結(jié)2025/8/11 16:51:36
- 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
- 基于PID控制和重復(fù)控制的復(fù)合控制策略2025/7/29 16:58:24
- 什么是樹莓派?一文快速了解樹莓派基礎(chǔ)知識(shí)2025/6/18 16:30:52
- 高速PCB信號(hào)完整性(SI)設(shè)計(jì)核心實(shí)操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計(jì)算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對(duì)系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護(hù)設(shè)計(jì)
- 連接器耐腐蝕性能測(cè)試方法
- PCB電磁兼容(EMC)設(shè)計(jì)與干擾抑制核心實(shí)操規(guī)范
- 用于相位噪聲測(cè)量的低通濾波器設(shè)計(jì)與本振凈化技術(shù)
- MOSFET在高頻開關(guān)中的EMI問題
- 電源IC在便攜式設(shè)備中的設(shè)計(jì)要點(diǎn)
- 連接器結(jié)構(gòu)設(shè)計(jì)常見問題分析









