世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创

数字均方根算法

[复制链接]
查看: 11427 |回复: 24
1
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2010-4-7 10:11:34
在数字电源中,经常要计算交流有效值,即所谓数字均方根算法,其中最关键的算法是开平方,在没有硬件乘法器情况下,一般基于牛顿叠代法的sqt()算法耗费太多的时间,以至于延误甚至丧失控制时机。这里给出两个最快速的开平方函数C语言代码。速度非常快,即使有硬件乘法器,也比牛顿叠代法还快。

// 2字节开平方程序
unsigned char a,b,p=0x80;
unsigned int K,A,B,C,R=0x4000,D=60000;
  void main()
  {
  sqt1();
  B=A=0;R=0x4000;     //恢复数据
  sqt2();
  }

sqt1(){                       //第一个函数
do{
   b=a-p;B=C;B>>=1;
   if(A){K=A;K>>=1;}
     else K=0x8000;       //补码
     B+=K;B-=R;
     if(D>B)C=B;
       else{A=B;a=b;}
     p>>=1;R>>=2;
     }while(p!=1);                 //循环7次
p=(A-C)>>2;A-=p; C+=p;    //小数处理
b=a;
if(D>B)B++;
}         

sqt2(){                  //第二个函数
do{
    A=B+R;B>>=1;
    if(A<=D){
       D-=A;B+=R;}
    R>>=2;
}while(R);             //循环7次
if(D>B)B++;         //小数处理
}

其中,D为被开方数,b为sqt1()的根,B为sqt2()的根.
两个函数精度一样,都是小数部分严格四舍五入,速度sqt2()更快一点(约300个指令周期)

R为计算初始参数(p为其平方根---仅为sqt1()使用),取值根据被开方数最大值确定:
被开方数D         R(16进制)      
2字节16位         0x4000         
         18位         0x10000      
         20位         0x40000      
         22位         0x100000     
3字节24位         0x400000     
4字节32位         0x40000000     
......以此类推.
即:R与D长度相同时,次高位为1,其余为0
风铃
  • 风铃
  • 离线
  • LV6
  • 高级工程师
  • 积分:537
  • |
  • 主题:20
  • |
  • 帖子:136
积分:537
LV6
高级工程师
  • 2010-4-7 13:13:24
 
关注学习
pandy
  • pandy
  • 离线
  • LV8
  • 副总工程师
  • 积分:2371
  • |
  • 主题:49
  • |
  • 帖子:446
积分:2371
LV8
副总工程师
  • 2010-4-20 15:26:31
 
程序看不懂了,我不是学软件的。能把你的算法用文字表达一下吗?说说的计算方法?
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2010-4-20 15:35:25
 
不知道数学定理你是否能够看懂,下面是别人转摘我的博文:
http://wenku.baidu.com/view/d0a4ccc9a1c7aa00b52acbe7.html
         
        结论:

        本文首先提出并证明了整数平方数中值定理,进而提出一种基于此定理的的快速开方算法,并给出了具体的计算流程。由于全部运算不使用乘法运算或幂运算,只使用加、减、移位、逻辑等简单运算,只引入极少的初始变量,在经过有限次循环后即可迅速逼近整数的整数平方根的精确解(小数部分严格4舍5入),从而把整数开方运算的机器时间减少到极限。其运算速度较之目前最快的牛顿迭代法提高了一个数量级,达到与乘法运算相当的水平。
chaitao
  • 积分:581
  • |
  • 主题:71
  • |
  • 帖子:79
积分:581
LV6
高级工程师
  • 2010-5-11 10:59:49
 
真不错
Bodoni
  • 积分:12335
  • |
  • 主题:253
  • |
  • 帖子:5182
积分:12335
LV10
总工程师
  • 2012-2-8 18:14:47
 
厉害,软硬兼施。。
yetuanchun
  • 积分:104
  • |
  • 主题:0
  • |
  • 帖子:2
积分:104
LV2
本网技师
  • 2012-3-12 21:50:30
 
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2012-3-13 08:02:46
 
你这个是牛顿迭代法,慢一个数量级
hewusi
  • 积分:166
  • |
  • 主题:3
  • |
  • 帖子:18
积分:166
LV2
本网技师
  • 2012-3-31 15:04:50
 
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2013-1-20 12:35:06
 
大家看看这篇论文:《单精度浮点数开方算法设计及FPGA实现》
http://www.doc88.com/p-264188369669.html
文中一字不差地引用了我提出的《整数平方数中值定理》,作为整个论文的基石。而在所有地方都不提该定理的原创作者,起码参考文献应该有吧?也没有!是不是有点不尊重人呢?我该怎么办?
bridgnsl
  • 积分:4816
  • |
  • 主题:17
  • |
  • 帖子:2077
积分:4816
LV8
副总工程师
  • 2013-1-20 13:17:52
 
