0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CORDIC算法简介

sanyue7758 来源:FPGA算法工程师 2023-03-28 09:39 次阅读

CORDIC算法简介

信号处理领域,CORDIC(Coordinate Rotation Digital Computer,坐标旋转数字计算机)算法具有重大工程意义。CORDIC算法由Vloder于1959年在设计美国航空导航控制系统时提出,主要用于解决导航系统中三角函数、反三角函数和开方等运算的实时计算问题。

1971年,Walther将圆周系统、线性系统和双曲线系统统一到一个CORDIC迭代方程里,从而额提出了一种统一的CORDIC算法形式。

CORDIC算法的核心是利用加法和移位的迭代操作去替代复杂的运算,从而非常有利于硬件实现。CORDIC算法应用广泛,如离散傅里叶变换(DFT)、离散余弦变换(DCT)、离散Hartley变换、Chirp-Z变换、各种滤波以及矩阵中的奇异值分解。

在工程领域,可采用CORDIC算法实现直接数字频率合成器(DDS)、计算I/Q信号的幅度和相位。

01

CORDIC基本原理

我们假设在笛卡尔坐标系(也就是我们常见的XY直角坐标系)中,将点(x1,y1)旋转θ角度到点(x2,y2)的标准方法如下所示:

7feca6fc-ccde-11ed-bfe3-dac502259ad0.png

根据上图,我们利用高中学习的三角函数、圆方程和极坐标等中学知识,可以得到:

800f489c-ccde-11ed-bfe3-dac502259ad0.png

这被称为是平面旋转、向量旋转或者线性 ( 矩阵) 代数中的 Givens 旋转。

上面的式子,我们将大学二年级学习的线性代数知识拿出来,用矩阵的形式来表示,于是得到:

8025b802-ccde-11ed-bfe3-dac502259ad0.png

例如,我们做一个90°的相移,即θ=90:

80391a00-ccde-11ed-bfe3-dac502259ad0.png

这里注意cos和sin函数在直角坐标系下的物理意义,于是我们得到下面的图示。

80522e78-ccde-11ed-bfe3-dac502259ad0.png

上面的第一个式子,我们假设提出一个公因子cosθ,那么我们可以得到:

806d3362-ccde-11ed-bfe3-dac502259ad0.png

如果去除项,我们得到 伪旋转 方程式 :

808455ba-ccde-11ed-bfe3-dac502259ad0.png

即旋转的角度是正确的,但是x 与 y 的值增加cos-1θ 倍 ( 由于cos-1θ> 1),所以模值变大。

注意我们并不能通过适当的数学方法去除cosθ 项 , 然而随后我们发现去除项可以简化坐标平面旋转计算操

怎么说呢?

在XY坐标系中,结合上面的伪旋转公式,我们可以用下图表示:

80a06a16-ccde-11ed-bfe3-dac502259ad0.png

于是,我们得出以下结论:

经过伪旋转之后,向量 R 的模值将增加1/cosθ 倍。

向量旋转了正确的角度 , 但模值出现错误。

经过伪旋转后, 输出进行适当的幅度伸缩(1/cosθ),是不是就可以得到旋转后的坐标了。

02

CORDIC方法

CORDIC 方法的核心是 ( 伪) 旋转角θ,其中,

80c992ec-ccde-11ed-bfe3-dac502259ad0.png

这个等式是怎么推导出来的呢?

所以方程为:

80deaa10-ccde-11ed-bfe3-dac502259ad0.png

下面的表格指出用于 CORDIC 算法中每个迭代 (i) 的旋转角度 (精确到 9位小数):

80f76f6e-ccde-11ed-bfe3-dac502259ad0.png

note:由于i是整数,所以对应的角度值都是一一确定的,只能通过几个角度的加减组合来达到你所想要的角度值.

注意有三个方面的变化:

角度累加(减)

坐标值累加(减)

向量的模(也就是长度的,相对于横纵坐标的)累加(减)

这三个累加的变化时不一样的,注意区别,角度的累加和长度的累加有一定的对应关系。

81151758-ccde-11ed-bfe3-dac502259ad0.png

03

角度累加器

8167a36a-ccde-11ed-bfe3-dac502259ad0.png

81925164-ccde-11ed-bfe3-dac502259ad0.png

上述三个方程式为圆周坐标系中用于角度旋转的 CORDIC 算法的表达式。后续部分中我们还将看到CORDIC 算法被用于其它的坐标系,通过使用这些坐标系可以执行更大范围的函数计算。

04

移位-加法算法

