![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 迭代法求倒数 | |||||
作者: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 = x*y*y/(2*y-Y) = 1 x*y*y = 2*y-Y Y=2*y-x*y*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条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|