嗯,不错,很好!年轻有为啊!
你的定理发表在神马地方了呢?


年轻人,你是个年轻小伙子吧?
把自己实践中的心得体会发现发明,能够无偿地与大家分享,是过激公产注意的体现,功德无量啊!
加油吧,小伙子!
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2013-1-20 16:47:10
 
你凭啥就认定我是个小伙子呢?
我凭你的跟帖就认定你是个小丑,看你卖萌,看你表演,看你如何丢丑,也算是个乐子
bridgnsl
  • 积分:4816
  • |
  • 主题:17
  • |
  • 帖子:2077
积分:4816
LV8
副总工程师
  • 2013-1-20 17:03:08
 
不是小伙子,那你还是个大姑娘啊?
跟你贴,是想帮助你,老夫这么大年龄了,看你个矛头小伙子说粗话,老夫不介意!
卖萌?还去和你的小朋友们卖吧!老夫不可惜汉这个!
老夫自从来到你这个摊子,就是对你进行指导和帮助的,你小子居然敢说老夫是表演,丢丑,还想看乐子,
好吧,只要你小伙子,技术上在老夫帮助下提高了,老夫也就新马一组了,不跟你小伙子计较神马!
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2013-1-20 17:08:23
 
小子,想要证明自己不是小丑很容易,你只要在论坛上做哪怕一件正经事,说哪怕一句正经话,你就可以洗脱“小丑”的名头了。
不过我也得感谢你,此贴已经下沉很久了,你冒着丢丑的风险不断使它浮上来,无论如何也要说声“射射鸟!”
bridgnsl
  • 积分:4816
  • |
  • 主题:17
  • |
  • 帖子:2077
积分:4816
LV8
副总工程师
  • 2013-1-20 17:12:49
 
小伙子/大姑娘,老夫在摊子里做的都是正经事,说的都是正经话,何来小丑的称号?
老父从来都不是小丑,也根本没有洗脱一说!
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2013-1-20 17:16:55
  • 倒数10
 
小丑当然不会承认自己是小丑,傻瓜也不会承认自己是傻瓜,这个很正常。
再次射射
bridgnsl
  • 积分:4816
  • |
  • 主题:17
  • |
  • 帖子:2077
积分:4816
LV8
副总工程师
  • 2013-1-20 17:19:14
  • 倒数9
 
好吧,老夫不跟你个小伙子/大姑娘,一般见识。
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2013-1-20 17:23:38
  • 倒数8
 
一般情况下,小丑与小丑一般见识,这个地球人都知道。 你能跟我一般见识,就不叫小丑了。
再次射射
星宇
  • 积分:18210
  • |
  • 主题:29
  • |
  • 帖子:4755
积分:18210
版主
  • 2013-1-20 18:37:32
  • 倒数7
 
看你俩表演!哈哈。。。。。。。
aninstone
  • 积分:1059
  • |
  • 主题:2
  • |
  • 帖子:96
积分:1059
LV6
高级工程师
  • 2014-8-11 14:05:12
  • 倒数6
 
学习关注
aninstone
  • 积分:1059
  • |
  • 主题:2
  • |
  • 帖子:96
积分:1059
LV6
高级工程师
  • 2015-5-30 00:09:05
  • 倒数5
 
没看懂
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2016-1-27 09:48:45
  • 倒数4
 
看定理,网上很多了(作为普通人,能有个被广泛应用的数学定理留存于世,足慰平生了)

111.jpg

victor_2016_21C
  • 积分:39
  • |
  • 主题:0
  • |
  • 帖子:5
积分:39
LV1
本网技工
  • 2016-6-10 03:13:29
  • 倒数3
 
我还没有试,看了很高兴,该方法如果用好了,我工厂每年可以省5万元,您因该在您的博客上留个邮箱,如果确实能赚钱,我觉得我赚的钱有您的一部分。
nc965
  • 积分:92945
  • |
  • 主题:115
  • |
  • 帖子:27162
积分:92945
版主
  • 2016-6-10 09:37:06
  • 倒数2
 
首次发表的博文是2006年,那时的博客平台才起步,找了一个号称最可靠的平台(结果几年后就找不到了)发表了若干文章,其中包括此文。后被大量转载,部分转载保留了我的名字和最初的年份,你还可以看到【作者:李义 2006】这样的字样,很多就没有保留了,还有的甚至声称是自己的原创,就有点可笑了。

各国的专利法都有规定,科学发现、数学定理这样的是不能申请专利的,因为会限制人类科学进步,因此发表出来只能是方便别人,没有盈利的目标,能解决你企业的问题我感觉很欣慰,这也是我的初衷。


victor_2016_21C
  • 积分:39
  • |
  • 主题:0
  • |
  • 帖子:5
积分:39
LV1
本网技工
最新回复
  • 2016-6-10 16:20:41
  • 倒数1
 
能否告诉您的联系方式,具体事项见我给您的私信,
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号