2016-10-03 146 views
0

我在blackfin533上發現了一段代碼,它的fract32從-1,1開始,格式爲1.31。計算兩個定點分數的平方根的解釋

我不明白爲什麼需要預換檔來計算複數(re,img)的幅度。我知道如果你想用1.31分數格式乘1.31,那麼你需要右移31位。

GO_coil_D [0] .RE和GO_coil_D [0] .IM兩種fract32

我不能得到什麼,下面的代碼是這樣做的:

norm[0] = norm_fr1x32(GO_coil_D[0].re); 
norm[1] = norm_fr1x32(GO_coil_D[0].im); 
shift = (norm[0] < norm[1]) ? (norm[0] - 1) : (norm[1] - 1); 
vectorFundamentalStored.im = shl_fr1x32(GO_coil_D[0].im,shift);  
vectorFundamentalStored.re = shl_fr1x32(GO_coil_D[0].re,shift); 
vectorFundamentalStored.im = mult_fr1x32x32(vectorFundamentalStored.im, vectorFundamentalStored.im); 
vectorFundamentalStored.re = mult_fr1x32x32(vectorFundamentalStored.re, vectorFundamentalStored.re); 
amplitudeFundamentalStored = sqrt_fr16(round_fr1x32(add_fr1x32(vectorFundamentalStored.re,vectorFundamentalStored.im))) << 16; 
amplitudeFundamentalStored = shr_fr1x32(amplitudeFundamentalStored,shift); 

round_ fr1x32`(fract32 F1)fract16大紅大紫的32位FRACT到16位FRACT使用偏舍入。

norm_fr1x32 norm_fr1x32(fract32)int返回標準化輸入變量所需的左移位數,以便它位於間隔0x40000000至0x7fffffff中,或位於間隔0x80000000至0xc0000000之間。換句話說,fract32 x; shl_fr1x32(X,norm_fr1x32(X));返回值的範圍0x40000000之後爲0x7FFFFFFF,或在範圍爲0x80000000至0xc00000000的

回答

1

1)如果小數部分的最顯著Ñ位全部爲值「0」比特,並且它們後面是「1 'bit,那麼n表現爲像值爲的浮點二進制指數n,並且其餘的31位-n位表現得像尾數。對數字進行平方可將前導'0'位的數量加倍爲2 * n並將尾數的大小減小到31-2 * n位。這可能會導致平方運算結果的精度下降。

2)round_fr1x32將1.31分數轉換爲1.15分數,最多丟失16位的精度。

希望你能看到第1步和第2步可以消除很多數字的精度。對數字進行預縮放會盡可能減少前導「0」位的數量,從而導致在步驟1中丟失的精度降低。事實上,對於兩個數字中的一個被平方和相加,導致的數量'0'位n將爲零,因此對該數字進行平方後,在將其添加到另一個數字之前,仍然會保留高達31位的精度。 (步驟2會將該精度降低到15位)。

最後,您錯誤地將兩個1.31分數格式數相乘的結果 - 結果需要右移31位而非62位。

樣例:

讓我們說,真正的部分是一千零二十四分之三和虛部是十進制一千○二十四分之四,所以絕對值應該一千零二十四分之五畢達哥拉斯。

沒有預縮放,二進制分數是re = 0.0000000011 2,im = 0.0000000100 2。將它們平方後給出re 2 = 0.00000000000000001001 2,im 2 = 0.00000000000000010000 2。添加正方形給出abs²=0.00000000000000011001₂。舍入到15個小數位得出abs²=0.000000000000001₂。取平方根得出abs =0.000000010110101₂。這與確切的結果0不同。0000000101 2 0.000000000010101 2。當預分級時,兩個分數左移6位,給出sre = 0.0011 2,sim = 0.0100 2(我用前綴's'表示'scaled')。將它們平方給出sre 2 = 0.00001001 2,sim 2 = 0.00010000 2。加上正方形給出sabs²=0.00011001₂。舍入到15個小數位不會更改該值。取平方根得出sabs = 0.01010000 2。將其轉換爲1.31格式並右移6位,得出abs = 0.0000000101 2,這是完全正確的(5/1024十進制)。

+1

我加了一個工作的例子,有和沒有預先標定的情況下,實際部分是3/1024(十進制)和虛部爲4/1024。希望你能看到絕對值(振幅)應該是5/1024,因爲它形成了一個3-4-5的三角形。 –

+0

你能告訴我什麼是真實與自身,虛擬與自身相乘的原始問題,然後加上結果,然後取平方根,然後右移31位?這種方法會有什麼問題? –

+1

如果你可以很容易地計算1.31格式分數的平方根,那麼這樣做沒有太大問題,但是當實部和虛部平方時,可能會有一些精度位的損失。 –