CORDIC三角计算技术

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+1​yi+1​zi+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=Xcos⁡Z−Ysin⁡Zy=Ycos⁡Z+Xsin⁡Zxy​=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+1​yi+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+1​yi+1​zi+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技术可以以两种基本模式运行:

  1. 旋转模式:将一个向量旋转一个角度 z0z0​。初始时加载 (x0,y0,z0)(x0​,y0​,z0​),其中 z0z0​ 是所需旋转的角度。经过迭代后,结果得到 (xn,yn,0)(xn​,yn​,0),其中:

    xn=K(x0cos⁡z0−y0sin⁡z0)yn=K(y0cos⁡z0+x0sin⁡z0)xnyn=K(x0cosz0−y0sinz0)=K(y0cosz0+x0sinz0)

    通过选择特殊的初始值,我们可以直接计算三角函数。例如,设置 x0=1/Kx0​=1/K, y0=0y0​=0,则:
    xn=cos⁡z0yn=sin⁡z0xnyn=cosz0=sinz0

  2. 向量化模式:计算一个向量的幅度和角度。初始时加载 (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技术是一种高效的计算方法,特别适合于没有硬件乘法器的数字系统。它用简单的移位和加法操作取代了复杂的乘法运算,为实现三角函数、反三角函数、幅度计算等提供了强有力的工具。


补充说明

  1. 术语 : "CORDIC" 是 Co ordinate R otation Di gital Computer(坐标旋转数字计算机)的缩写。

  2. 后续发展: 沃尔特的原始论文主要关注三角计算。后来,约翰·R·沃尔特等人将CORDIC算法推广到双曲坐标系和线性坐标系,使其能够计算双曲函数、指数函数、对数函数等,极大地扩展了其应用范围。

  3. 现代应用 : 尽管现代通用CPU拥有强大的浮点运算单元,CORDIC算法因其硬件实现简单、节省资源的特点,至今仍在数字信号处理器、FPGA、专用集成电路以及各种嵌入式系统中广泛应用,例如在软件定义的无线电、雷达处理和图形处理器中。

相关推荐
立志成为大牛的小牛4 小时前
数据结构——二十九、图的广度优先遍历(BFS)(王道408)
数据结构·数据库·学习·程序人生·考研·算法·宽度优先
taxunjishu4 小时前
Ethernet/ip 转 Modbus RTU 驱动,罗克韦尔 PLC 与华为逆变器打造光伏电站智能监控典范
人工智能·物联网·自动化·区块链
Alex艾力的IT数字空间4 小时前
基于PyTorch和CuPy的GPU并行化遗传算法实现
数据结构·人工智能·pytorch·python·深度学习·算法·机器学习
仰泳的熊猫4 小时前
LeetCode:51. N 皇后
数据结构·c++·算法·leetcode
独自破碎E4 小时前
LeetCode 381: O(1) 时间插入、删除和获取随机元素 - 允许重复
java·算法·leetcode
却道天凉_好个秋4 小时前
OpenCV(十三):通道的分离与合并
人工智能·opencv·计算机视觉
七宝大爷4 小时前
NVIDIA Blackwell Ultra GB300深度解析:AI芯片性能的新巅峰
人工智能·gpu·gb300
鲸鱼在dn4 小时前
大语言模型的后训练与“灾难性遗忘”问题——李宏毅2025大模型第六讲笔记
人工智能·笔记·语言模型
Miraitowa_cheems4 小时前
LeetCode算法日记 - Day 81: 最大子数组和
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先