CORDIC算法收敛性证明
cordic算法通过·移位、加减、简单乘除与迭代即可实现三角函数值的转换,
详细的作用、优缺点基本原理与实现介绍,参考如下两篇博客:
https://www.eefocus.com/fpga/422418
https://www.cnblogs.com/touchblue/p/3535968.html
本文主要说明其收敛性。
首先得有无穷小项,确保拟合收敛精度,其次确保后级调控角度足够,因为每个角度值只能用一次,或加或减,用过了下次就必须用下一次迭代角度,所以如果每次迭代角度值衰减太快(极端情况,如当某个角度后续所有角度求和后收敛值小于该级误差,那后面即使全加不减也无法修正这个误差)。
进一步,corlic角度可以与pi/4/2 ^n 进行比较,然后与pi/4/2 ^ (n-1),列出比较式,根据导函数来判断,不难发现corlic是位于两者之间的,此处不再列出过程。
matlab中简单列出前64项观察:黑色–corlic , 绿色pi/4/2 ^ (n-1), 红色 pi/4/2 ^n,可以看到黑色夹在两者之间。结合前面推导的收敛证明,**说明经过n次运算后,说明经过n次运算后,本级误差 ≤ 本级Corlic角≤pi/4/2 ^ (n-1),也即32位宽的corlic值,对应角度精度误差至少能够保证到 不超过 pi/4 / 2^30 **
clear;
format longE;
n = linspace(0,63,64);
Angle_corlics = atan((1/2).^n);
plot(Angle_corlics,'k');
hold on
Angle_sn = (1/2).^n* (pi/4);
plot( Angle_sn , 'r');
n1 = linspace(-1,62,64);
Angle_sn1 = (1/2).^n1* (pi/4);
plot( Angle_sn1 , 'g');
sub1 = Angle_sn1 - Angle_corlics
MIN=min(sub1)
输出MIN =
6.188586175577728e-20 > 0
补充:为何可以最后运算完成后统一乘上系数
由旋转坐标:
x2 、y2 同时拥有cosθ ,而决定角度关系的是其比值,同时乘除系数只会影响对应的赋值,而不会影响每次旋转角度,故可在最后处理 (cosθ1 *cosθ2 *cosθ3 …) 。