Cordic算法原理详解

这篇具有很好参考价值的文章主要介绍了Cordic算法原理详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

坐标旋转分析

Cordic算法原理

应用举例1:求sin值与cos值

应用举例2:求反正切值

cosθ的还原补偿


坐标旋转数字计算机CORDIC(COordinate Rotation DIgital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如Sin,Cos,Sinh,Cosh等函数,由J. Volder于1959年提出,首先用于导航系统,使得矢量的旋转和定向运算不需要做查三角函数表、乘法、开方及反三角函数等复杂运算。J. Walther在1974年用它研究了一种能计算出多种超越函数的统一算法。

坐标旋转分析

已知:OA逆时针旋转θ角度后得到OB,线段OA=OB,∠AOB=θ,A 点坐标(x1,y1),B 点坐标(x2,y2);

求证:x2=x1*cosθ - y1*sinθ;y2=x1*sinθ+ y1*cosθ

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

假设OA=OB=m;

假设点B在第一象限,

x1=m*cosα,y1=m*sinα。

 文章来源地址https://www.toymoban.com/news/detail-763387.html

x2=m*cos(α+θ)=m*(cosαcosθ- sinαsinθ)

=m*(cosαcosθ- cosαtanαsinθ)

=m*cosα*(cosθ- tanαsinθ)

=x1*(cosθ- tanαsinθ)

=x1*cosθ-x1* tanαsinθ

=x1*cosθ-y1* sinθ

 

y2=m*sin(α+θ)=m*(sinαcosθ+ cosαsinθ)

=m*sinαcosθ+ m*cosαsinθ)

=y1cosθ+x1sinθ

 

假设点B在第四象限,

x1=m*cosα,y1=m*sinα。

 

x2=m*cos(360°-(θ+α))=m*cos(-(α+θ))=

=m*cos(α+θ)=m*(cosαcosθ- sinαsinθ)

=m*(cosαcosθ- cosαtanαsinθ)

=m*cosα*(cosθ- tanαsinθ)

=x1*(cosθ- tanαsinθ)

=x1*cosθ-x1* tanαsinθ

=x1*cosθ-y1* sinθ

 

y2=-m*sin(360°-(θ+α))=-m*sin(-(θ+α))

=m*sin(α+θ)=m*(sinαcosθ+ cosαsinθ)

=m*sinαcosθ+ m*cosαsinθ)

=y1cosθ+x1sinθ

同理,无论A在第几象限,B旋转到第几象限,公式都成立。

 

Cordic算法原理

将坐标关系写成矩阵形式:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

继续旋转第二次:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

旋转第i次:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

提取出cosθ便得到了初步的cordic算法公式:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

如果将上式中的cosθ忽略掉,则称该旋转过程为伪旋转,角度正确,但是模长变化,即:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

由于硬件比较容易通过移位实现2的乘法与除法,我们固定取第i次(从0开始计数)旋转的角度为cordic,算法,CORDIC,迭代算法,mcu,fpga开发 ,也就是cordic,算法,CORDIC,迭代算法,mcu,fpga开发

参考下表,一般设置旋转16次,既可以认为得到比较精准的逼近值。

第i次旋转

tanθi

角度

旋转弧度

0

2^-0

45°

0.78539

1

2^-1

26.565°

0.46365

2

2^-2

14.036°

0.24498

3

2^-3

7.1250°

0.12435

4

2^-4

3.5763°

0.06241

5

2^-5

1.7899°

0.03123

6

2^-6

0.8951°

0.01562

7

2^-7

0.4476°

0.00781

8

2^-8

0.2238°

0.00391

9

2^-9

0.1119°

0.00195

10

2^-10

0.0559°

0.00098

11

2^-11

0.0279°

0.00049

12

2^-12

0.0139°

0.00024

13

2^-13

0.0069°

0.00012

14

2^-14

0.0035°

0.00006

15

2^-15

0.0017°

0.00003

Cordic 算法的思想是通过迭代的方法,不断的旋转特定的角度,使得累计旋转的角度无限接近某一设定的角度,每次旋转的角度的θ = arctan( 1/(2^n) );

以目标角度α=30°为例,可以经过如下迭代得到:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

 

应用举例1:求sin值与cos值

当z(0)=30°时,计算sin z(0),cos z(0).

迭代计算方法如下表,其中z(i)表示第i次迭代前和目标角度的差值;di表示z(i)的正负;θ(i)表示第i次迭代发生旋转的角度;y(i)为第i次迭代前的纵坐标;x(i)为第i次迭代前的横坐标;

迭代过程中,根据下式计算x(i+1)与y(i+1)的值,tanθ直接调用上一节表格中的值进行计算。

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

迭代过程如下:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

通过cordic算法后,得到sin30°=0.5006,cos30°=0.8657。

结果没有问题,但是x(0)为什么取0.6073呢?继续往下看吧~答案就在后面~

 

应用举例2:求反正切值

当y(0)=2,x(0)=1,求cordic,算法,CORDIC,迭代算法,mcu,fpga开发 .

z(i)表示第i次旋转前总共旋转的角度;θ(i)表示第i次迭代发生旋转的角度;y(i)表示第i次旋转前的纵坐标;di表示θ(i)的正负方向,在下表中省略。

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

通过cordic算法后,得到cordic,算法,CORDIC,迭代算法,mcu,fpga开发

 

cosθ的还原补偿

前面分析cosθ时讲到了伪旋转,每旋转1次,模长缩小了cosθi,我们如果最终须要恢复原有模长的话,就需要在最后的结果上乘以补偿系数An。

