CORDIC算法原理及实现
图4.1 圆坐标系旋转
CORDIC算法原理 --圆坐标系旋转原理
上面的方程组同样可写成矩阵向量形式:
x2 cos y sin 2 sin x1 y cos 1
例如一个90o相移为:
x2 0 1 x1 - y1 y 1 0 y x 1 1 2
x (i 1) x (i ) y (i ) di 2 i y (i 1) y (i ) x (i ) d i 2 i z (i 1) z (i ) d i e (i )
1
z
(0)
通过设定x(0)=1和z(0)=0来计算tan-1y(0)。向量模式 中,判决算子di 满足下面条件:
d i sign ( x (i ) y (i ) )
因此 我们输入x(0)和y(0)(z(0)=0),并通过迭代使y(0) 取值趋近于0。
CORDIC算法原理 --向量模式
CORDIC算法原理 --圆坐标系旋转原理
前面所示的伪旋转现在可以表示为(对每次迭代):
x (i 1) x (i ) d i (2 i y (i ) )
(4.7) 在这里引入第三个方程,被称为角度累加器,用来在 每次迭代过程中追踪累加的旋转角度: z (i 1) z (i ) d i (i ) (4.8) 这里:di=±1。符号di是一个判决算子,用于确定旋转的方向。 上述三个方程式为圆周坐标系中用于角度旋转的CORDIC算法的 表达式。在本章的后续部分中我们还将看到CORDIC算法被用于其 它的坐标系,通过使用这些坐标系可以执行更大范围的函数计算。
CORDIC算法原理 --圆坐标系旋转原理
很显然,每次旋转的方向都影响到最终要旋转的累积 角度。在–99.7≤θ≤99.7的范围内的任意角度都可以旋 转。满足法则的所有角度的总和为99.7。对于该范围之外 的角度,可使用三角恒等式转化成该范围内的角度。当 然,角分辨率的数据位数与最终的精度有关。 cos45xcos26.5xcos14.03xcos7.125…xcos0.0139 =0.60725941 1⁄0.607252941=1.6467602。因此,在13次旋转以 后,为了标定伪旋转的幅度,要求乘以一个系数 1.64676024187。角分辨率的数据位数对最终的旋转精度 非常关键。
通过提出因数cosθ,式4.1可写成下面的形式:
x2 x1 cos y1 sin cos ( x1 y1 tan ) y 2 x1 sin y1 cos cos ( y1 x1 tan )
CORDIC算法原理 --圆坐标系旋转原理
如果去除项cosθ,得到伪旋转方程式:
CORDIC算法原理 --向量模式
在向量模式中选择:di =-sign(x(i)y(i))=>y(i)→0。经过 n 次迭代后,用下式表示:
x (n) k n y (n) 0 z
(n)
( x (0) ) 2 (y ( 0 ) ) 2 y (0) tan x (0)
坐标旋转数字计算机(Coordinate Rotation Digital Computer,CORDIC)算法可以追溯到1957年由J.Volder发 表的一篇文章。 在上个世纪五十年代,在大型实际的计算机中的实 行移位相加受到了当时技术上的限制,所以使用CORDIC 变得非常必要。到了七十年代,惠普公司和其他公司生产 了手持计算器,许多计算器使用一个内部CORDIC单元来 计算所有的三角函数(那时求一个角度的正切值需要延迟 大约1秒中)。
第4章 CORDIC算法原理及实现
何宾 2009.09
本章概述
本章介绍了CORDIC算法的原理,着重介绍了的三个 坐标系及其两种模式下的CORDIC的实现原理,以及迭 代的算法的实现方法。 在此基础上,详细介绍了CORDIC算法在FPGA上的 实现方法及实现过程,并对其性能进行了详细的讨论。
CORDIC简介
并不能通过适当的数学方法去除cosθ项 ,然而随后 发现去除cosθ项可以简化坐标平面旋转的计算操作。 CORDIC方法的核心是伪旋转角度,其中tanθ=2-i。 故方程可表示为:
x 2 x1 y1 tan x1 y1 2 -i y 2 y1 x1 tan y1 x1 2
y1
y2 x x1
x
y
图4.3 线性坐标旋转
线性坐标系旋转 --旋转模式
在旋转模式中选择:di=sign(z(i))=>z(i)→0。n 次迭代 后得到:
x ( n) x ( 0) y ( n ) y ( 0) x ( 0) z ( 0) (4.16)
该等式类似于实现一个移位相加的乘法器。
x ( n ) K n ( x (0) ) 2 ( y (0) ) 2 y (n) 0 z
(n)
z tanh ( y / x )
(0) (0) (0)
1
(4.21)
在双曲坐标系下的坐标变换不一定收敛。当迭代系 数为4,13,40,k,3k+1,…时,该系统是收敛的。 根据三角函数之间的关系,下面的函数可以通过 CORDIC算法的计算得到。
如图4.1,在xy坐标平面内将点(x1,y1)旋转θ角度到点 (x2,y2)。其关系用下式表示: x2 x1 cos y1 sin (4.1)
y 2 x1 sin y1 cos
这被称为是平面旋转、向量旋转或者线性(矩阵)代数 中的Givens旋转。上面的方程组同样可写成矩阵向量形式:
双曲线坐标系旋转 -- 向量模式
根据三角函数之间的关系,下面的函数可以通 过CORDIC算法的计算得到。
exp sinh cosh
Ln 2 tanh [( 1) /( 1)]
1
tanh sinh / cosh
tan sin / cos
x 2 x1 y1 tan y 2 y1 x1 tan
(4.5)
如图4.2所示,即旋转的角度是正确的,但是x 与y 的 值增加倍cos`θ(由于cos`θ>1,所以模值变大)。
CORDIC算法原理 --圆坐标系旋转原理
图4.2 伪旋转描述
CORDIC算法原理 --圆坐标系旋转原理
线性坐标系旋转 --向量模式
在向量模式中选择:di =-sign(x(i)y(i))=>y(i)→0。经 过n 次迭代后,用下式表示:
x ( n) x ( 0 ) y (n) 0
(4.17)
z ( n ) z (0) y (0) / x (0)
这个迭代式可以用于比例运算。在线性坐标系中, 增益是固定值,所以不需要进行标定。
CORDIC简介
二十世纪八十年代,随着高速度乘法器与带有大存 储量的通用处理器的出现,CORDIC算法变得无关紧要了。 然而在二十一世纪的今天,对于FPGA来说, CORDIC一定是在数字信号处理应用中(比如:多输入多输 出(MIMO),波束形成以及其他自适应系统)计算三角函 数的备选技术。
CORDIC算法原理 --圆坐标系旋转原理
图4.4 双曲线坐标系旋转
双曲线坐标系旋转 -- 旋转模式
在旋转模式中选择:di=sign(z(i))=>z(i)→0。n 次 迭代后得到:
x ( n ) An [ x ( 0) cosh z ( 0 ) y 0 sinh z ( 0 ) ] y ( n ) An [ x ( 0) cosh z ( 0) y 0 sinh z ( 0 )( ] 4.19) z (n) 0
-i
(4.6)
表4.1给出用CORDIC算法中每个迭代(i)的旋转角度 (精确到9位小数)
CORDIC算法原理 --圆坐标系旋转原理
表4.1用CORDIC算法中每个迭代(i)的旋转角度
CORDIC算法原理 --圆坐标系旋转原理
在这里,把变换改成了迭代算法。将各种可能的旋转 角度加以限制,使得对任意角度的旋转能够通过一系列连 续小角度的旋转迭代i来完成。旋转角度遵循法 则:tan i 2 i ,遵循这样的法则,乘以正切项变成了移位 操作。 前几次迭代的形式为:第1次迭代旋转45o,第2次迭代 旋转26.6o,第3次迭代旋转14o等。
双曲线坐标系旋转 -- 旋转模式
• 如图4.4,双曲坐标系下的迭代过程可以用下式表ቤተ መጻሕፍቲ ባይዱ:
x (i 1) x (i ) 0 d i (2 i y ( i ) ) x (i ) y (i 1) y (i ) d i (2 i x (i ) ) z (i 1) z (i ) d i tanh 1 (2 i )
CORDIC算法原理 --旋转模式
CORDIC方法有两种操作模式:旋转模式和向量模 式。工作模式决定了控制算子di的条件。在旋转模式中 选择:di=sign(z(i))=>z(i)→0。n 次迭代后得到:
x ( n ) k n ( x ( 0 ) cos z ( 0 ) y ( 0 ) sin z ( 0 ) )
CORDIC算法的向量模式可以得到输入向量的幅度。 当使用向量模式旋转后向量就与x轴对齐(重合)。因 此,向量的幅度就是旋转向量的x值。幅度结果由Kn增 益标定。
线性坐标系旋转 --旋转模式
如图4.3,在线性坐标系下迭代的过程可以用下式 表示:
x (i 1) x (i ) 0 d i (2 i y (i ) ) x (i ) y (i 1) y (i ) d i (2 i x (i ) ) z (i 1) z (i ) d i (2 i )
y (i 1) y (i ) d i (2 i x (i ) )