因此, 原始的算法现在已经被减化为使用向量的伪旋转来表示的迭代移位-相加算法 :

81bcae14-ccde-11ed-bfe3-dac502259ad0.png

因此,每个迭代需要:

81d5e3c0-ccde-11ed-bfe3-dac502259ad0.png

note:前面提到的去除 cos 项的原因是显而易见的。当将该项去除时,转换公式已经被简化为伪旋转的迭代移位相加计算。

CORDIC 硬件实现结构:

81fc226a-ccde-11ed-bfe3-dac502259ad0.png

05

伸缩因子

前面提到,为了得到伪旋转公式,我们把公因子cosθ忽略了,但在实际运算中,不能就这样简单粗暴抛弃。

我们再次对cosθ进行变形:

82211570-ccde-11ed-bfe3-dac502259ad0.png

于是,我们可以得到:

8243c412-ccde-11ed-bfe3-dac502259ad0.png

如果我们已知了将被执行的迭代次数,我们便可以预先计算出 1/Kn 的值,并通过将 1/Kn 与 x(n) 和 y(n)相乘来校正x(n) 和 y(n) 的最终值。

CORDIC有两种工作模式:旋转模式向量模式

82749178-ccde-11ed-bfe3-dac502259ad0.png

82a304f4-ccde-11ed-bfe3-dac502259ad0.png

82dc04f2-ccde-11ed-bfe3-dac502259ad0.png

8300501e-ccde-11ed-bfe3-dac502259ad0.png

06

三种坐标系下的CORDIC

83325c4e-ccde-11ed-bfe3-dac502259ad0.png

8365cd2c-ccde-11ed-bfe3-dac502259ad0.png

然而, 我们将会看到,通过考虑其它坐标系中的旋转, 我们可以直接计算更多的函数, 如乘法和除法, 进而间接计算更多的其它函数。

838088ba-ccde-11ed-bfe3-dac502259ad0.png

使用其它坐标系的 CORDIC 算法的优点是可以计算更多的函数, 而缺点则是系统将变得更加复杂。当把CORDIC 算法用于线性或双曲坐标系时, 在圆周坐标系中的旋转角度集将不再有效。所以, 这些系统应使用其它的两种旋转角度集。

我们会发现,可以推导出可在 3 个坐标系中表示 CORDIC 方程的通用公式。这意味着在方程式中引入两个新变量。其中一个新变量 (e(i)) 代表了适当的坐标系中用于表示旋转的角度集。

当把CORDIC算法用于双曲线旋转时,伸缩因子K与圆周旋转的因子有所不同。

83bcc3ac-ccde-11ed-bfe3-dac502259ad0.png

我们通过引入一个新变量μ,得到CORDIC的通用方程

83d918d6-ccde-11ed-bfe3-dac502259ad0.png

至此,三个坐标系下的CORDIC方程得到大一统。

842e27b8-ccde-11ed-bfe3-dac502259ad0.png

845fee92-ccde-11ed-bfe3-dac502259ad0.png

8491f608-ccde-11ed-bfe3-dac502259ad0.png

84b68b08-ccde-11ed-bfe3-dac502259ad0.png

在使用FPGA进行CORDIC算法实现时,理想CORDIC 架构取决于具体应用中速率面积的权衡。

可以将 CORDIC 方程直接翻译成迭代型的位并行设计,然而:

位并行变量移位器不能很好地映射到 FPGA 中

需要若干个 FPGA 单元。导致设计规模变大而设计时间变长。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 信号处理
    +关注

    关注

    47

    文章

    854

    浏览量

    102530
  • DDS
    DDS
    +关注

    关注

    21

    文章

    614

    浏览量

    151731
  • DFT
    DFT
    +关注

    关注

    2

    文章

    219

    浏览量

    22466
  • CORDIC算法
    +关注

    关注

    0

    文章

    17

    浏览量

    9696

