DSP 定點小數運算

2021-05-27 21:21:43 字數 3050 閱讀 9742

許多dsp晶元只支援整數運算,如果現在這些晶元上進行小數運算的話,定點小數運算應該是最佳選擇了,此外即使晶元支援浮點數,定點小數運算也是最佳的速度選擇。

在dsp 世界中,由於dsp晶元的限制,經常使用定點小數運算。所謂定點小數,實際上就是用整數來進行小數運算。下面先介紹定點小數的一些理論知識,然後以c語言為例,介紹一下定點小數運算的方法。在ti c5000 dsp系列中使用16位元為最小的儲存單位,所以我們就用16位元的整數來進行定點小數運算。

先從整數開始,16位元的儲存單位最多可以表示0x0000到0xffff,65536種狀態,如果它表示c語言中的無符號整數的話,就是從0到 65535。如果需要表示負數的話,那麼最高位就是符號位,而剩下的15位可以表示32768種狀態。這裡可以看出,對於計算機或者dsp晶元來說,符號並沒有什麼特殊的儲存方式,其實是和數字一起儲存的。為了使得無論是無符號數還是符號數,都可以使用同樣的加法減法規則,符號數中的負數用正數的補碼表示。

我們都知道-1 + 1 =0,而0x0001表示1,那麼-1用什麼來表示才能使得-1 + 1 =0呢?答案很簡單:0xffff。現在就可以開啟windows的計算器,用16進製制計算一下0xffff+0x0001,結果是0x10000。那麼 0x10000和0x0000等價麼,我們剛才說過用16位元來表達整數,最高位的1是第17位,這一位是溢位位,在運算暫存器中沒有儲存這一位,所以結果是低16位,也就是0x0000。現在我們知道負數的表達方式了。舉個例子:-100。首先我們需要知道100的16進製制,用計算器轉換一下,可以知道是0x0064,那麼-100就是0x10000 - 0x0064,用計算器算一下得0xff9c。

還有一種簡單的轉換符號的方法,就是取反加一:把數x寫成二進位制格式,每位0變1,1變0,最後把結果加1就是-x了。

好,複習了整數的相關知識之後,我們進入定點小數運算環節。所謂定點小數,就是小數點的位置是固定的。我們是要用整數來表示定點小數,由於小數點的位置是固定的,所以就沒有必要儲存它(如果儲存了小數點的位置,那就是浮點數了)。既然沒有儲存小數點的位置,那麼計算機當然就不知道小數點的位置,所以這個小數點的位置是我們寫程式的人自己需要牢記的。

先以10進製為例。如果我們能夠計算12+34=46的話,當然也就能夠計算1.2+3.4 或者 0.12+0.34了。所以定點小數的加減法和整數的相同,並且和小數點的位置無關。乘法就不同了。 12*34=408,而1.2*3.4=4.08。這裡1.2的小數點在第1位之前,而4.08的小數點在第2位之前,小數點發生了移動。所以在做乘法的時候,需要對小數點的位置進行調整?!可是既然我們是做定點小數運算,那就說小數點的位置不能動!!怎麼解決這個矛盾呢,那就是捨棄最低位。也就說1.2*3.4=4.1,這樣我們就得到正確的定點運算的結果了。所以在做定點小數運算的時候不僅需要牢記小數點的位置,還需要記住表達定點小數的有效位數。上面這個例子中,有效位數為2,小數點之後有一位。

現在進入二進位制。我們的定點小數用16位二進位制表達,最高位是符號位,那麼有效位就是15位。小數點之後可以有0 - 15位。我們把小數點之後有n位叫做qn,例如小數點之後有12位叫做q12格式的定點小數,而q0就是我們所說的整數。

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。

我們用數學表示式做一下總結:三衢部落格z8na c$y+ud1}

x表示實際的數(*乙個浮點數), q表示它的qn型定點小數(乙個整數)。

9^-tq;}ln ki0         q = (int) (x * 2^n)三衢部落格x_6^6gd

x = (float)q/2^n

由以上公式我們可以很快得出定點小數的+-*/演算法:

假設q1,q2,q3表達的值分別為x1,x2,x3

f r5s"xj,nfzz@0          q3 = q1 + q2   若 x3 = x1 + x2

r4h2| wn0          q3 = q1 - q2   若 x3 = x1 - x2三衢部落格xkb3g;nec

q3 = q1 * q2 / 2^n若 x3 = x1 * x2

q3 = q1 * 2^n / q2若 x3 = x1 / x2

p!t2xk|[+f \e0         我們看到加減法和一般的整數運算相同,而乘除法的時候,為了使得結果的小數點位不移動,對數值進行了移動。

0n.c.qk]$n1h9oo%d0         用c語言來寫定點小數的乘法就是:

e$d6p9k&if["a0short q1,q2,q3;三衢部落格ori6s1w sk

....

|os_[0q3=((long q1) * (long q2)) >> n;

由於/ 2^n和* 2^n可以簡單的用移位來計算,所以定點小數的運算比浮點小數要快得多。下面我們用乙個例子來驗證一下上面的公式:

用q12來計算2.1 * 2.2,先把2.1 2.2轉換為q12定點小數:三衢部落格g$u3wu,l!v

2.1 * 2^12 = 8601.6 = 8602

dg?sk~:a"c;j4wp0        2.2 * 2^12 = 9011.2 = 9011

2md{x4\'e5c4y0        (8602 * 9011) >> 12 = 18923

18923的實際值是18923/2^12 = 4.619873046875 和實際的結果 4.62相差0.000126953125,對於一般的計算已經足夠精確了。

定點小數,指小數點的位置是固定的,浮點小數指小數點的位置可以變動,這樣就可以表示更大或更小的數,因為計算機裡的位數是有限的,不可能無限期的.三衢部落格 csy3?9m^w#v

在小數點後增加數字,所以只能靠移動小數點的位置來儲存不同大小的數

'elx'`lbao0

DSP定點運算

在定點dsp晶元中,採用定點數進行數值運算,其運算元一般採用整型數來表示。乙個整型數的最大表示範圍取決於dsp晶元所給定的字長,一般為16位或24位。顯然,字長越長,所能表示的數的範圍越大,精度也越高。數的定標 由程式設計師來確定乙個數的小數點處於16位中的哪一位 通過設定小數點在16位數中的不同位...

FPGA定點小數運算

謂定點小數,就是小數點的位置是固定的。我們是要用整數來表示定點小數,由於小數點的位置是固定的,所以就沒有必要儲存它 如果儲存了小數點的位置,那就是浮點數了 既然沒有儲存小數點的位置,那麼計算機當然就不知道小數點的位置,所以這個小數點的位置是我們寫程式的人自己需要牢記的。先以10進製為例。如果我們能夠...

DSP中浮點轉定點運算

5 舉例及程式設計中的心得 5 1舉例 第3章 dsp晶元的定點運算.doc 這篇文章中給了乙個很簡單有能說明問題的例子,不想動大腦了,直接引用過來如下。這是乙個對語音頻號 0.3khz 3.4khz 進行低通濾波的c語言程式,低通濾波的截止頻率為800hz,濾波器採用19點的有限衝擊響應fir濾波...