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°,根据上式计算旋转后的该向量的横纵坐标,
上面的如前所述,只需要进行移位和加减运算就可以得到,至于 cos45°,我们先保留着,后面会有惊喜。
45°离50°还有5°,按理接下来应该再转5°就可以了,但是实际上不能这样,因为我们不知道 tan5° 是多少,即使知道了,计算 y∗tan5° 和 y∗tan5° 也很费时。
所以我们需要根据前面的标准角度序列,选择26.5651° ,经过这次旋转以后,新的横纵坐标分别为
此时的角度是 71.5651°,大于要计算的角度 θ = 50°,因此接下来要旋转 −14.0362°,一直进行下去,最终的角度会越来越接近 50°。
比如我们旋转了8次之后,角度为,此时单位向量的横纵坐标为
。
49.9601° 和 50° 应该算很接近了吧,而且需要的话,我们还可以旋转更多的次数,更加逼近 50°。
此时就剩下最后一点遗憾了,就是我们还没有彻底计算出 sin49.9601° 与 cos49.9601°,我们还不知道系数的值等于多少?
让人振奋的是,随着旋转次数的增多,这个连乘序列最终收敛到一个值,就是 0.6072529
为什么呢?
因为,于是上面的连乘序列就成了
。
数学上可以证明其收敛性,我们这里做一个直接的计算验证一下,如下图
掌握各种技巧、方法和工具,与此同时培养起自己的核心技能,提高自己的稀缺性和不可替代性。觉得不错,动动发财的小手点个赞哦!