薛治天,王正茂,楊宇飛,郝思源
(合肥市合肥工業(yè)大學,安徽合肥,230000)
由于數(shù)據(jù)格式是與精度和資源消耗相關的,現(xiàn)有方案大多選取自定義的數(shù)據(jù)格式以在降低邏輯資源消耗同時保證擬合精度,而工程應用中常用的是IEEE754標準的32bit單精度浮點格式,使得這種方法設計的模塊再與其它模塊進行運算時,需要進行數(shù)據(jù)格式轉(zhuǎn)換,通信代價較大;若采用單精度浮點格式,采用以上現(xiàn)有方案,則難以達到逼近精度要求。
根據(jù)切比雪夫定理給出,若 f (x)∈ C[a,b]存在n次的最佳一致逼近多項式(x)的充要條件是區(qū)間[a,b]上至少存在n+ 2 個交錯點 { x1,x2, ...,xn+2}使得 f (x) ?(x)在這些點上正負相間的取得最值,即滿足:
切比雪夫定理從理論上給出了最佳一致逼近多項式的特性,而且給出了尋求最佳一致逼近多項式的方法,但是尋求交錯點組十分困難。Remez于1957年,采用逐次逼近的思想,提出了一個求連續(xù)函數(shù)的最佳一致逼近多項式的近似算法,取得了良好效果。
Remez提出的近似算法由以下三步構成:
在[a,b]上選 n + 2 個由小到大排列的初始點列{x1, x2, ...,xn+2}作為近似交錯點組,并設置精度ε>0;
利用上式求解方程組(2)得近似多項式和近似偏差En′(f,x);則迭代終止;否則,若取得中的點,構成一新的近似交錯組。使在新點組在 f (x) ? p*n(x)上仍然正負相間,返回步驟(2)。
針對sigmoid函數(shù)的最佳逼近,我們對傳統(tǒng)的remez算法進行一定的改進以提高算法效率。
針對步驟(1),由于sigmoid函數(shù)的最佳逼近函數(shù)實際交錯點在區(qū)間內(nèi)近似均勻分布,故取均分區(qū)間的點作為初始近似交錯點組,減少迭代步數(shù)。
針對步驟(3),傳統(tǒng)的remez算法采用單一交換法,用 x*點取代{xi}中的點。我們采用同時交換法,對于求區(qū)間的最值,由于誤差函數(shù)連續(xù)可導且容易得到其導函數(shù),故采用牛頓法找到誤差導函數(shù)列 Ki(x) =( x) ?(x) xi≤x ≤ xi+1的零點列,可以證明該點列即為所求的{}點列。
圖1 流程圖
綜合考慮逼近的精確程度以及硬件實現(xiàn)的特殊性,我們在區(qū)間[0,10]分為10段逼近模塊,10段區(qū)間分別為[0,0.5][0.5,1] [1,1.5] [1.5,2] [2,3] [3,4] [4,5] [5,6] [6,8][8,10]
得到如下的逼近多項式:
表1 Sigmoid函數(shù)各段逼近多項式
根據(jù)Sigmoid函數(shù)的性質(zhì)可知在區(qū)間[10,+∞]和[-∞,-10]距離1和0的誤差小于。如果總體誤差控制在以內(nèi),三次多項式就可以達到要求。為了便于硬件二進制處理,選擇區(qū)域左右端點均為2的冪次。
EEE754標準中規(guī)定float單精度浮點數(shù)在機器中表示用1位表示數(shù)字的符號,用8位來表示指數(shù),用23位來表示尾數(shù),即小數(shù)部分。
IEEE754標準中,一個規(guī)格化32位的浮點數(shù)x的真值表示為:
其中尾數(shù)域表示的值是1.M。因為規(guī)格化的浮點數(shù)的尾數(shù)域最左位總是1,故這一位不予存儲,而認為隱藏在小數(shù)點的左邊。在計算指數(shù)e時,對階碼E的計算采用源碼的計算方式,因此32位浮點數(shù)的8bits的階碼E的取值范圍是0到255。其中當E為全0或者全1時,是IEEE754規(guī)定的特殊情況。
圖2 分段最佳一致逼近函數(shù)
32位單精度浮點數(shù)的階碼E由8位表示,取值范圍為0-255,去除0和255這兩種特殊情況,那么指數(shù)e的取值范圍就是1-127=-126到254-127=127。階碼的二進制位數(shù)決定浮點數(shù)的表示范圍,尾數(shù)的二進制位數(shù)表示浮點數(shù)的精度。32位浮點數(shù)尾數(shù)域有23位。那么浮點數(shù)以二進制表示的話精度是23位,23位所能表示的最大數(shù)是223-1=8388607,所以十進制的尾數(shù)部分最大數(shù)值是8388607,也就是說尾數(shù)數(shù)值超過這個值,float將無法精確表示,所以float最多能表示小數(shù)點后7位,但絕對能保證的為6位,也即float的十進制的精度為為6~7位。這樣的數(shù)據(jù)表示格式可以滿足我們對于計算范圍和精度的要求。
流水線結構(pipeline architecture)是指在系統(tǒng)處理數(shù)據(jù)時,每個時鐘脈沖都接受下一條處理數(shù)據(jù)的指令。流水線機構提高了系統(tǒng)處理數(shù)據(jù)的速度,同時對時序有嚴格的要求。
在仿真測試階段,通過輸入?yún)^(qū)間范圍內(nèi)的一組穩(wěn)定遞增的數(shù)據(jù),每過3個周期輸入一個data值,采用的流水線結構第一組數(shù)據(jù)會在24個周期后輸出擬合值,我們與手工計算的實際值作比較,精度達到了10-6數(shù)量級,滿足預期值。
圖3 流水線架構實現(xiàn)
本實施例中基于Remez算法的Sigmoid函數(shù)硬件高效率實現(xiàn)方法是:首先采用Remez最佳一致算法對Sigmoid函數(shù)進行四次多項式分段逼近,然后用流水線結構優(yōu)化硬件實現(xiàn)模塊。Remez給出了逐次逼近的思想,提出求連續(xù)函數(shù)的最佳一致逼近多項式的近似算法,取得了良好效果;由Remez提出的近似算法由以下三步構成:
第1步:在[a,b]上選 n + 2 個由小到大排列的初始點列{x1, x2, ...,xn+2}作為近似交錯點組,并設置精度ε>0;
第2步:求解獲得近似多項式 Pn(x ) 和近似偏差′(f,x);
綜合考慮逼近的精確程度以及硬件實現(xiàn)的特殊性,本實施例中在區(qū)間[0,8]分為5段逼近模塊,5段區(qū)間分別為[0,0.5],[0.5,1],[1,2],[2,4],[4,8],獲得Sigmoid函數(shù)各段逼近多項式如表1所示。
表2 Sigmoid函數(shù)各段逼近多項式
根據(jù)Sigmoid函數(shù)的性質(zhì)可知在區(qū)間[8,+∞]和[-∞,-8]距離1和0的誤差小于。如果總體誤差控制在以內(nèi),三次多項式就可以達到要求。為了便于硬件二進制處理,選擇區(qū)域左右端點均為2的冪次。
流水線結構(pipeline architecture)是指在系統(tǒng)處理數(shù)據(jù)時,每個時鐘脈沖都接受下一條處理數(shù)據(jù)的指令。流水線機構提高了系統(tǒng)處理數(shù)據(jù)的速度,同時對時序有嚴格的要求。
通過在quartusⅡ用Verilog HDL硬件語言編寫程序然后結合modelsim強大的仿真功能進行聯(lián)合仿真,Sigmoid函數(shù)時序仿真波形符合預期要求。在仿真測試階段,通過輸入?yún)^(qū)間范圍內(nèi)的一組穩(wěn)定遞增的數(shù)據(jù),每過5個時鐘周期輸入一個data值,采用的流水線結構第一組數(shù)據(jù)會在45個周期后輸出擬合值,通過與手工計算的實際值作比較,精度達到了10-6數(shù)量級,滿足預期值。
本文運用Remez算法構造多項式逼近Sigmoid函數(shù),優(yōu)化多項式逼近后的Sigmoid函數(shù)硬件實現(xiàn)架構,對優(yōu)化后的多項式逼近的Sigmoid函數(shù)進行verilog硬件語言建模,并進行仿真分析通過算例分析證明了本文所采用的使用Remez算法構造多項式逼近Sigmoid函數(shù)擬合誤差較低,運算速度快,精度較高,滿足預期值,達到了高效率的硬件實現(xiàn)。