FPGA數(shù)據(jù)在進行乘加過程中會面臨這數(shù)據(jù)位寬變大的問題,然而硬件資源是有限的,需要對數(shù)據(jù)最終位寬進行設(shè)計,這就會面臨著位寬的選擇和如何截位的問題。
對多位數(shù)據(jù)進行截位處理,是一個從高量化精度向低量化精度的轉(zhuǎn)換過程,由于量化位數(shù)的減少,產(chǎn)生截位誤差,導致運算結(jié)果在時域上出現(xiàn)直流分量,頻域出現(xiàn)由諧波失真造成的尖峰,降低了信號的無雜散動態(tài)范圍。
比如:模擬信號經(jīng)過16位ADC量化后變?yōu)?a target="_blank">數(shù)字信號,且數(shù)據(jù)類型為整型,且均采用補碼形式表示如按照16 bit 量化,則15 =0000 0000 0000 1111;而-15=1111 1111 11110001。直接截位法是對數(shù)據(jù)直接截掉低位。以2 bit 截位為例,則15 截位后為0000 0000 0000 11=3,而-15 截位后為1111 1111 111100=-4。可以看出,在FPGA 中采用直接截位法對數(shù)據(jù)進行截位,截位是按照向下取整的方式進行的,由截位導致的近似方式對正數(shù)和負數(shù)來言是不同的,即15/(22)=3.75≈3,而-15/(22)=-3.75≈-4,因此截位后的信號會整體向下偏移,導致出現(xiàn)直流偏置,頻譜上表現(xiàn)為在0 頻出現(xiàn)誤差尖峰。對截位后的信號,再進行變頻等處理,就會將尖峰搬移到其他的頻率。如果出現(xiàn)多次截位,則將增加誤差尖峰的個數(shù),影響信號產(chǎn)生和信號處理的效果。因此在對信號處理要求較高的場合,采用直接截位法是不合適的。
常見的截位方式有:1、負數(shù)直接截位后+1,就是所有數(shù)都按絕對值取floor
2、Truncate:直接截位,就是正數(shù)取floor,負數(shù)按絕對值取ceil
3、Rounding:舍入截位,就是所有數(shù)按絕對值取四舍五入
這三種截位方式都是可以的,其中舍入截位精度相對較高。而(《數(shù)字信號截位影響分析》-- 焦慶君,解劍)這篇論文中的數(shù)據(jù)截位誤差抑制方法就是用的四舍五入的思想,通過加上或者減去一個數(shù)來實現(xiàn)的,實現(xiàn)方法比較簡單,我個人也是用這種方法來進行數(shù)據(jù)的截位的。具體實現(xiàn)方式是:①判斷數(shù)據(jù)的符號;② 如果符號為正,則將數(shù)據(jù)加上2^ (n-1);③ 如果符號為負,則將數(shù)據(jù)加上2^(n-1)-1;④ 截掉數(shù)據(jù)的低n 位。
在一些數(shù)字信號處理的IP核中數(shù)據(jù)的截位也是可選的,一般選擇近似截位。
然而上述的幾種方法截位誤差基本上是可以滿足絕大多數(shù)需求,然而對特殊的要求時以上幾種方式難以滿足時,就需要對截位誤差進行特殊的設(shè)計。筆者根據(jù)自身項目的調(diào)試經(jīng)驗,總結(jié)出來一個經(jīng)過實際測試有效的方法。這個方法成為誤差傳遞。這里設(shè)置進位上線為0.75,向下截位下線為0.25.如下圖所示
1、 若數(shù)據(jù)大于設(shè)置的則數(shù)據(jù)直接置1,如圖中B點,如果小于下線,則直接置0,如圖中A點。這里的上線和下線是可以根據(jù)實際的需求進行調(diào)整的,但調(diào)整的原則是數(shù)據(jù)超出上下限的點的個數(shù)應當是一直的,并且上下限內(nèi)的數(shù)據(jù)應當關(guān)于上下限中點對稱的。
2、 如果數(shù)據(jù)在上線和下線之間,則把數(shù)據(jù)直接截位,截下的數(shù)據(jù)與下一個數(shù)據(jù)相加后再進行直接截位,這樣依次進行下去即可。即若L1+L2+L3=LS>1,則把數(shù)據(jù)點E置1,然后把LS-1=LD作為新的誤差傳遞下去,若LD+L4+L5>1則把G點置1,產(chǎn)生新的誤差繼續(xù)傳遞下去,如果LD+L4+L5<1,則繼續(xù)加入新的數(shù)據(jù),判斷LD+L4+L5+L6是否大于1,直至產(chǎn)生大于1的那個點進行近衛(wèi),然后繼續(xù)把新產(chǎn)生的誤差進行傳遞。
通過誤差傳遞的方式在數(shù)據(jù)量相對大一些的情況下,使得信號的原始值與截位后數(shù)據(jù)的值在時域上做差產(chǎn)生的差值是0,在頻域上也沒有引入低頻信息。這種方式在實際的應用測試中很好用,因此就簡單的寫了出來,嚴格的證明畢竟麻煩,需要很大的篇幅來寫,這里就不詳細寫了,但是這個結(jié)果是通過MATLAB仿真和實際的應用測試驗證的,是能直接用的。
在實際系統(tǒng)中存在著加和乘的運算,這樣就導致數(shù)據(jù)位寬發(fā)生變化,有時候為了保證數(shù)據(jù)的精度不進行截位,但硬件資源有限,適當?shù)慕匚粚ψ罱K結(jié)果影響較小,因此合理的位寬設(shè)計既要滿足精度要求也要滿足資源要求。
一個典型的例子就是有限脈沖響應(FIR)濾波器的設(shè)計就會面臨上面的問題。
假設(shè)濾波器系數(shù)位[15、17、-88、103、75、75、103、-88、17、15],輸入數(shù)據(jù)位寬位N,而輸出位寬最佳是如何設(shè)計呢?要想數(shù)據(jù)全精度的運算,針對上面的濾波器系數(shù)位寬應該為N+8(系數(shù)最大值103的有符號二進制位寬)+4(系數(shù)個數(shù)的二進制值)。然而在實際運算中通常先得到系數(shù)絕對值的和596,而596至少需要10位二進制數(shù)表示,因此實際位寬設(shè)計為N+10。但是在系數(shù)較多或者運算次數(shù)較多的系統(tǒng)中,要求輸入位寬為N而輸出位寬為N+1時,就需要進行截位處理。合理的截位能提升系統(tǒng)的實際運行性能,最佳的截位是定點的運算達到浮點運算的效果。
原文標題:FPGA數(shù)字信號截位分析和位寬設(shè)計
文章出處:【微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1625文章
21624瀏覽量
601245 -
濾波器
+關(guān)注
關(guān)注
160文章
7704瀏覽量
177487 -
數(shù)字信號
+關(guān)注
關(guān)注
2文章
943瀏覽量
47492
原文標題:FPGA數(shù)字信號截位分析和位寬設(shè)計
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論