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