公式(2-5)
我们定义这种旋转为伪旋转,公式(2-5)叫做伪旋转方程式。因为去掉了cos(θ),这样使得每次循环又减少了乘法运算的次数,但带来的影响是,每次旋转后得到的新坐标点到原点的距离都改变了了,因为cos(θ)<1,所以实际值是增大了,而增大后的值是原来的1/cos(θ)倍。但我们求的是角度θ值得大小,所以对于ρ值的变化,我们暂且搁置。这样一来,每次循环的乘法运算一下就从4次减少到了2次了。
我们知道,CORDIC算法的思想是通过迭代的方法,不断地旋转某一特定的角度,而这角度就是使得其正切值为上一值得一半,从而使得累计的旋转角度为最开始设定的值。每次旋转的角度值为:θ=arctan(1/(2^n)),即,那我们是如何确定这个特定的值呢?
一开始我们采用角度减半的方式进行迭代,因为第一次循环时,tan(45°)=1,所以第一次循环是不需要乘法运算的。那么第二次迭代的角度为22。5°,我们要tan(22。5°)=0。41421356,但这是个没有规律的小数。所以我们要用二分查找法得出它的值,尽管二分查找法的效率很高,但也同样不可避免的使用到了乘法器,这样一来,不但增加了资源的占用率,还大大降低了运算的速度。这是我们所不想看到的结果,像乘法器这样占用资源的我们能少用便少用。所以我们还得对每一次迭代的角度进行修改,我们需要选择一个在22。5°和45°之间的角度值,尽管这样会降低查找的效率,却能有效的减少使用乘法器的次数,这样就能提高运算的速率了。如果按照原来的旋转角度来算,也就是二次旋转采用26。565051177078°而不是22。5°,tan(26。565051177078°)=1/2,那么需要进行运算是乘以1/2,因为我们采用的计算方法是定点数运算,乘以对应的操作就是乘数右移一位。而移位运算在硬件中实现是很非常方便的,运算足够快,这样第二次迭代中的乘法运算也被消除了。使用同样的方法,在第三次循环中不用11。25°,而采用14。0362434679265°,tan(14。0362434679265°)=1/4。也就是乘数右移两位就可以了。剩下的都以此方法类推,如下表所示,表中记录的是乘法器每一次右移时对应的tan(θ)值对,及他们对应角度θ的值,还有在每次伪旋转时去掉的伸缩因子cos(θ)的值,我们可以得到表2-1。
表2-1 迭代次数所对应的旋转角
i
0 45。0000 1 0。707106781
1 26。5651 0。5 0。894427191
2 14。0362 0。25 0。970142684
3 7。1250 0。125 0。992277877
4 3。5763 0。0625 0。998052578
5 1。7899 0。03125 0。999512076
6 0。8952 0。015625 0。999877952
7 0。4476 0。0078125 0。999969484
8