计算两个定点分数的平方根的解释

艾哈迈德·萨利赫(Ahmed Saleh)

我在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_fr1x32norm_fr1x32(fract32)int返回规格化输入变量所需的左移数,以使其介于0x40000000到0x7fffffff之间,或者介于0x80000000到0xc0000000之间。换句话说,fract32 x; shl_fr1x32(x,norm_fr1x32(x)); 返回0x40000000到0x7fffffff范围内的值,或0x80000000到0xc0000000范围内的值

伊恩·雅培(Ian Abbott)

1)如果小数部分的最高有效n位全为“ 0”位,后跟一个“ 1”位,则n的行为类似于值n的浮点二进制指数,其余31- n位表现得像尾数。对该数字进行平方运算可将前导“ 0”位的数量加倍至2 * n,并将尾数的大小减小至31-2 * n位。这可能会导致平方运算结果的精度下降。

2)round_fr1x32将1.31小数转换为1.15小数,又损失了多达16位精度。

希望您可以看到第1步和第2步可以消除数字中的很多精度。对数字进行预缩放会尽可能减少前导“ 0”位的数量n,从而导致在步骤1中损失精度。实际上,对于两个数字之一进行平方和加法,前导“ 0”的数量位n将为零,因此对该数字进行平方运算仍将保留高达31位的精度,然后再将其添加到其他数字中。(步骤2会将精度降低到15位。)

最后,您将两个1.31分数格式数字相乘的结果是错误的-结果需要向右移31位,而不是62位。

工作示例:

假设实部为3/1024,虚部为十进制的4/1024,所以毕达哥拉斯(pythagoras)的绝对值应为5/1024。

如果不进行预缩放,则二进制分数为re = 0.0000000011 2,im = 0.0000000100 2。将它们平方会得到re²=0.00000000000000001001²,im²=0.00000000000000010000²。将平方相加得到abs 2 = 0.00000000000000011001 2。舍入到15个小数位可得出abs²= 0.000000000000001 2。取平方根为abs = 0.000000010110101 2。这与精确结果0.0000000101 2相差0.000000000010101 2。

当进行预缩放时,两个分数都左移6位,从而得到sre = 0.0011 2,sim = 0.0100 2(我用前缀“ s”表示“已缩放”)。平方它们得到sre 2 = 0.00001001 2,sim 2 = 0.00010000 2。将平方相加得到sabs 2 = 0.00011001 2。舍入到15个小数位不会更改该值。取平方根为sabs = 0.01010000 2。将其转换为1.31格式并向右移6位,得出abs = 0.0000000101 2,这是完全正确的(十进制为5/1024)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

  1. 1

    来自Microsoft Office加载项taskpane.js的MySQL驱动程序模块的空引用

  2. 2

    使用AWS Cognito和React的仅限Facebook / Google的登录名(无用户名/密码)

  3. 3

    创建Windows Phone 8应用并将其连接到数据库的最佳方法(最好是SQL Server)

  4. 4

    为什么Java中的System.out.println()打印到控制台?

  5. 5

    卷曲函数无法解析来自bash中变量的代理

  6. 6

    是什么在Android的consumer-rules.pro和proguard-rules.pro之间的区别?

  7. 7

    设置与Apache POI Excel表散点图标记图标的颜色

  8. 8

    将Qt Pyside2与asyncio await语法一起使用?

  9. 9

    崇高的文字+蟒蛇的蟒蛇

  10. 10

    任务':app:minifyReleaseWithR8'.java.lang.NullPointerException的执行失败(无错误消息)

  11. 11

    OpenJDK的和AdoptOpenJDK的区别

  12. 12

    大型数据集缓存到Spark内存中时,“超出了GC开销限制”(通过sparklyr和RStudio)

  13. 13

    “执行测试CMAKE_HAVE_LIBC_PTHREAD”失败实际上是什么意思?

  14. 14

    使用Core 2.2中的Identity,如何在关闭浏览器15分钟后保持会话活动?

  15. 15

    React中的ForwardRefExoticComponent和ForwardRefRenderFunction有什么区别?

  16. 16

    猫鼬查找结果,然后将字段替换为findOne

  17. 17

    如何降级Google Colab的Torch版本

  18. 18

    Keras提前停止回调错误,val_loss指标不可用

  19. 19

    如何避免VSCode中的“导入路径不能以.ts扩展名结尾”错误?

  20. 20

    Nuxt.JS:如何在页面中获取路由URL参数

  21. 21

    是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

热门标签

归档