張 繁
(上海諾基亞貝爾股份有限公司,江蘇 南京 210037)
數(shù)字濾波器的設計與實現(xiàn)在無線通信數(shù)字信號領域有著廣泛的應用。我們在學習和研究數(shù)字濾波器的原理和設計的同時,在FPGA中實現(xiàn)高效而又省資源的數(shù)字濾波器,對工程實現(xiàn)有著十分重要的意義。
數(shù)字濾波器是對數(shù)字信號實現(xiàn)濾波的線性時不變離散系統(tǒng)。它的實質是一個運算過程,即輸入的數(shù)字信號序列通過特定的運算轉變?yōu)檩敵龅臄?shù)字序列。時域上兩個序列的線性卷積相當于在頻域上其相應的頻譜序列的乘積。濾波從本質上來說,就是濾波器沖激響應的傅里葉變換所得到信號頻譜的乘積。
插值是在保持信號頻譜內容不變的情況下提高信號采樣率。插值的第一步是在每個有效的輸入采樣之間插入L-1個零值采樣點,從而把采樣率提高L倍。這使得原始信號的頻譜延拓L-1次,這個過程即為“采樣率擴展”。插值之后,頻域上信號頻譜的形狀不變。最后將插入零采樣值的輸入流通過低通濾波器,濾波器的通帶位于原始信號頻譜位置,濾波器輸出所有延拓頻譜。
半帶(half-band)插值濾波器是一種特殊的低通FIR數(shù)字濾波器,通帶和阻帶關于二分之一Nyquist頻率對稱,因為有近一半的濾波器系數(shù)為0,用來實現(xiàn)數(shù)字濾波可以大幅度減少運算量,有利于濾波器的實時實現(xiàn)。圖1為脈沖響應,圖2為多相劃分。圖3為充分利用系數(shù)數(shù)據(jù)中0項的優(yōu)化體系結構。
圖1 脈沖響應
圖2 多相劃分
圖3 對0項優(yōu)化后的半帶插值濾波器結構
SRL16E實際上是查找表LUT的另一種操作模式,如圖4所示。
圖4 SRL16E 基本結構
16個配置單元被組織成一個移位寄存器連接到多路復用器(multiplexer)。多路復用器根據(jù)A[3:0]從16個單元中選擇一個作為輸出。
眾所周知,Xilinx FPGA SRL最基本的用法就是用于移位寄存器或data delay。如果一個數(shù)據(jù)要delay 10個周期,那么如果用寄存器打拍法需要打10拍,即需要10個D觸發(fā)器,需要占用5個Slice。而如果使用SRL16E來實現(xiàn),不僅用法簡單,而且只需要占用一個SLICEM。而這里我們要運用的是它的另一種advanced場景:FIR Filter application。如圖5所示,在這里,SRL16E構成了FIR filter的抽頭。
在這種應用下,移位寄存器和多路復用器是完全獨立的。在CLK和CE信號的控制下,移位寄存器會從D input讀取數(shù)據(jù),而Q output則完全取決于A[3:0]的選擇。時序如圖6所示。
圖5 FIR Filter Logic
圖6 FIR Filter timing
在該模式下,CE和A[3:0]的值不是固定不變,而是根據(jù)設計需要,CE為脈沖,在CE為高時,SRL16E會讀取DIN的數(shù)據(jù),然后當CE為低后,緊接著根據(jù)A[3:0]的值來決定Q輸出哪個抽頭。如圖 6所示,Shift Enable為 CE, Counter為 A[3:0],而Scan Data則為Q輸出。
在本例中,我們對Half-band插值濾波器采用SRL16E FIR Filter及DSP48E來構造。跟往常我們在輸入數(shù)據(jù)處插值不一樣,這里先通過濾波器計算出插值數(shù)據(jù),根據(jù)插值數(shù)據(jù)特征,再進行2倍插入。可以節(jié)省FPGA一半乘法器的資源。
我們先假設參數(shù):
Fs = 122.88MHz (output)
Number of taps = 15.
Filter Taps:[c0,0,c1 0,c2 0,c3 m,c3,0,c2,0,c1,0,c0],其中 m =1。
首先按照常規(guī)Half-band插值模式進行計算:
①.輸入數(shù)據(jù)為61.44Msps,輸入數(shù)據(jù)為:
d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12…
②.對輸入數(shù)據(jù)進行插值得到122.88Msps新輸入數(shù)據(jù):
d0,0,d1,0,d2,0,d3,0,d4,0,d5,0,d6,0,d7,0,d8,0,d9,0,d10 0,d11,0,d12…
而系數(shù)為:
[c0,0,c1,0,c2,0,c3,m,c3,0,c2,0,c1,0,c0]
③.在122.88M數(shù)據(jù)率下按照如下方式進行卷積計算插值:
如圖7所示,輸出序列為y0,y1,y2,y3,y4,y5,……
y0=d0*c0+0*0+d1*c1+0*0+d2*c2+0*0+d3*c3+0*m+d4*c3+0*0+d5*c2+0*0+d6*c1+0*0+d7*c0=(d0+d 7)*c0+(d1+d6)*c1+(d2+d5)*c2+(d3+d4)*c3
y1=d3*m=d3
y2=d1*c0+0*0+d2*c1+0*0+d3*c2+0*0+d4*c3+0*m+d5*c3+0*0+d6*c2+0*0+d7*c1+0*0+d8*c0=(d1+d 8)*c0+(d2+d7)*c1+(d3+d6)*c2+(d4+d5)*c3
y3=d4*m=d4
y4=d2*c0+0*0+d3*c1+0*0+d4*c2+0*0+d5*c3+0*m+d6*c3+0*0+d7*c2+0*0+d8*c1+0*0+d9*c0=(d2+d 9)*c0+(d3+d8)*c1+(d4+d7)*c2+(d5+d6)*c3
y5=d5*m=d5
圖7 Half-band插值濾波器計算過程
因為系數(shù)是對稱的,所以FPGA在進行最優(yōu)化設計實現(xiàn)時采取了如下方法:DSP48E中提供A和D輸入進行pre addition。先算出y0,y2,y4,y6,…的插值序列(phase0序列,61.44 Msps數(shù)據(jù)率),再與y1,y3,y5,y7,……的序列(phase1序列,61.44 Msps數(shù)據(jù)率)合路,完成最終完整的122.88 Msps的輸出序列y0,y1,y2,y3,y4,y5,……。如圖8所示。
圖8 DSP48E 計算內插值
圖9 FPGA實現(xiàn)最優(yōu)Half-band插值過程
插值過程如圖9所示。根據(jù)FPGA實現(xiàn)最優(yōu)Half-band插值過程圖,我們可以看到,在對半帶插值濾波器進行0項優(yōu)化結構之后,再根據(jù)系數(shù)對稱的特征進行優(yōu)化處理,還能再進一步節(jié)省一半的乘法器資源。
用Questasim仿真軟件對FPGA代碼進行仿真。SRL16E_0及SRL16E_1產(chǎn)生的輸出分別送給DSP48E的A跟D輸入,并計算出插值結果phase0_data(61.44Msps)。仿真結果如圖10所示。Phase0與原輸入phase1_data(61.44Msps)進行插值,最終得到data_out(122.88Msps),仿真結果如圖11所示。
圖10 DSP48E仿真結果
圖11 插值仿真結果
除了根據(jù)系數(shù)對稱的特點進行優(yōu)化,在條件允許下,還能對乘法器進行時分復用,以進一步節(jié)省乘法器資源,這對于一些資源緊張的FPGA設計來說是一種非常有用的方式。有效利用FPGA的資源結構,抓住設計特點進行FPGA最優(yōu)化設計對工程實現(xiàn)具有十分重要的意義。