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