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、专用集成电路以及各种嵌入式系统中广泛应用,例如在软件定义的无线电、雷达处理和图形处理器中。

相关推荐
陈广亮10 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬10 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia10 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区11 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两13 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪14 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat2325514 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
王鑫星14 小时前
SWE-bench 首次突破 80%:Claude Opus 4.5 发布,Anthropic 的野心不止于写代码
人工智能
lnix14 小时前
当“大龙虾”养在本地:我们离“反SaaS”的AI未来还有多远?
人工智能·aigc