CORDIC 原理论文信息
-
标题 : The CORDIC Trigonometric Computing Technique
-
作者 : Jack E. Volder
-
发表出处 : IRE Transactions on Electronic Computers, Volume EC-8, Issue 3, Sept. 1959
-
页码: 330-334
-
DOI : 10.1109/TEC.1959.5222693
《CORDIC三角计算技术》中文翻译
摘要
本文描述了一种用于三角学计算的坐标旋转数字计算机技术。该机器通过执行以下迭代方程来进行平面旋转和三角函数计算:
xi+1=xi−m⋅yi⋅di⋅2−iyi+1=yi+xi⋅di⋅2−izi+1=zi−di⋅eixi+1yi+1zi+1=xi−m⋅yi⋅di⋅2−i=yi+xi⋅di⋅2−i=zi−di⋅ei
其中 mm 取值为 +1+1(用于圆周坐标系)、00(用于线性坐标系)或 −1−1(用于双曲坐标系)。对于 m=1m=1,eiei 是满足 tan(ei)=2−itan(ei)=2−i 的角度。该技术特别适用于那些具有并行寄存器移位和高速加法器,但乘法器速度较慢或成本高昂的计算机。它允许在约 nn 次加法中计算 nn 位三角函数,而使用乘法器则需要约 nn 次乘法。
1. 引言
在实时数字计算机中,经常需要将平面坐标系中的一个点 (X,Y)(X,Y) 旋转一个角度 ZZ,或者等价地,计算向量 (X,Y)(X,Y) 的幅度和相位角。这些计算通常涉及以下方程:
x=XcosZ−YsinZy=YcosZ+XsinZxy=XcosZ−YsinZ=YcosZ+XsinZ
或者,为了计算幅度 RR 和角度 AA:
R=(X2+Y2)1/2A=arctan(Y/X)RA=(X2+Y2)1/2=arctan(Y/X)
这些计算通常需要四个乘法、两个加法/减法以及一个平方根或时间上的三角计算。在那些具有快速加法器但乘法器速度较慢或成本高昂的计算机中,能够在不使用乘法器的情况下执行这些操作是可取的。本文描述了一种技术,它通过一系列移位和加法操作来实现这些计算,这些操作与计算数字的位数成比例。
2. CORDIC 计算技术
该技术可以通过考虑图1所示的平面旋转来可视化。