原文标题:什么是CORDIC算法

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于改进的CORDIC算法的FFT复乘及其FPGA实现

    耗费了FFT运算中大量的乘法器资源。CORDIC算法只需简单的移位与加减运算就能实现向量旋转,具有使用资源少、硬件规模小等优势。因此在FFT蝶形运算中用其代替传统FFT运算中的复数乘法器,可以获得更好
    发表于 07-11 21:32

    CORDIC算法求助

    请问CORDIC算法用verilog算法实现时,角度累加器中的45度,26.56度,14.04度怎么跟verilog语言相对应?
    发表于 07-11 20:18

    FPGA设计中必须掌握的Cordic算法

    大多数工程师在碰到需要在 FPGA 中实现诸如正弦、余弦或开平方这样的数学函数时,首先会想到的是用查找表,可能再结合线性内插或者幂级数(如果有乘法器可用)。不过对这种工作来说,CORDIC 算法
    发表于 09-19 09:07

    利用CORDIC 算法在FPGA 中实现可参数化的FFT

    针对在工业中越来越多的使用到的FFT,本文设计出了一种利用CORDIC 算法在FPGA 上实现快速FFT 的方法。CORDIC 实现复数乘法比普通的计算器有结构上的优势,并且采用了循环结构
    发表于 08-24 09:31 9次下载

    高性能HPOR CORDIC算法及实现

    CORDIC 算法在通信和图像处理等各个领域有着广泛的应用,但是浮点CORDIC 由于迭代延时大且实现复杂没有得到很好的应用,本文提出了一种修正浮点CORDIC
    发表于 12-15 14:27 14次下载

    基于CORDIC算法的NCO实现

    基于CORDIC 算法的NCO 实现田力, 冯琦(西安电子科技大学 电路设计研究所,陕西 西安 710071)摘要:NCO 在信号处理方面有着广泛的应用。而函数发生器是NCO 中的关键部分,
    发表于 12-15 14:30 23次下载

    利用CORDIC算法在FPGA中实现可参数化的FFT

    针对在工业中越来越多的使用到的FFT,本文设计出了一种利用CORDIC算法在FPGA上实现快速FFT的方法。CORDIC实现复数乘法比普通的计算器有结构上的优势,并且采用了循环结构的CORDI
    发表于 08-09 15:39 55次下载

    CORDIC 算法在三轴电子罗盘中的应用

    CORDIC算法是用于计算三角、反三角、指数、对数等超越函数的简捷算法。将该算法应用在以单片机为核心的三轴电子罗盘中,用于实现罗盘的倾斜补偿并计算俯仰角、横滚角和航向
    发表于 10-18 16:52 0次下载

    基于CORDIC算法的载波同步锁相环设计

    研究了一种利用CORDIC算法的矢量及旋转模式对载波同步中相位偏移进行估计并校正的方法。设计并实现了基于CORDIC算法的数字锁相环。通过仿真,验证了设计的有效性和高效性。
    发表于 12-15 14:49 0次下载
    基于<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>的载波同步锁相环设计

    基于CORDIC算法2FSK调制器的FPGA设计

    本文提出了应用CORDIC(Coordinate Rotation Digital Computer)算法实时计算正弦值的方案,并基于CORDIC算法在FPGA芯片上设计了2FSK调制
    发表于 05-31 10:22 1543次阅读
    基于<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>2FSK调制器的FPGA设计

    cordic算法verilog实现(简单版)

    cordic算法verilog实现(简单版)(转载)module cordic(clk, phi, cos, sin); parameter W = 13, W_Z = 14; input clk; input [W_Z-1
    发表于 02-11 03:06 3084次阅读
    <b class='flag-5'>cordic</b><b class='flag-5'>算法</b>verilog实现(简单版)

    基于FPGA的Cordic算法实现的设计与验证

    本文是基于FPGA实现Cordic算法的设计与验证,使用Verilog HDL设计,初步可实现正弦、余弦、反正切函数的实现。将复杂的运算转化成FPGA擅长的加减法和乘法,而乘法运算可以用移位运算代替
    发表于 07-03 10:18 2393次阅读
    基于FPGA的<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b>实现的设计与验证

    基于CORDIC的高速Sobel算法实现

    为提高图像边缘检测的处理速度,提出一种基于CORDIC的高速Sobel算法实现。
    的头像 发表于 10-05 09:54 3332次阅读
    基于<b class='flag-5'>CORDIC</b>的高速Sobel<b class='flag-5'>算法</b>实现

    如何使用FPGA实现CORDIC算法在跟踪环中的应用

    主要介绍了坐标旋转数字计算(CORDIC算法在US,g,鉴别器中的应用,包括码跟踪环、锁频环和锁相环鉴别器,并进行了FPGA实现。在设计中,采用统一cORDIc算法优化方法减少硬件开
    发表于 01-22 16:12 8次下载
    如何使用FPGA实现<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>在跟踪环中的应用

    一文带你们了解什么是CORDIC算法

    CORDIC算法简介 在信号处理领域,CORDIC(Coordinate Rotation Digital Computer,坐标旋转数字计算机)
    的头像 发表于 04-11 11:16 1.3w次阅读
    一文带你们了解什么是<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>