在FPGA實現(xiàn)
數(shù)字信號處理過程中經(jīng)常會遇到將MATLAB程序放到FPGA中去運算,運算完后再導(dǎo)入MATLAB查看數(shù)據(jù)結(jié)果做后續(xù)處理。而MATLAB一般為雙精度浮點運算,,而FPGA一般為定點運算。所以需要將浮點數(shù)轉(zhuǎn)為定點數(shù),,再送到FPGA中去運算,將運算結(jié)果導(dǎo)入MATLAB后再轉(zhuǎn)為浮點數(shù),。這就涉及到DSP定標(biāo)問題,。
在定點DSP芯片中,采用定點數(shù)進行數(shù)值運算,,其操作數(shù)一般采用整型數(shù)來表示,。一個整型數(shù)的大表示范圍取決于DSP芯片所給定的字長,一般為16位或24位,。顯然,,字長越長,所能表示的數(shù)的范圍越大,,精度也越高,。如無特別說明,本書均以16位字長為例,。
DSP芯片的數(shù)以2的補碼形式表示,。每個16位數(shù)用一個符號位來表示數(shù)的正負,0表示數(shù)值為正,,l則表示數(shù)值為負,。其余15位表示數(shù)值的大小。因此,,
二進制數(shù)0010000000000011b=8195
二進制數(shù)1111111111111100b= -4
對DSP芯片而言,,參與數(shù)值運算的數(shù)就是16位的整型數(shù)。但在許多情況下,,數(shù)學(xué)運算過程中的數(shù)不一定都是整數(shù),。那么,DSP芯片是如何處理小數(shù)的呢?應(yīng)該說,,DSP芯片本身無能為力,。那么是不是說DSP芯片就不能處理各種小數(shù)呢,?當(dāng)然不是,。這其中的關(guān)鍵就是由程序員來確定一個數(shù)的小數(shù)點處于16位中的哪一位。這就是數(shù)的定標(biāo),。
通過設(shè)定小數(shù)點在16位數(shù)中的不同位置,,就可以表示不同大小和不同精度的小數(shù)了。數(shù)的定標(biāo)有Q表示法和S表示法兩種,。表1.1列出了一個16位數(shù)的16種Q表示,、S表示及它們所能表示的十進制數(shù)值范圍。
從表1.1可以看出,,同樣一個16位數(shù),,若小數(shù)點設(shè)定的位置不同,它所表示的數(shù)也就不同,。例如,,
16進制數(shù)2000H=8192,用Q0表示
16進制數(shù)2000H=0.25,,用Q15表示
但對于DSP芯片來說,,處理方法是完全相同的。
從表1.1還可以看出,,不同的Q所表示的數(shù)不僅范圍不同,,而且精度也不相同。Q越大,,數(shù)值范圍越小,,但精度越高;相反,,Q越小,,數(shù)值范圍越大,但精度就越低,。例如,,Q0 的數(shù)值范圍是一32768到+32767,其精度為1,,而Q15的數(shù)值范圍為-1到0.9999695,,精度為1/32768=0.00003051。因此,,對定點數(shù)而言,,數(shù)值范圍與精度是一對矛盾,一個變量要想能夠表示比較大的數(shù)值范圍,必須以犧牲精度為代價,;而想精度提高,,則數(shù)的表示范圍就相應(yīng)地減小。在實際的定點算法中,,為了達到佳的性能,,必須充分考慮到這一點。
浮點數(shù)與定點數(shù)的轉(zhuǎn)換關(guān)系可表示為:
浮點數(shù)(x)轉(zhuǎn)換為定點數(shù)(xq):xq=(int)x* 2Q
定點數(shù)(xq)轉(zhuǎn)換為浮點數(shù)(x):x=(float)xq*2-Q
例如,,浮點數(shù)x=0.5,,定標(biāo)Q=15,則定點數(shù)xq=L0.5*32768J=16384,,式中LJ表示下取整,。反之,一個用Q=15表示的定點數(shù)16384,,其浮點數(shù)為163幼*2-15=16384/32768=0.5,。浮點數(shù)轉(zhuǎn)換為定點數(shù)時,為了降低截尾誤差,,在取整前可以先加上0.5,。
表1.1 Q表示、S表示及數(shù)值范圍
Q表示 S表示 十進制數(shù)表示范圍
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代碼實現(xiàn)了將浮點數(shù)(注:絕對值小于1)轉(zhuǎn)為設(shè)定的位數(shù)的二進制補碼形式
function [y]=dectobin(innum,N);
%將絕對值小于1的值轉(zhuǎn)換為(N+1)位的二進制數(shù)負數(shù)用補碼表示
%N表示abs(innum)*2^N;多出的一位表示符號位
if (abs(innum)>=1)|(N == 0)%判斷輸入的有效性 注:輸入數(shù)據(jù)必須為-1到1之間的值
disp('error!');
return;
end
%如果需要轉(zhuǎn)換的浮點數(shù)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;%小數(shù)轉(zhuǎn)換為二進制,乘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;%循環(huán)結(jié)束
else
record(temp)=0;
temp=temp-1;
end
end
y=record;
end
return;
若您有高速數(shù)據(jù)采集板卡定制需求,,請聯(lián)系我們:400-000-4026
關(guān)于坤馳科技:
坤馳科技是專注于高速數(shù)據(jù)采集與信號處理、高速數(shù)據(jù)存儲與記錄的高科技公司,。坤馳科技為用戶提供成熟的標(biāo)準(zhǔn)高速數(shù)據(jù)采集產(chǎn)品與技術(shù),,也可為用戶提供定制化的高速信號采集解決方案。目前坤馳科技服務(wù)過的研究所,、科研單位已達近百家,。高速數(shù)據(jù)采集產(chǎn)品線涵蓋PCIExpress、cPCI,、PXIe,、VPX、USB等總線,,包含高速AD,、DA平臺、FPGA,、DSP處理平臺,,SATA/SSD、Flash存儲平臺等,。
全國咨詢電話:400-000-4026
公司官方網(wǎng)站:http://m.jtyykv.cn