基于DSP實(shí)現的插值查找表的簡(jiǎn)便方法
如果數字信號處理器內核沒(méi)有您需要的確切功能,可使用插值查找表(ILUT)來(lái)解決這一問(wèn)題。
本文引用地址:http://dyxdggzs.com/article/257449.htm作為賽靈思的現場(chǎng)工程師,我常常問(wèn)這樣的問(wèn)題:我們是否能夠提供一款其功能可滿(mǎn)足客戶(hù)所有獨特設計要求的DSP內核。有時(shí)候內核會(huì )太大,太小或者不夠快。有時(shí),我們會(huì )開(kāi)發(fā)一款能確切滿(mǎn)足客戶(hù)需求的內核,并迅速以CORE Generator商標推出。不過(guò)即便在這種情況下,客戶(hù)仍然想要一套特定的DSP功能,而且刻不容緩。在這些情況下,我常常建議他們使用我們器件中的插值查找表來(lái)定制他們的DSP功能。
查找表(LUT)實(shí)質(zhì)上是一個(gè)存儲元件,能夠根據任何給定的輸入狀態(tài)組合,“查找”輸出,以確保每個(gè)輸入都有確切的輸出。采用LUT來(lái)實(shí)現DSP功能具有一些重大優(yōu)勢:
● 可用諸如MATLAB或Simulink等高抽象層編程語(yǔ)言改變LUT內容。
● 可以設計一項DSP功能來(lái)運行那些采用離散邏輯運算將極度困難的數學(xué)函數,比如y=log(x)、y=exp(x)、y=1/x、y=sin(x)等。
● LUT還可輕松執行在可配置邏輯塊(CLB)芯片,以及嵌入式乘法單元或DSP48可編程乘法累加(MAC)單元方面可能要求過(guò)多FPGA資源的復雜數學(xué)函數。
不過(guò),以這種方式使用LUT當然也會(huì )存在一些弊端。當您使用LUT來(lái)實(shí)現DSP功能時(shí),您必須使用塊RAM(BRAM)元件。若執行函數y=sqrt(x)(其中x表示16位輸入,y表示18位輸出),每個(gè)變量則需要約64個(gè)18KB BRAM單元。如果,比如說(shuō),您的目標是實(shí)現小型化Spartan器件,或者您有太多的運算需要執行,無(wú)法為每個(gè)變量省出64個(gè)BRAM單元,建議您放棄這種需要如此大量BRAM單元的方法,從系統架構的角度來(lái)看,這種方法代價(jià)太大。
插值LUT方法不僅具有LUT方法在實(shí)現DSP功能時(shí)所帶來(lái)的各種優(yōu)勢,而且無(wú)需使用太多BRAM單元。采用這種方法,您可以使用來(lái)自容量較小的LUT(比如,1000字LUT)的連續輸出,線(xiàn)性地對其內插,以模擬更大容量的LUT。這樣,您就可以實(shí)現比1000字LUT更高的數值分辨率。此外,通過(guò)這種方法,僅需1個(gè)BRAM、1個(gè)嵌入式乘法器(或DSP48),以及少數幾個(gè)CLB芯片便可實(shí)施控制邏輯,因此LUT的使用成本變得更加合理化。而且,從信噪比的角度來(lái)看,其數值精度也是非常讓人滿(mǎn)意。
當然,應用插值LUT(ILUT)方法需要一定的技巧。舉例來(lái)說(shuō),采用該方法執行y=sqrt(x)函數時(shí),可以清楚地顯示ILUT在空間占用、時(shí)序和數值精度方面的性能。我們先大致看一下這個(gè)示例,然后我再講解部分實(shí)例,說(shuō)明如何使用這種方法來(lái)滿(mǎn)足客戶(hù)截然不同的需求,比如讓傳遞函數呈非線(xiàn)性的傳感器實(shí)現線(xiàn)性化,以及實(shí)施自適應有限脈沖響應(FIR)濾波器以消除合成孔徑雷達(SAR)圖像上的斑點(diǎn)噪聲。
使用System Generator for DSP進(jìn)行設計
為在賽靈思FPGA上實(shí)施DPS算法,我借助了采用MathWorks Simulink基于模型設計方法的System Generator for DSP設計與綜合工具。 System Generator得益于賽靈思在Simulink環(huán)境中的DSP模塊組,可自動(dòng)調用CORE Generator為DSP構建塊生成高度優(yōu)化的網(wǎng)表。Simulink是一種雙精度浮點(diǎn)設計工具,而System Generator則是一款定點(diǎn)運算工具。不管怎樣,您只要將這兩種工具協(xié)同使用,就可以定義每個(gè)信號的總位數以及每個(gè)信號的二進(jìn)制位置,從而在定點(diǎn)運算中巧妙處理分數。仿真結果周期精確、位真,因此您可以方便地將它們與MATLAB腳本或Simulink模塊生成的浮點(diǎn)參考值相比較,以檢查量化誤差。
圖1顯示了System Generator中ILUT方案的頂層結構圖。為讓這個(gè)方法盡可能一般化,假設nx=16位中的輸入變量x的取值范圍為0≤x1,因此其格式為 “無(wú)符號16位加上二進(jìn)制點(diǎn)右邊的16位”,也稱(chēng)為Ufix_16_16格式。最高有效位(MSB)和最低有效位(LSB)模塊分別對應輸入數據 nb=10的最高位和nx-nb=6的最低位。這些信號被命名為x0和dx。y=sqrt(x)輸出則以ny=17位二進(jìn)制數表示,格式為:Ufix_17_17。
圖2顯示了1000字小容量LUT通過(guò)雙端口RAM模塊的部署步驟。由于該模塊系只讀存儲器,布爾常數模塊We_const強制將寫(xiě)入歸零。信號X0和X0+1則用作ROM表上后續的兩個(gè)地址。Data_const模塊的零常數定義了任何ROM字的大小(即本例中的ny)。
下面的公式顯示了以x0為x的最高有效位的情況下,如何在兩個(gè)已知點(diǎn)(x0,y0)和(x1,y1)之間插入坐標為(x,y)的點(diǎn):
注意X1和X0是這個(gè)小容量LUT的相鄰地址,它們之間只隔了一個(gè)最低有效位。由于這個(gè)小容量LUT的地址空間為nb位,那么該LSB的值為 2-nb。內插步驟見(jiàn)圖3。“Reinterpret”模塊在不改變二進(jìn)制表示法的情況下,可改變dx=x-x0信號。其重置了二進(jìn)制小數點(diǎn)(從 UFix_6_0到UFix_6_6格式),并輸出nx-nb位二進(jìn)制數的一個(gè)分數,從而計算出(x-x0)/2-nb的值。
從硬件角度來(lái)看,這些模塊什么都不占用??偟膩?lái)說(shuō)(且根據我們通過(guò)ILUT方法應用的函數類(lèi)型),如果y1=0且y0=0,我們可以強制y1- y0=1,這樣我們就可以得到1/2-nb而不是0。我們采用Mux、Rational、Constant和Constant1模塊來(lái)執行這項工作。剩下的Mult、Add和Sub模塊則執行線(xiàn)性?xún)炔骞?。在本例中,我強制Mult模塊的輸出信號為17位分辨率,而非理論上要求的23位,因為總體數值精度對本試驗來(lái)說(shuō)已經(jīng)足夠。此外,由于y=sqrt(x)函數呈單調遞增,因此所有結果都無(wú)符號。換句話(huà)說(shuō),不同的函數需要對數據類(lèi)型進(jìn)行不同的精心調整,但不會(huì )與圖3所示的原理相去甚遠。
合成孔徑雷達相關(guān)文章:合成孔徑雷達原理
評論