数学-坐标旋转数字计算法(CORDIC算法)

CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。>>>来自:百度百科

先看一个问题:如下图,已知 y 和 x,如何计算角度 θ?

可能很多人第一反应是:这太简单了,求不就可以了。但是计算机内部,只能做加减乘除,如果要计算反正切,需要做级数展开

这其中包含了大量的乘法和除法运算,计算速度会很慢。能不能有一种方法,减少乘法和除法运算呢?

这里有一个最原始的办法,假如我们有一系列的标准角度尺,其度数分别为:

这里你可能会好奇,为什么角度尺系列不是,而是上面这些有点接近,又比较奇怪的系列呢?

接下来,我们就可以用这些角度尺进行度量,首先拿45°尺子与这个角度进行比较,看看比这个角度大还是小?如果小,再加一个26.5651° 的看看,如果此时变大了,就减一个14.0362°。就这样一直比下去,最终就会得到一个非常接近真实值的测量结果。比如待测角度是53°,测量过程如下:

45°尺子小了,一个26.5651°的尺子,变成71.5651°,又大了,

好,那我们就一个14.0362°,变成57.5289°,有点接近了,但还是有点大,

好,那我们再一个7.12502° ,变成50.4039°,又变小了,

好,再一个3.57633° ,变成53.9802°,又变大了,

好,在一个1.78991° ,变成52.1903°,又变小了,

没关系,再一个0.895174°,变成53.0855° ........

如此持续下去,结果会越来越接近真实值53°。

这里有一个问题,上面的比较过程中,可以用肉眼进行观测,但是计算机如何判断下一次应该还是呢?

这个其实也不难,我们只需要对原始向量(x,y)做对应角度的旋转,看看旋转后的纵坐标是否大于零,就知道下一次是该加,还是该减了。

比如,已知 x 和 y 分别是0.601815和0.798636,计算对应的角度。首先逆时针旋转 45°,计算一下旋转后的x1 和 y1,这个有现成的欧拉公式

等等,这里面好像有问题。首先,我们不知道 sin⁡α 和 cos⁡α 的值;其次,这不又要做乘法运算了吗?

惊艳一幕要出现了!

把公式(1)稍作改造,把 cos⁡α 提出来,得到

不要忘了,我们的目的是判断旋转后的纵坐标 y1 是否大于零,以决定下一次旋转的方向,因此并不需要计算 cos⁡α。于是,乘法运算只剩下 y∗tan⁡α 和 x∗tan⁡αx 了。

还记得我们前面的疑惑吗?为什么我们选择红色框内的数据

作为标准角度尺序列,而不是

因为这个角度序列的 tan 值正好是:

那又怎么样呢?此时,计算 y∗tan⁡α 和 x∗tan⁡α 就变得异常容易和快速,只需要做移位操作就可以了!

你说惊艳不惊艳!

当然,这还不是全部,我们接着往下看。

上面是知道正切值计算角度,如果知道角度,想要计算正切值,又该如何处理呢?

我们都知道,如果能计算出 sin⁡θ 和 cos⁡θ,则只需做一次除法就可以了。

问题是如何计算 sin⁡θ 和 cos⁡θ ?

考虑到,因此只需要知道 y、x 和 r 就可以了。如果在单位圆内,则只需知道 y 和 x 就可以了。

还是举一个例子吧,比如已知 θ = 50° ,如何计算该角度在单位圆内对应的 y 和 x 呢?

这里再把欧拉公式拷贝过来以方便理解

我们从向量(1, 0)出发,首先旋转45°,根据上式计算旋转后的该向量的横纵坐标,

上面的如前所述,只需要进行移位和加减运算就可以得到,至于 cos⁡45°,我们先保留着,后面会有惊喜。

45°离50°还有5°,按理接下来应该再转5°就可以了,但是实际上不能这样,因为我们不知道 tan⁡5° 是多少,即使知道了,计算 y∗tan⁡5° 和 y∗tan⁡5° 也很费时。

所以我们需要根据前面的标准角度序列,选择26.5651° ,经过这次旋转以后,新的横纵坐标分别为

此时的角度是 71.5651°,大于要计算的角度 θ = 50°,因此接下来要旋转 −14.0362°,一直进行下去,最终的角度会越来越接近 50°。

比如我们旋转了8次之后,角度为,此时单位向量的横纵坐标为

49.9601° 和 50° 应该算很接近了吧,而且需要的话,我们还可以旋转更多的次数,更加逼近 50°。

此时就剩下最后一点遗憾了,就是我们还没有彻底计算出 sin49.9601° 与 cos49.9601°,我们还不知道系数的值等于多少?

让人振奋的是,随着旋转次数的增多,这个连乘序列最终收敛到一个值,就是 0.6072529

为什么呢?

因为,于是上面的连乘序列就成了

数学上可以证明其收敛性,我们这里做一个直接的计算验证一下,如下图


掌握各种技巧、方法和工具,与此同时培养起自己的核心技能,提高自己的稀缺性和不可替代性。觉得不错,动动发财的小手点个赞哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上电路设计

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值