设Ai为第i次旋转的补偿系数,,根据三角函数及勾股定理可得:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

补偿因子An:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

旋转的次数越多,旋转的角度趋近于0°,Ai趋近于1,经过计算,当n趋于无穷大时,An趋近于0.607252935。

即,当i趋于无穷大时:

cordic,算法,CORDIC,迭代算法,mcu,fpga开发

 

到了这里,关于Cordic算法原理详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】Xilinx Cordic IP 内核使用记录(输入输出数据格式介绍)及实验仿真

    Rotate 实现的功能是坐标的旋转。 输入 X, Y, Phase 输出X’, Y’ 具体实现的功能对应的数学表达形式如下: 在做FFT 复乘旋转因子时也可以用这个IP核的Rotate功能来实现。旋转因子-旋转! Translation 实现的功能是求模,以及向量的夹角 输入 X, Y 输出X’ and Phase 具体实现的功能对应

    2024年02月07日
    浏览(50)
  • Vivado cordic IP核rotate和translate使用详解(附有代码)

    Vivado cordic IP核rotate和translate使用详解(附有代码) 目录 前言 一、cordic简介 二、使用cordic IP核需要知道的预备知识 1.数据端口 2.Q Numbers Format 3.Vector Translation 4.Vector Rotation 三、IP核配置说明 1.translate 2.Rotate 四、Translate仿真 1.顶层代码 2.仿真代码 五、Rotate仿真 1.顶层代码 2.仿真代

    2023年04月27日
    浏览(37)
  • vivado CORDIC ip核计算arctan记录

    本文主要记录自己使用vivado CORDIC ip 核计算arctan的过程。 下面是我测试工程的具体配置。 要计算arctan需要在 Functional Selection 选择为“Arc Tan”,结构默认为并行结构。 Pipelining Mode 可以设置为最大值(Maximum)、最优值(Optimal)和不设置流水线(No pipelining即纯组合逻辑实现)

    2024年02月07日
    浏览(36)
  • 【STM32】STM32G系列使用CORDIC模块加速计算

    STM32G431系列产品内置了CORDIC运算单元,可以用来加速数学计算,如三角函数、取模、开方等。适合大量数据进行相同的运算操作。配合DMA可以大大节省CPU计算开销。 使用CORDIC模块无需配置参数,若采用DMA方式则只需配置DMA读写通道,配置如下 在代码中对cordic模块进行初始化

    2024年02月12日
    浏览(40)
  • 基于SPI的FPGA-MCU通用通信界面设计与技术详解

    FPGA与MCU之间的通信想必是很多异构人极为头疼的难题。如果每次写一个工程都要大费周章重写通信逻辑、通信协议之类的东西,不仅耗费心神,而且浪费时间。本文基于安陆PH1A90SBG484,提出一个已经通过门级仿真验证的通用通信界面解决方案。详细代码见以下链接: Github代

    2024年02月04日
    浏览(51)
  • [Unity] 基于迭代器的协程底层原理详解

    Unity 是单线程设计的游戏引擎, 所有对于 Unity 的调用都应该在主线程执行. 倘若我们要实现另外再执行一个任务, 该怎么做呢? 答案就是协程. 协程本质上是基于 C# yield 迭代器的, 使用 yield 语法生成的返回迭代器的方法, 其内部的逻辑执行, 是 “懒” 的, 只有在调用 MoveNext 的时

    2024年01月16日
    浏览(43)
  • 数据结构与算法----详解二叉树的遍历(迭代、递归)

    ❤️ 作者简介 :大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生,蓝桥杯国赛二等奖获得者 🐟 个人主页 :https://blog.csdn.net/qq_52007481 ⭐ 个人社区 :【小鱼干爱编程】 🔥 算法专栏 :算法竞赛进阶指南 💯 刷题网站 :虽然市面上有很多的刷题网站,但是里面

    2024年01月24日
    浏览(54)
  • MCU最小系统原理图中四个问题详解——芯片中有很多电源管脚的原因(VDD/VSS/VBAT)、LC滤波、两级滤波、NC可切换元件

    前言: 本文对MCU最小系统原理图中的四个问题进行详解:芯片中有很多电源管脚的原因(VDD/VSS/VBAT)、LC滤波、两级滤波、NC可切换元件。本文以GD32F103C8T6最小系统原理图举例 目录: 芯片中有很多电源管脚的原因(VDD/VSS/VBAT) 两级滤波 LC滤波 NC可切换元件 本文以GD32F103C8T6最

    2024年01月17日
    浏览(41)
  • FPGA图像处理的一些方法、原理和算法优缺点介绍

    目录 一、FPGA图像处理的基本原理 二、FPGA图像处理的方法 1. 图像滤波 2. 边缘检测 3. 图像分割 4. 图像增强 5. 图像目标提取算法 6. 注意事项 三、FPGA图像处理的应用 1. 医学影像 2. 工业检测 3. 安防监控 四、总结 注意:后续技术分享,第一时间更新,以及更多更及时的技术资

    2024年02月15日
    浏览(47)
  • 语音降噪系统 FPGA 实现及算法详解

    语音降噪系统 FPGA 实现及算法详解 在日常的语音通信中,由于外部噪声等干扰因素的存在,会使得语音质量受到影响,甚至无法正常进行通信。为了解决这个问题,我们可以利用 SOPC 技术实现语音降噪系统,并在其中应用相应的算法。 在本文中,我们将探讨如何基于 FPGA 平

    2024年01月20日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包