网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C5000文章 >> C54X系列 >> 文章正文
  迭代法求倒数           ★★★ 【字体:
迭代法求倒数
作者:Free    文章来源:本站原创    点击数:    更新时间:2008-2-29    

先推导一下求倒数迭代公式,


1/y ~= x,~=表示约等于
1/(y+dy) = x,Y=y+dy,dy为一个很小的数
1/(y+dy) = (y-dy)/(y*y – dy*dy) 
= (y-dy)/(y*y) 
= (2*y-Y)/(y*y) 
因为dy*dy很小,忽略不计
(y+dy)*= x*y*y/(2*y-Y) = 1
x*y*= 2*y-Y
Y=2*y-x*y*= y*(2-x*y)
若求2*x的倒数,那么就变成了Y=2*y*(1-x*y) (1)

假设x在0.5-1之间,2*x在1-2之间,倒数Y就在0.5-1之间。对于任何整数X,先将其转换为0.5-1之间的数x,然后再按照公式求倒数。

假设 X = x*2^n,用x按照公式求得的倒数为Y,那么实际的倒数为Y/2^(n-1)。例如求3的倒数,3=0.75*4,把0.75转换为Q15的定点小数0x6000,代入公式(1)运算得0x5554,那么实际的倒数就是0x5554/2 = 0x2AAA为0.3333的Q15定点小数。

迭代的初值可以由线性方程求得,2*x = 1 时Y=1,2*x=2时Y=0.5,则初值Y0 = 1.5 – x,用Q15小数表示则为,Y0 = 0x8000 – x + 0x4000

至于如何将整数X转换为x*2^n,则需要DSP的特殊的Normalization命令了。例如C54x里面就有EXP和NORM两个汇编指令来完成这样的任务。详细使用方法请参考相应的汇编指令手册。

#算法演示,Python源程序
def mult_q31(x, y):
    return x*y/0x8000
    
def recp_q31(x):
    y = 0x8000 - x
    y = y + 0x4000
    ny = 0
    while 1:
        ny = 2*mult_q31(y, 0x7fff - mult_q31(x,y))
        print ny
        if ny == y:
            return ny
        else:
            y = ny
            
print recp_q31(0x6000) 
               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号