在FPGA實現
數字信號處理過程中經常會遇到將MATLAB程序放到FPGA中去運算,運算完后再導入MATLAB查看數據結果做后續處理。而MATLAB一般為雙精度浮點運算,而FPGA一般為定點運算。所以需要將浮點數轉為定點數,再送到FPGA中去運算,將運算結果導入MATLAB后再轉為浮點數。這就涉及到DSP定標問題。
在定點DSP芯片中,采用定點數進行數值運算,其操作數一般采用整型數來表示。一個整型數的大表示范圍取決于DSP芯片所給定的字長,一般為16位或24位。顯然,字長越長,所能表示的數的范圍越大,精度也越高。如無特別說明,本書均以16位字長為例。
DSP芯片的數以2的補碼形式表示。每個16位數用一個符號位來表示數的正負,0表示數值為正,l則表示數值為負。其余15位表示數值的大小。因此,
二進制數0010000000000011b=8195
二進制數1111111111111100b= -4
對DSP芯片而言,參與數值運算的數就是16位的整型數。但在許多情況下,數學運算過程中的數不一定都是整數。那么,DSP芯片是如何處理小數的呢?應該說,DSP芯片本身無能為力。那么是不是說DSP芯片就不能處理各種小數呢?當然不是。這其中的關鍵就是由程序員來確定一個數的小數點處于16位中的哪一位。這就是數的定標。
通過設定小數點在16位數中的不同位置,就可以表示不同大小和不同精度的小數了。數的定標有Q表示法和S表示法兩種。表1.1列出了一個16位數的16種Q表示、S表示及它們所能表示的十進制數值范圍。
從表1.1可以看出,同樣一個16位數,若小數點設定的位置不同,它所表示的數也就不同。例如,
16進制數2000H=8192,用Q0表示
16進制數2000H=0.25,用Q15表示
但對于DSP芯片來說,處理方法是完全相同的。
從表1.1還可以看出,不同的Q所表示的數不僅范圍不同,而且精度也不相同。Q越大,數值范圍越小,但精度越高;相反,Q越小,數值范圍越大,但精度就越低。例如,Q0 的數值范圍是一32768到+32767,其精度為1,而Q15的數值范圍為-1到0.9999695,精度為1/32768=0.00003051。因此,對定點數而言,數值范圍與精度是一對矛盾,一個變量要想能夠表示比較大的數值范圍,必須以犧牲精度為代價;而想精度提高,則數的表示范圍就相應地減小。在實際的定點算法中,為了達到佳的性能,必須充分考慮到這一點。
浮點數與定點數的轉換關系可表示為:
浮點數(x)轉換為定點數(xq):xq=(int)x* 2Q
定點數(xq)轉換為浮點數(x):x=(float)xq*2-Q
例如,浮點數x=0.5,定標Q=15,則定點數xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一個用Q=15表示的定點數16384,其浮點數為163幼*2-15=16384/32768=0.5。浮點數轉換為定點數時,為了降低截尾誤差,在取整前可以先加上0.5。
表1.1 Q表示、S表示及數值范圍
Q表示 S表示 十進制數表示范圍
Q15 S0.15 -1≤x≤0.9999695
Q14 S1.14 -2≤x≤1.9999390
Q13 S2.13 -4≤x≤3.9998779
Q12 S3.12 -8≤x≤7.9997559
Q11 S4.11 -16≤x≤15.9995117
Q10 S5.10 -32≤x≤31.9990234
Q9 S6.9 -64≤x≤63.9980469
Q8 S7.8 -128≤x≤127.9960938
Q7 S8.7 -256≤x≤255.9921875
Q6 S9.6 -512≤x≤511.9804375
Q5 S10.5 -1024≤x≤1023.96875
Q4 S11.4 -2048≤x≤2047.9375
Q3 S12.3 -4096≤x≤4095.875
Q2 S13.2 -8192≤x≤8191.75
Q1 S14.1 -16384≤x≤16383.5
Q0 S15.0 -32768≤x≤32767
附錄:下面MATLAB代碼實現了將浮點數(注:絕對值小于1)轉為設定的位數的二進制補碼形式
function [y]=dectobin(innum,N);
%將絕對值小于1的值轉換為(N+1)位的二進制數負數用補碼表示
%N表示abs(innum)*2^N;多出的一位表示符號位
if (abs(innum)>=1)|(N == 0)%判斷輸入的有效性 注:輸入數據必須為-1到1之間的值
disp('error!');
return;
end
%如果需要轉換的浮點數X2^N還小于1的話,該值就為0
%very important
if((abs(innum)*2^N)<1)
innum=0;
end
count=0;
tempnum=abs(innum);
record=zeros(1,N+1);
while(N)
count=count+1;%長度小于N
if(count>N)
break;
end
tempnum=tempnum*2;%小數轉換為二進制,乘2取整
if tempnum>1
record(count+1)=1;
tempnum=tempnum-1;
elseif(tempnum==1)
record(count+1)=1;
N=0;%stop loop
else
record(count+1)=0;
end
end
if innum>=0 %輸入值大于等于0
record(1)=0;
y=record;
else %輸入值小于0
record(1)=1;
for i=2:N+1 %取反
if record(i)==1
record(i)=0;
else
record(i)=1;
end
end
temp=N+1; %加1
while(temp>1)
if record(temp)==0
record(temp)=1;
temp=0;%循環結束
else
record(temp)=0;
temp=temp-1;
end
end
y=record;
end
return;
若您有高速數據采集板卡定制需求,請聯系我們:400-000-4026
關于坤馳科技:
坤馳科技是專注于高速數據采集與信號處理、高速數據存儲與記錄的高科技公司。坤馳科技為用戶提供成熟的標準高速數據采集產品與技術,也可為用戶提供定制化的高速信號采集解決方案。目前坤馳科技服務過的研究所、科研單位已達近百家。高速數據采集產品線涵蓋PCIExpress、cPCI、PXIe、VPX、USB等總線,包含高速AD、DA平臺、FPGA、DSP處理平臺,SATA/SSD、Flash存儲平臺等。
全國咨詢電話:400-000-4026
公司官方網站:http://www.queentest.cn