定点数的定标
轉自:http://blog.csdn.net/longxuekun1992/article/details/52895302
1. 選取合適的定標值(加載操作數)
定標的大小,影響著整數部分和小數部分的位數,定標的過程其實是在操作數動態范圍和精度之間做權衡的過程。
設一個變量可能出現的最大絕對值為|max|,n為正整數,滿足2^(n-1) < |max| < 2^n,則定標Q按如下規則選取最合適:
Q = 有效數據位 – n
對于32位的有符號數,數據有效位=31。如|max| = 2.75,選Q = 31 – 2 =29是最合適的。
2. 定點數之間的運算
兩個定點數進行運算,它們的定標可能相同也可能不同,那該遵循怎樣的規則來進行加減乘除等基本運算呢?
網上有些資料通過分別舉加、減、乘、除實際運算的例子來說明這一問題,雖然很詳細,但還是不夠直觀。
來看一看,平時我們用十進制做兩個數的加減和乘除是怎么弄的。
加減法:先對位,后加減;
乘除法:先乘除,后取小數點。
而定點數之間的加減乘除,撇開符號位不談,其過程是一樣一樣的:
加減法:先對標,后加減;
乘除法:先乘除,后定標。
3. 結果重新定標(返回結果)
兩個定點數運算完成之后,所得結果的定標、動態范圍、精度要求等都可能發生了變化,因此可能需要進行重新定標。
比如Q15*Q15 -> Q30,但我們依然希望得到一個Q15的數怎么辦?其實只需做一個簡單的右移15位操作就好,其它情況同理。
大家可以仔細體會下這里的意思,然后再找具體的例子對照感受下,看是不是覺得簡單多了呢。
http://blog.csdn.net/times_poem/article/details/51505014
Q12的正數的最大值是0 111 . 111111111111,第一個0是符號位,后面的數都是1,那么這個數是十進制的多少呢,很好運算,就是0x7fff / 2^12 = 7.999755859375。對于Qn格式的定點小數的表達的數值就它的整數值除以2^n。在計算機中還是以整數來運算,我們把它想象成實際所表達的值的時候,進行這個運算。
反過來把一個實際所要表達的值x轉換Qn型的定點小數的時候,就是x*2^n了。例如0.2的Q12型定點小數為:0.2*2^12 = 819.2,由于這個數要用整數儲存,所以是819即0x0333。因為舍棄了小數部分,所以0x0333不是精確的0.2,實際上它是819/2^12 =0.199951171875。
我們用數學表達式做一下總結:
x表示實際的數(*一個浮點數),q表示它的Qn型定點小數(一個整數)。
q = (int) (x * 2^n)
x = (float)q/2^n
用Q12來計算2.1 * 2.2,先把2.1 2.2轉換為Q12定點小數:
2.1 * 2^12 = 8601.6 = 8602
2.2 * 2^12 = 9011.2 = 9011
(8602 * 9011) >> 12 = 18923
18923的實際值是18923/2^12 = 4.619873046875和實際的結果4.62相差0.000126953125,對于一般的計算已經足夠精確了。
http://www.eeworld.com.cn/DSP/2014/1025/article_4006.html
q = quantizer('fixed', 'ceil', 'saturate', [32 30]);
FixedNum=bin2dec(num2bin(q,1.999999999));
http://blog.163.com/xiada_action/blog/static/7423460220100255911247/
1.q = quantizer('fixed', 'ceil', 'saturate', [8 6]);imgbits=num2bin(q,k);這是將一個小數k,比如0.256 變成二進制。小數點后面3位用6位二進制表示。
現再將編出來的二進制 恢復成10進制 小數:
二進制小數轉換沒有現成的函數,要自己編的。 或者你利用二進制整數的轉換函數bin2dec() 比如二進制的0.1101 那你就先把小數部分轉換成十進制整數 >> d=bin2dec('1101') d = 13 然后再根據位數,小數點后面4位,就除以2^4 >> d/2^4 ans = 0.8125
2.寫文件:
fid=fopen('sin.coe','wt')
fprintf(fid, '%d',a)
fclose(fid)
讀取文件:
(1)fid1=fopen('fx.txt','r'); %得到文件號
[f,count]=fscanf(fid,'%f %f',[12,90])
%把文件號1的數據讀到f中。其中f是[12 90]的矩陣
%這里'%f %f'表示讀取數據的形勢,他是按原始數據型讀出
fclose(fid);%關閉文件
(2) load data.txt
data
(3) a=importdata('data.txt')
總結
- 上一篇: 凹凸世界卡米尔资料图
- 下一篇: LOL瑞文未来战士皮肤技能特效观看