(图1,展示一个向量 (x, y) 旋转角度 θ 到新位置 (x', y')。)
旋转可以通过以下矩阵运算表示:
x′y′\]=\[cosθ−sinθsinθcosθ\]\[xy\]\[x′y′\]=\[cosθsinθ−sinθcosθ\]\[xy
如果我们将旋转角度 θθ 分解为一系列微旋转,每个微旋转一个二进制位,会如何?也就是说,我们选择一系列角度 θiθi,使得 θ=∑θiθ=∑θi,并且每个 θiθi 的正切值是2的负幂次:
tanθi=±2−itanθi=±2−i
那么,
θi=arctan(2−i)θi=arctan(2−i)
这些角度是固定的,可以预先计算并存储在计算机中。现在,第 ii 次微旋转(旋转角度 θiθi)的方程变为:
xi+1=Ki(xi−yi⋅di⋅2−i)yi+1=Ki(yi+xi⋅di⋅2−i)xi+1yi+1=Ki(xi−yi⋅di⋅2−i)=Ki(yi+xi⋅di⋅2−i)
其中 di=±1di=±1(用于控制旋转方向),并且 Ki=cosθi=(1+2−2i)−1/2Ki=cosθi=(1+2−2i)−1/2。
因子 KiKi 在每次迭代中都会出现。然而,如果我们进行固定次数的旋转,并且所有旋转方向都已知,那么总的比例因子 K=∏KiK=∏Ki 是一个常数。对于大量的迭代次数,KK 趋近于 0.60725...。因此,如果我们事先知道要旋转的总角度,我们可以通过使用这个常数 KK 来补偿比例因子。
但是,如果我们希望旋转一个未知的角度 ZZ 呢?在这种情况下,我们可以引入一个第三个变量,它累积到目前为止的旋转角度。我们从一个初始向量 (x0,y0)(x0,y0) 和角度 z0z0(即我们想要旋转的角度)开始。然后我们执行以下迭代:
xi+1=xi−yi⋅di⋅2−iyi+1=yi+xi⋅di⋅2−izi+1=zi−di⋅θixi+1yi+1zi+1=xi−yi⋅di⋅2−i=yi+xi⋅di⋅2−i=zi−di⋅θi
其中 di=sign(zi)di=sign(zi)(即,如果 zizi 为正,则 di=+1di=+1;如果 zizi 为负,则 di=−1di=−1)。这样,变量 zizi 会驱使它自己趋向于零。在迭代过程结束时,znzn 将为零(或在最低位精度范围内),并且我们已经有效地旋转了初始角度 z0z0。
请注意,比例因子 KiKi 在上面的方程中被省略了。为了校正这个,我们可以通过乘以预计算的常数 KK 来预先缩放初始的 x0x0 和 y0y0,或者在计算完成后进行校正。
3. 计算模式
CORDIC技术可以以两种基本模式运行:
-
旋转模式:将一个向量旋转一个角度 z0z0。初始时加载 (x0,y0,z0)(x0,y0,z0),其中 z0z0 是所需旋转的角度。经过迭代后,结果得到 (xn,yn,0)(xn,yn,0),其中:
xn=K(x0cosz0−y0sinz0)yn=K(y0cosz0+x0sinz0)xnyn=K(x0cosz0−y0sinz0)=K(y0cosz0+x0sinz0)
通过选择特殊的初始值,我们可以直接计算三角函数。例如,设置 x0=1/Kx0=1/K, y0=0y0=0,则:
xn=cosz0yn=sinz0xnyn=cosz0=sinz0 -
向量化模式:计算一个向量的幅度和角度。初始时加载 (x0,y0,z0=0)(x0,y0,z0=0)。迭代规则中的 didi 现在由 yiyi 的符号决定:di=−sign(yi)di=−sign(yi)。这样做的目的是在每次迭代中旋转向量,使其趋向于x轴(即使 yiyi 趋向于零)。迭代结束后,我们有:
xn=Kx02+y02(幅度)zn=z0+arctan(y0/x0)(角度)xnzn=Kx02+y02(幅度)=z0+arctan(y0/x0)(角度)
4. 硬件实现与扩展
CORDIC算法的美妙之处在于其硬件实现的简洁性。它只需要三个寄存器(X, Y, Z)、两个移位器(用于产生 2−i2−i 项)和三个加法器/减法器。通过简单的序列控制,同一套硬件可以用于旋转和向量化模式,以及计算各种三角函数和反三角函数。
沃尔特在论文中还指出,通过改变角度序列 eiei 和参数 mm,该技术可以扩展到线性函数(m=0m=0,此时 ei=2−iei=2−i)和双曲函数(m=−1m=−1,此时 )的计算。
5. 结论
CORDIC技术是一种高效的计算方法,特别适合于没有硬件乘法器的数字系统。它用简单的移位和加法操作取代了复杂的乘法运算,为实现三角函数、反三角函数、幅度计算等提供了强有力的工具。
补充说明
-
术语 : "CORDIC" 是 Co ordinate R otation Di gital Computer(坐标旋转数字计算机)的缩写。
-
后续发展: 沃尔特的原始论文主要关注三角计算。后来,约翰·R·沃尔特等人将CORDIC算法推广到双曲坐标系和线性坐标系,使其能够计算双曲函数、指数函数、对数函数等,极大地扩展了其应用范围。
-
现代应用 : 尽管现代通用CPU拥有强大的浮点运算单元,CORDIC算法因其硬件实现简单、节省资源的特点,至今仍在数字信号处理器、FPGA、专用集成电路以及各种嵌入式系统中广泛应用,例如在软件定义的无线电、雷达处理和图形处理器中。