設(shè)計(jì)數(shù)字下變頻器的抽取濾波器是一項(xiàng)艱巨任務(wù)。本文介紹一種能夠完成此項(xiàng)任務(wù)的簡(jiǎn)便、易于理解的流程。
過去半年有幾位客戶請(qǐng)我?guī)椭麄冊(cè)O(shè)計(jì)和實(shí)現(xiàn)數(shù)字下變頻器所用的降采樣(即“抽取”)濾波器,這種濾波器在軟件無線電與數(shù)據(jù)采集類應(yīng)用中都很常見。這項(xiàng)工作即便對(duì)于經(jīng)驗(yàn)豐富的設(shè)計(jì)師也不是一件小事。事實(shí)上,僅僅算出在FGPA中實(shí)現(xiàn)濾波器所需要的資源可能就是一個(gè)很大的問題。雖然MATLAB?(MathWorks 開發(fā))具有用于濾波器設(shè)計(jì)與分析 (FDA) 的絕妙工具箱,但是它提供太多濾波器設(shè)計(jì)方法,會(huì)讓新用戶無從下手。另外,您必須能夠根據(jù)DSP理論解釋MATLAB命令產(chǎn)生的結(jié)果,僅僅這一點(diǎn)就需要研究。
拋開理論的細(xì)枝末節(jié),讓我們開始圍繞上述問題探討降采樣有限脈沖響應(yīng) (FIR) 濾波器的設(shè)計(jì)與實(shí)現(xiàn)。本輔導(dǎo)資料實(shí)際上旨在向您介紹一種簡(jiǎn)便、易于理解的流程——從濾波器系數(shù)生成到FGPA目標(biāo)器件中抽取濾波器的實(shí)現(xiàn)。所需工具只有MATLAB較新版本(本人仍在使用R2008a)及其FDA工具箱、以及ISE? 11.4套件提供的賽靈思CORE GeneratorTM工具。這些工具是設(shè)計(jì)多速率FIR濾波器的必備工具。
特別是我們將探討固定降采樣速率變化的兩個(gè)實(shí)例:整數(shù)值與有理值。您應(yīng)當(dāng)能夠把我們?cè)诒据o導(dǎo)資料介紹的MATLAB指令和CoreGen圖形用戶界面 (GUI) 設(shè)置應(yīng)用到您的設(shè)計(jì)當(dāng)中。為了說明公用邏輯塊 (CLB) Slice 、18KB內(nèi)存RAM塊(BRAM) 和DSP48乘法累加 (MAC) 單元等方面的資源占用情況,我們將采用 XC6VLX75T-2ff484 作為目標(biāo) FPGA 器件。
整數(shù)倍降采樣器假設(shè)基帶中進(jìn)行解調(diào)后按250MHz速率傳輸帶寬只有2.5MHz的信號(hào)。我們必須過濾從2.5MHz到 250MHz 的所有頻率,因?yàn)樗鼈儾粋鬏斎魏斡杏?a target="_blank">信息;這正是我們準(zhǔn)備設(shè)計(jì)和實(shí)現(xiàn)的低通 FIR 濾波器的目的。根據(jù)尼奎斯特定理,輸出數(shù)據(jù)速率是信號(hào)帶寬的兩倍;因此,我們需要按照M=50的整數(shù)倍對(duì)其執(zhí)行降采樣。我將介紹兩種采用多級(jí)濾波方法的可行備選實(shí)現(xiàn)方案:第一種方法采用三個(gè)串聯(lián)的 FIR 抽取濾波器,而第二種方法則同時(shí)采用級(jí)聯(lián)積分梳狀 (CIC) 濾波器與FIR濾波器。
以下是用于設(shè)計(jì)理想濾波器的MATLAB代碼。我們假設(shè)通帶和阻帶頻率的衰減分別為0.1dB和100dB。
假設(shè)FPGA時(shí)鐘頻率Fclk=Fs_in,那么在Virtex?-6器件中我們需要多少個(gè)DSP48 MAC單元?它是用于按M進(jìn)行降采樣的濾波器。根據(jù)FIR Complier 5.0數(shù)據(jù)手冊(cè) (fir_compiler_ds534.pdf) 詳細(xì)闡述的理論,我們可以把DSP48 MAC分成M個(gè)相位,因此引入“多相”這一術(shù)語。由于每個(gè)相位都是按更低的輸出頻率 Fs_out 進(jìn)行處理,因此可以按時(shí)分復(fù)用方式共享DSP48 MAC。以下理論計(jì)算表明,F(xiàn)IR-Compiler在通過多相分解方式實(shí)現(xiàn)濾波器時(shí)采用最小的22個(gè)MAC單元(total_num_MAC_ref )。濾波器長度是2100 (total_num_coeff),填寫0成為M的整數(shù)倍。請(qǐng)注意:此方案考慮系數(shù)對(duì)稱性。
在MATLAB中可以輕松按低通濾波建立抽取過程模型,然后按M降采樣,最終分別產(chǎn)生y與y_filt輸出信號(hào)。不過,在FPGA器件中,這種實(shí)現(xiàn)方式效率不高:它會(huì)很笨地計(jì)算隨后必須拋棄的值。相反,多相抽取器把輸入信號(hào)降采樣到M個(gè)wk通道,每個(gè)通道由其自身的子濾波器ph(k,:) 過濾。部分結(jié)果y_out(k,:) 然后匯總在一起組成最終輸出y_tot。把y_tot與本機(jī)MATLAB指令產(chǎn)生的基準(zhǔn) y 對(duì)比,結(jié)果表明最終輸出均處于數(shù)值精度3e-15范圍內(nèi)(由于不同運(yùn)算階數(shù)而出現(xiàn)偏差)。
為了設(shè)計(jì)參考濾波器,CoreGen FIR-Compiler需要名為“COE 文件”的系數(shù)文本文件。以下MATLAB例程說明如何以十進(jìn)制基數(shù)輕松生成此 COE 文件;FIR-Compiler 然后按照所采用的設(shè)置量化相關(guān)系數(shù)。
圖1與圖2說明FIR-Compiler GUI頭兩個(gè)頁面所應(yīng)用的設(shè)計(jì)參數(shù);在最后兩個(gè)頁面我只需接受其默認(rèn)值,但是“優(yōu)化目標(biāo) (Optimization Goal)”除外, 我把它設(shè)為“速度 (Speed)”而非“區(qū)域 (Area)”。如無明確說明,我在本文件以及下面例子中始終采用上述設(shè)置。在完成ISE 11.4布局布線之后,參考單級(jí)降采樣濾波器占用以下FPGA資源:
Slice觸發(fā)器數(shù)量:1,265 個(gè)
Slice LUT數(shù)量:1,744 個(gè)
占用的 Slice數(shù)量:502 個(gè)
DSP48單元數(shù)量:22 個(gè)
圖 1. 50整數(shù)降采樣?
圖 2. 50整數(shù)降采樣?
三個(gè)FIR濾波級(jí)串聯(lián)
現(xiàn)在我們以濾波級(jí)串聯(lián)方式實(shí)現(xiàn)理想抽取濾波器。這種方法可以讓我們通過時(shí)分復(fù)用節(jié)省MAC單元,因?yàn)槊總€(gè)新的濾波級(jí)都是按前一級(jí)提供的較低數(shù)據(jù)速率運(yùn)行。我讓FDA工具決定最佳濾波類型:利用 MATLAB 指令信息,您可以看出:它會(huì)提出三級(jí)解決方案建議,其抽取因數(shù)分別是M1=2、M2=5和M3=5。
圖3顯示了組成上述多級(jí)系統(tǒng)的三個(gè)濾波器的頻率響應(yīng)。藍(lán)色曲線代表第一個(gè)降采樣濾波器(M1=2);綠色曲線代表第二個(gè)濾波器 (M2=5),按Fs_in/M1倍數(shù)周期波動(dòng);而紅色曲線則代表第三個(gè)降采樣器 (M3=5),按Fs_in/(M1*M2)倍數(shù)周期波動(dòng)。
圖 3. 通過串聯(lián)三個(gè)FIR濾波級(jí)進(jìn)行的按 50 整數(shù)抽取,此處單獨(dú)放大顯示0~25MHz頻率。
用于三級(jí)濾波器的FIR-Compiler設(shè)置與圖1及圖2所示大同小異。第一個(gè)濾波器唯一不同的參數(shù)是COE文件名和“抽取率值”,其分別設(shè)為filt1_rad10.coe和M1=2。第二個(gè)濾波器COE文件名是filt2_rad10.coe,抽取率值為M2=5,輸入采樣頻率此時(shí)為125MHz,因?yàn)榈诙?jí)按M1=2抽取來自第一級(jí)的輸入數(shù)據(jù)。最后,第三個(gè)濾波器參數(shù)的唯一區(qū)別是COE文件名為filt3_rad10.coe,抽取率值為M3=5,輸入采樣頻率此時(shí)為25MHz,因?yàn)榈谌?jí)按M2=5抽取來自第二級(jí)的輸入數(shù)據(jù)。
在布局布線后,三個(gè)濾波級(jí)占用以下FPGA資源:
第一級(jí)(M1=2):
Slice觸發(fā)器數(shù)量:280 個(gè)
Slice LUT數(shù)量:208 個(gè)
占用 Slice數(shù)量:62 個(gè)
DSP48 MAC單元數(shù)量:3個(gè)
第二級(jí)(M2=5):
Slice觸發(fā)器數(shù)量:236個(gè)
Slice LUT數(shù)量:168 個(gè)
占用 Slice數(shù)量:60 個(gè)
DSP48 MAC單元數(shù)量:3 個(gè)
第三級(jí)(M3=5):
Slice觸發(fā)器數(shù)量:357 個(gè)
Slice LUT數(shù)量:414 個(gè)
占用 Slice數(shù)量:158 個(gè)
DSP48 MAC單元數(shù)量:4 個(gè)
由于采用上述多級(jí)方法,我們現(xiàn)在比參考濾波器最初的22個(gè)DSP48 MAC單元少用了12個(gè)單元;與單級(jí)理想濾波器占用資源相比,我們節(jié)約了30%左右的觸發(fā)器,55%的LUT,44%的slice和54%的DSP48單元。
與CIC濾波器串聯(lián)
另一種按50抽取的可行方法是把級(jí)聯(lián)積分梳狀 (CIC) 濾波器 和CIC補(bǔ)償降采樣級(jí)串聯(lián)在一起,其變化速率分別為M1=10與M2=5。CIC濾波器是一類特殊的FIR濾波器,由N個(gè)梳狀濾波器和積分器組成(因此產(chǎn)生“第 N 級(jí)”術(shù)語)。盡管梳狀濾波器仍然可以實(shí)現(xiàn)成一種“傳統(tǒng)的”基于MAC的FIR濾波器,不過CIC架構(gòu)之所以有趣是因?yàn)樗恍枰魏蜯AC單元,因此可以用CLB sclice替代DSP48單元,參閱CoreGen CIC-Compiler 1.3數(shù)據(jù)手冊(cè)(cic_compiler_ds613.pdf)。
按M1=10抽取的第一級(jí)CIC濾波器頻率響應(yīng)較差,因此需要采用一個(gè)按M2=5抽取的補(bǔ)償FIR濾波器,以彌補(bǔ)第一級(jí)CIC濾波器本身通帶的下降。以下MATLAB代碼說明如何采用FDA工具設(shè)計(jì)此類濾波器。
圖4為賽靈思CoreGen CICCompiler 1.3 GUI設(shè)置的第一個(gè)頁面;其它參數(shù)采用默認(rèn)值,“使用Xtreme DSP Slice”可選參數(shù)除外?
圖 4. 按10抽取的CIC濾波器的設(shè)置?
其允許采用或不采用DSP48單元實(shí)現(xiàn)梳狀濾波器。FIR Compiler GUI中的CIC補(bǔ)償FIR濾波器設(shè)計(jì)參數(shù)與圖1及圖2所示相同;唯一不同的設(shè)置是 COE 文件名(此處是ciccomp_ dec5.coe),抽取率值為M2=5,而輸入采樣頻率為25MHz。
在布局布線后,兩個(gè)濾波級(jí)占用以下FPGA資源:
第一級(jí)(按10抽取的CIC濾波器,不使用“采用Xtreme DSP Slice”)
Slice 觸發(fā)器數(shù)量:755 個(gè)
Slice LUT 數(shù)量:592 個(gè)
占用 Slice 數(shù)量:172 個(gè)
DSP48 MAX 單元數(shù)量:0 個(gè)
第一級(jí)(按10抽取的CIC 波器,使用“采用 Xtreme DSP Slice”)
Slice 觸發(fā)器數(shù)量:248 個(gè)
Slice LUT 數(shù)量:154 個(gè)
占用 Slice 數(shù)量:42 個(gè)
DSP48 MAC 單元數(shù)量:7 個(gè)
第二級(jí)(按5抽取的CIC補(bǔ)償FIR濾波器)
Slice 觸發(fā)器數(shù)量:271 個(gè)
Slice LUT 數(shù)量:312 個(gè)
占用 Slice 數(shù)量:114 個(gè)
DSP48 MAC 單元數(shù)量:3 個(gè)
兩種結(jié)果都很有趣,而是否選擇使用Xtreme DSP slice取決于設(shè)計(jì)人員最需要節(jié)約哪些資源。我個(gè)人選擇“采用Xtreme DSP Slice”選項(xiàng)。與單級(jí)濾波器相比,我們可以節(jié)約大約59%的觸發(fā)器,73%的LUT,69%的slice和54%的DSP48 MAC單元。代價(jià)是阻帶衰減更差,其現(xiàn)在是80dB,而非所需要的100dB,如圖5所示。某項(xiàng)設(shè)計(jì)是否接受該衰減值事實(shí)上與應(yīng)用相關(guān)。
圖 5. 三個(gè)降采樣器的頻率響應(yīng) - 整體速率變化為50,圖中顯示了放大的1.5~3MHz頻段。單級(jí)濾波器為藍(lán)色,三級(jí)濾波器(比例分別為M1=2、M2=5、M3=5)為綠色,基于CIC的二級(jí)濾波器(比例分別為M1=10、M2=5)為紅色。
圖5對(duì)比上述三種按50降采樣方法:?jiǎn)渭?jí)、三級(jí)(比例為 2-5-5)和CIC濾波器與CIC補(bǔ)償FIR濾波器串聯(lián)(比例為10-5)。
有理數(shù)降采樣
在此第二個(gè)應(yīng)用示例中,我們假設(shè)信號(hào)輸入數(shù)據(jù)速率是50MHz,其必須降采樣到12MHz,因此其需要采用L/M=6/25 的有理數(shù)固定速率變化(換句話說,抽取因數(shù)為M/L=25/6)。FPGA時(shí)鐘頻率假設(shè)為150MHz。
如FIR-Compiler 5.0數(shù)據(jù)手冊(cè)所解釋,采用有理數(shù)速率變化的濾波器理論上需要兩個(gè)處理步驟:按L插值,然后是按M抽取。在我們這個(gè)具體例子中,一旦輸入信號(hào)按L=6插值,輸出虛擬采樣速率 Fv 就會(huì)變?yōu)?00MHz。因此,必須過濾掉Fs_in/2=25MHz與Fv/2=150MHz之間的頻段,以濾除Fs_in整數(shù)倍之處的頻譜。在DSP術(shù)語中其稱為“圖像”,這正是采用插值“抗成像”低通濾波器的原因。
在上述處理步驟之后、按M最終降采樣之前,我們需要采用低通濾波器濾除從Fv/(2*M)=6MHz到Fv/2=150MHz的頻率,其在DSP術(shù)語中稱為“混疊”。由于這兩個(gè)低通濾波器是串聯(lián)在一起并且按相同的虛擬數(shù)據(jù)速率Fv運(yùn)行,因此我們可以使用帶寬較低的濾波器同時(shí)執(zhí)行抗成像與抗混疊,從而節(jié)約資源。在我們的例子中,具有最低帶寬的濾波器是抽取濾波器。
以下MATLAB片段說明如何使用單級(jí)濾波器設(shè)計(jì)和模擬上述降采樣器。我們假設(shè)通帶和阻帶頻率衰減分別為0.05dB和70dB。
請(qǐng)注意:此MATLAB代碼只是有理數(shù)降采樣濾波器的行為模型。在實(shí)際硬件多相架構(gòu)中,您只需實(shí)現(xiàn)一個(gè)單相濾波器,然后改變每個(gè)新輸出采樣的系數(shù)即可(按Fclk速率執(zhí)行處理)。其不同于采用整數(shù)比的多相降采樣濾波器。
圖6說明FIR-Compiler GUI第一個(gè)頁面的設(shè)置。其它三個(gè)頁面本人采用與第一個(gè)整數(shù)降采樣應(yīng)用例子相同的參數(shù)。布局布線后的總體FGPA資源占用情況如下:
Slice觸發(fā)器數(shù)量:547 個(gè)
Slice LUT數(shù)量:451個(gè)
占用 Slice數(shù)量:153個(gè)
DSP48單元數(shù)量:13
BRAM單元數(shù)量:6個(gè)
圖 6. 25/6有理數(shù)降采樣?
多級(jí)方法
FIR-Complier已經(jīng)為這種多相L/M=6/25濾波器生成了非常小的內(nèi)核。不過,我們需要再次采用多級(jí)方法,因?yàn)檫@種方
法使我們能夠進(jìn)一步節(jié)約DSP48與BRAM。在手動(dòng)設(shè)計(jì)多級(jí)系統(tǒng)時(shí), 如本例所示,所有濾波級(jí)都必須采用與參考濾波器相同的通帶頻率 (Fpass)。
各級(jí)通帶紋波均相等,是由參考濾波器通帶紋波除以級(jí)數(shù)算出。各級(jí)的差異是阻帶頻率。第一級(jí)無需在Fstop截止,因
為轉(zhuǎn)換帶寬會(huì)變得太急促(太多系數(shù));現(xiàn)實(shí)中我們所需要的只是讓第一級(jí)在Fstop1=Fs_in/M1- Fs_in/(2M/L)截止。實(shí)際上Fs_in/M1與其所有倍數(shù)此時(shí)都是放置所有復(fù)本的新采樣頻率,而Fs_in/(2*M1)是Fs_in/M1中第一個(gè)復(fù)本的帶寬的一半。以下是相關(guān)MATLAB代碼。
由于第一級(jí)是M1=4整數(shù)降采樣器, 因此其FIRCompiler GUI設(shè)置與圖1所示非常相似。唯一不同的參數(shù)是COE文件名(即dec_L1_M4_rad10.coe)、抽取率值(M1=4)、輸入采樣頻率 (50 MHz) 和時(shí)鐘頻率 (150 MHz)。另一方面,第二級(jí)采用 L2/M2=24/25 有理數(shù)速率變化,因此,F(xiàn)IR-Compiler設(shè)置與圖6所示大同小異。此處COE文件名為dec_L24_M25_rad10.coe,插值速率值設(shè)為L2=24,而輸入采樣頻率為12.5 MHz。
在布局布線之后,上述兩個(gè)濾波級(jí)占用以下FPGA資源:
第一級(jí)(L1/M1= 1/4):
Slice 觸發(fā)器數(shù)量:321 個(gè)
Slice LUT數(shù)量:223 個(gè)
占用 Slice數(shù)量:62 個(gè)
DSP48 MAC單元數(shù)量:4 個(gè)
BRAM單元數(shù)量:0 個(gè)
第二級(jí)(L2/M2 = 24/25):
Slice觸發(fā)器數(shù)量:206 個(gè)
Slice LUT數(shù)量:209 個(gè)
占用 Slice數(shù)量:68 個(gè)
DSP48 MAC單元數(shù)量:3 個(gè)
BRAM單元數(shù)量:1 個(gè)
由于采用多級(jí)方法,與單級(jí)理想濾波器資源占用相比,我們現(xiàn)在可以節(jié)約 3% 左右的觸發(fā)器,4%的LUT,15%的Slice,46%的DSP48以及83%的BRAM單元。尤其是我們只需少得多的MAC與BRAM單元,分別只有6個(gè)和5個(gè)。原因是第二個(gè)濾波器以更低的輸入采樣頻率運(yùn)行,而采用整數(shù)速率變化的第一個(gè)濾波器可以充分利用系數(shù)對(duì)稱。
其它資源
我們?cè)诒据o導(dǎo)資料中介紹了兩個(gè)降采樣濾波器例子,一個(gè)是整數(shù)系數(shù)(50),另一個(gè)是有理數(shù)系數(shù)(25/6),而且
本文強(qiáng)調(diào)了在MATLAB設(shè)計(jì)濾波器以及采用FIR-Compiler和CIC-Compiler 在賽靈思FGPA中實(shí)現(xiàn)它們的方法。相關(guān)數(shù)據(jù)手冊(cè)詳細(xì)介紹采用CORE Generator實(shí)現(xiàn)濾波器所涉及的參數(shù)設(shè)置。
評(píng)論