靳鵬
(中國電子科技集團(tuán)公司第二十研究所,西安 710068)
作為數(shù)字信號(hào)處理中常用的一種基本處理模塊,數(shù)字濾波器在數(shù)字信號(hào)處理中有著重要地位。相比模擬濾波器,數(shù)字濾波器具有精度高、穩(wěn)定性好、設(shè)計(jì)靈活等優(yōu)點(diǎn),可以實(shí)現(xiàn)模擬器件很難達(dá)到的嚴(yán)格線性相位關(guān)系,還能避免模擬濾波器難以克服的溫度漂移、電壓漂移和噪聲等問題。常用的數(shù)字濾波器有FIR(Finite Impulse Response)濾波器和IIR(Infinite Impulse Response)濾波器。FIR濾波器在滿足設(shè)計(jì)要求的幅頻響應(yīng)的同時(shí),還可以保證嚴(yán)格的線性相位特性。并且,由于采用非遞歸結(jié)構(gòu),不論在理論上還是在實(shí)際的有限精度運(yùn)算中都是穩(wěn)定的。因此,在通信、模式識(shí)別、圖像處理、頻譜分析等領(lǐng)域都得到了廣泛的應(yīng)用[1]。
FIR濾波器的實(shí)現(xiàn)方法主要有以下幾種:專用數(shù)字濾波器集成電路、DSP和可編程邏輯器件。其中,F(xiàn)PGA的并行處理結(jié)構(gòu)和可編程特性,可以兼顧處理的實(shí)時(shí)性和設(shè)計(jì)的靈活性要求,使其成為實(shí)現(xiàn)FIR濾波器的優(yōu)良載體,得到了廣泛應(yīng)用[2]。
目前,基于FPGA實(shí)現(xiàn)FIR濾波器主要有乘累加結(jié)構(gòu)和分布式算法結(jié)構(gòu)。乘累加結(jié)構(gòu)需要使用乘法器,在乘法器資源較為緊張的情況下使用會(huì)受到限制;分布式算法利用查找表將固定系數(shù)的乘累加操作轉(zhuǎn)換成查找表操作,減少了乘法器資源的消耗。本文基于分布式算法設(shè)計(jì)了一個(gè)低通 FIR濾波器,并在FPGA上實(shí)現(xiàn)了該濾波器。
分布式算法(Distributed Arithmetic,DA),最早由Croisier于1973年提出,是一種專門針對(duì)乘加運(yùn)算的技術(shù),廣泛應(yīng)用于卷積、相關(guān)等乘積和計(jì)算中[3]。FIR濾波器是一個(gè)標(biāo)準(zhǔn)的乘加運(yùn)算,采用分布式算法來實(shí)現(xiàn)FIR濾波器可以很方便地實(shí)現(xiàn)流水線處理,提高電路的運(yùn)行速度,減小電路規(guī)模。不同于傳統(tǒng)乘加算法,分布式算法在完成乘加運(yùn)算時(shí),通過將輸入數(shù)據(jù)每一個(gè)對(duì)應(yīng)位產(chǎn)生的積預(yù)先進(jìn)行相加形成相應(yīng)的部分積,然后再對(duì)各部分積進(jìn)行累加得到最終結(jié)果。
一個(gè)典型的乘加運(yùn)算可以用式(1)表示:
式(1)中, Ak為常數(shù),xk(n)為輸入變量。xk(n)可以用B位二進(jìn)制補(bǔ)碼進(jìn)行表示:
式(2)中,xb(n)表示 x(n)的第b位,xB(n)是符號(hào)位。將式(2)帶入式(1)可得:
圖1 DA算法實(shí)現(xiàn)結(jié)構(gòu)框圖
由式(3)可以看出,這一表達(dá)式是將一個(gè)輸入項(xiàng)是常數(shù)的乘累加運(yùn)算操作轉(zhuǎn)換為查找表操作和累加,用查找表實(shí)現(xiàn)一個(gè)映射,然后再將此映射經(jīng)過相應(yīng)的二次冪加權(quán),即可得到輸出結(jié)果,其實(shí)現(xiàn)結(jié)構(gòu)框圖如圖1所示。
一個(gè)N階FIR濾波器的數(shù)學(xué)表達(dá)式如式(4)所示:
式中, ()yn為濾波器在n時(shí)刻的輸出; ()xn為濾波器的采樣輸入; ()hk為濾波器系數(shù), ()xnk-為經(jīng)過k階延遲的采樣輸入。其中濾波器系數(shù) ()hk為常數(shù),這樣就可以將式(4)轉(zhuǎn)換為式(3)所示的結(jié)構(gòu),利用分布式算法來進(jìn)行運(yùn)算,實(shí)現(xiàn)對(duì)輸入數(shù)據(jù)的濾波處理。
在設(shè)計(jì)時(shí),首先根據(jù)系統(tǒng)具體性能指標(biāo)要求,生成相應(yīng)的濾波器系數(shù),之后按照表1構(gòu)造一個(gè)查找表,該表中存儲(chǔ)著式(3)中乘積項(xiàng)所有可能的組合值。通過所有輸入變量相對(duì)應(yīng)位的組合向量對(duì)該表進(jìn)行尋址,并對(duì)輸出結(jié)果按照?qǐng)D1所示進(jìn)行二次冪加權(quán)累加,即可得到濾波器輸出結(jié)果。
在FPGA中,表1可以通過寄存器或者Rom來實(shí)現(xiàn)。查找表的深度與濾波器階數(shù)N相關(guān),當(dāng)階數(shù)較大時(shí),查找表的規(guī)模將很龐大,會(huì)消耗過多資源,并影響運(yùn)行速度,不利于實(shí)現(xiàn)。為了減小規(guī)模,可以對(duì)查找表進(jìn)行分割,利用部分表計(jì)算。由于FIR濾波器是線性濾波器,因此可以對(duì)低階濾波器的輸出進(jìn)行相加,從而得到高階濾波器的輸出。
在使用FPGA實(shí)現(xiàn)時(shí),可以將整個(gè)濾波器劃分為以下三個(gè)模塊:狀態(tài)控制模塊、輸入數(shù)據(jù)處理模塊和數(shù)據(jù)累加模塊,如圖2所示。
圖2 濾波器實(shí)現(xiàn)結(jié)構(gòu)框圖
各個(gè)模塊的功能如下:
狀態(tài)控制模塊用來產(chǎn)生其它模塊的控制信號(hào),實(shí)現(xiàn)對(duì)輸入數(shù)據(jù)處理,濾波器系數(shù)讀取和數(shù)據(jù)累加的控制,使各個(gè)模塊能按照一定的時(shí)序執(zhí)行各自的功能,完成濾波。
表1 查找表構(gòu)造規(guī)則
輸入數(shù)據(jù)處理模塊的主要功能是完成對(duì)輸入信號(hào)的處理,包括對(duì)輸入數(shù)據(jù)的串并轉(zhuǎn)換,移位寄存,為后續(xù)的處理做準(zhǔn)備。
數(shù)據(jù)累加模塊的主要功能是根據(jù)控制信號(hào)實(shí)現(xiàn)對(duì)數(shù)據(jù)的累加輸出。
本文基于分布式算法,設(shè)計(jì)了一個(gè)低通FIR濾波器,并在 FPGA中實(shí)現(xiàn)了該濾波器。在設(shè)計(jì)時(shí),首先使用MATLAB中的濾波器設(shè)計(jì)工具,設(shè)計(jì)生成一組濾波器系數(shù),并根據(jù)表1進(jìn)行查找表的構(gòu)造。之后在Xilinx公司的vivado編譯設(shè)計(jì)工具中按照?qǐng)D2所示的結(jié)構(gòu)框圖實(shí)現(xiàn)該濾波器,并完成仿真驗(yàn)證。圖3和圖4分別是在vivado中的仿真結(jié)果和將處理數(shù)據(jù)導(dǎo)入MATLAB中進(jìn)行驗(yàn)證的結(jié)果。
圖3 vivado中仿真結(jié)果
圖4 MATLAB中仿真驗(yàn)證結(jié)果
本文就 FPGA 器件實(shí)現(xiàn) FIR 數(shù)字濾波器進(jìn)行了研究,基于分布式算法設(shè)計(jì)了一個(gè)FIR濾波器,并在FPGA中實(shí)現(xiàn)了該濾波器,經(jīng)過仿真驗(yàn)證,符合設(shè)計(jì)預(yù)期。分布式算法是實(shí)現(xiàn)常系數(shù)乘累加運(yùn)算的高效方法,F(xiàn)PGA內(nèi)部有豐富的查找表和存儲(chǔ)器資源,非常適合來實(shí)現(xiàn)分布式算法,將二者結(jié)合起來可以有效應(yīng)用于FIR濾波器的設(shè)計(jì)實(shí)現(xiàn)