matlab浮点转定点的函数,FPGA基础知识17(Matlab中滤波器的定点化 浮点运算转换为定点运算)...
需求說明:IC設計基礎
內容 ? ? ? :浮點運算定點化處理
來自 ? ? ? :時間的詩
原文:http://blog.csdn.net/mccrocodile/article/details/6754929
通常在FPGA中做信號處理為達到比較高的fMax和較少的資源占用,通常使用定點化數字信號處理,雖然FPGA廠商和IP提供商提供了一些浮點IP,但是目前大多數應用還是趨向定點化處理。這里主要介紹在設計濾波器中使用工具中的定點化選項,實現濾波器的定點化,為后面一節的HDL代碼生成做鋪墊。
這兒還是使用前面的例子,來實施定點化。
FDAtool中定點化
如下圖所示為FDATool中的定點化過程中截圖,選擇左側設置量化參數(Set Quantization Parameters )按鈕,在濾波器結構欄選擇定點,濾波器精度有最高精度和指定精度,通常使用指定精度這樣比較節約資源,最后部分為對濾波器的參數,輸入數出和濾波器內部進行定點化設計。
在設置濾波器內部的參數,如乘法器,累加器的精度和整數的溢出模式。在設置精度是通常開始設置較大的精度和動態范圍,滿足要求后再優化。整數溢出的模式Wrap模式占用資源最少,但是如果正式部分動態范圍不夠會帶來糟糕情況,而且不利于整體的穩定性;Staturate會占用額外的邏輯資源。
FilterBuilder中定點化
從下圖可以看得出與FDATool的定點化設置是一致的。這兒就不再做介紹了。
fdesign中的定點化
(準確的應該成為使用面向對象的方式的濾波器定點化)
詳細的幫助中搜索Fixed-Point Filter Design。
前面介紹的基于GUI的定點化都是一個根據經驗的迭代化的優化過程,下面來詳細的說下基于fdesign的定點化過程。
濾波器的定點化包含兩個主要的部分:濾波器數的量化和動態范圍分析。(The dynamic range analysis is a process of fine tuning the scaling of each node to ensure that the fraction lengths are set for full
input range coverage and maximum precision。)
1、首先修改濾波器對象屬性為定點的:(當然這兒的濾波器對象也可以來自于fdatool等設計的導出的濾波器對象)
Hf=hd;
Hf.Arithmetic='fixed';
2、初步設置濾波器系數的字長
set(Hf, 'CoeffWordLength', 9);%設置濾波器系數的字長
fvtool(Hf)%,比較不同字長設置
屏幕剪輯的捕獲時間: 2011/8/30 22:22
可以清晰的觀察到定點化和浮點的幅頻響應的區別,通過觀察是否滿足要求進一步優化濾波器系數的字長,增加字長達到更高的性能,縮減字長節約資源減小面積。如在Altera的QII中,如果乘數是固定且位寬比較小(比如小于10bit時),綜合時會使用移位和加法實現乘法(有點類似于RAG算法),但當乘數比較大時則需要使用硬件乘法器。如果較小片子硬件乘法器不足就是個糟糕的事情了。
3、設置濾波器內部的位寬:累加器,乘法器,輸出信號
info(Hf) %有觀察到的信息可以看出位寬過寬
屏幕剪輯的捕獲時間: 2011/8/30 22:32
如圖所示可以看到,自動設置的位寬以及其動態范圍,這些自動設置的位寬通常是首先滿足精度,還需要根據硬件(DSP,FPGA)特性做修改。下面針對Altera的CIII片子給出一個設置:
set (Hf, 'InputWordLength', 10);%輸入ADC位寬
set (Hf, 'FilterInternals', 'SpecifyPrecision');%設置濾波器內部參數
set (Hf, 'ProductWordLength', 18);%如Altera的CIII片子的乘法器為9的倍數,這兒選18bit
set (Hf, 'AccumWordLength', 22);%累加器的字長,通常累加器比乘法器多4比特作為保護位寬
set (Hf, 'OutputWordLength', 16);%輸出數據總線
輸入信號位寬通常和ADC是保持一致的,乘法器的位寬通常設置9的倍數(某些高檔片子含有DSP40,那就設置為40)。諸如硬件乘法器資源,如果想要充分利用,那么你就需要參考器件的硬件特性。累加器通常要比乘法器寬4bit作為保護比特。如果設置得過寬會造成累加器的時延過大,得不到一個較大的fMax。
到這里濾波器的基本設置算是完成了,但是還是有可能在使用的使用發生溢出等錯誤。動態分析將進一步優化濾波器的定點化設置,以降低溢出的發生。
4、動態分析:進一步精細調整系數的比例(Scaling)。
系數最好是又能覆蓋所有輸入信號,同時保持最大的精度,但這是互相矛盾的。所以在動態分析過程中用于測試的輸入數據的選擇是非常重要的。如果設置較大的動態范圍,可以覆蓋輸入信號的范圍,但是精度會損失;如果設置較窄的動態范圍,可以保持較好的精度,但是輸入信號可能超出范圍引起溢出。
最壞情況測試法:
1)源代碼和報告如下,首先使用脈沖響應的取符號函數,設置信號最大幅度,作為信號的激勵。
2)以測試激勵自動調整動態范圍,如果不使用這個選項觀察一下3中的報告時什么樣子的。
3)創建fipref對象開啟記錄模式,定點化濾波,觀察定點化濾波過程的報告。
tx = 2*sign(fliplr(impz(Hf)));%激勵
Hf2 = autoscale(Hf, tx);%自動調整動態范圍
fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');%創建fipref對象打開記錄
y = filter(Hf2, tx);
fipref('LoggingMode', 'off');
R = qreport(Hf2)%查看報告,報告最近的頂點濾波計算報告
屏幕剪輯的捕獲時間: 2011/9/5 21:29
下面是對信號分離的定點化測試:
%% 對信號分離的定點化測試
fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');%創建fipref對象打開記錄
y = filter(Hf2, x);
fipref('LoggingMode', 'off');
R1 = qreport(Hf2)%查看報告,報告最近的頂點濾波計算報告
figure;plot(y);title('定點化濾波信號分離測試')
屏幕剪輯的捕獲時間: 2011/9/5 21:39
屏幕剪輯的捕獲時間: 2011/9/5 21:39
通過上面的報告和濾波結果觀察可以看出,定點化達到了效果。這就為后面HDL代碼生成做好基本的準備。
總結:
通過上面的例子,可以得知使用面向對象方式實現定點化是一個更優秀的方式。根據測試的激勵可以自動調整濾波器的精度以達到不同的動態范圍,達到精度和動態范圍(過小會引起溢出)的權衡,那么也就看出合適的測試激勵的重要性。這種濾波器的定點化方法對IIR濾波器的定點化優勢尤其明顯。這里先不介紹,由于IIR的定點化有時比較復雜,放到后面多帶帶討論。
所以建議親自試試使用fdesign的方式。
總結
以上是生活随笔為你收集整理的matlab浮点转定点的函数,FPGA基础知识17(Matlab中滤波器的定点化 浮点运算转换为定点运算)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员应该阅读的非编程类书籍有哪些?
- 下一篇: 算法导论答案(第一章)