版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Pieces_thinking/article/details/83512820

CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode )

网上有很多类似的介绍,但是本文会结合实例进行介绍,尽量以最简单的语言进行解析。

CORDIC ( Coordinate Rotation Digital Computer ) 是坐标旋转数字计算机算法的简称,
由 Vloder• 于 1959 年在设计美国航空导航控制系统的过程中首先提出[1], 主要用于解决导航系统中三角函数、 反三角函数和开方等运算的实时计算问题。 1971 年, Walther 将圆周系统、 线性系统和双曲系统统一到一个 CORDIC 迭代方程里 , 从而提出了一种统一的CORDIC 算法形式[2]。
CORDIC 算法应用广泛, 如离散傅里叶变换 、 离散余弦变换、 离散 Hartley 变换、Chirp-Z 变换、 各种滤波以及矩阵的奇异值分解中都可应用 CORDIC 算法。 从广义上讲,CORDIC 算法提供了一种数学计算的逼近方法。 由于它最终可分解为一系列的加减和移位操作, 故非常适合硬件实现。 例如, 在工程领域可采用 CORDIC 算法实现直接数字频率合成器。 本节在阐述 CORDIC 算法三种旋转模式的基础上, 介绍了利用 CORDIC 算法计算三角函数、 反三角函数和复数求模等相关理论。 以此为依据, 阐述了基于 FPGA 的 CORDIC 算法的设计与实现及其工程应用。

1 CORDIC 算法之圆周系统及其数学应用

在圆周系统下, CORDIC 算法解决了三角函数的计算问题,其中圆周系统又分旋转模式和向量模式。

1.1 圆周系统之旋转模式( Rotation Mode )

如图 3.69 所示, 在单位圆上, 向量 OP与X轴正半轴夹角为 α , 故P点坐标可表示为式(3.91):

  将向量 OP 逆 时 针 旋 转θ角 至 向 量 OQ,此 时 OQ与X轴正半轴夹角为 α + θ ,故 Q 点坐标可以表示为:


 这里定义 θ为目标旋转角度。 根据三角函数公式可将式 (3.92) 展开为:

将式 (3.91 ) 代入式 (3.93) 可得:

提取 cosθ , 式 (3.94) 可重新表示为:

从式 (3.95 ) 中可看出, cosθ只是改变了目标向量OQ的模长。 如果去掉 cosθ , 如图 3.70所示, 此时 OP旋转θ角之后到达 OR, 这种旋转称之为伪旋转( Pseudo Rotation) 。不难看出, OQ与OR 幅度 上 的 差 异, 且 可 证 明 向 量 OP 与 PR是正交的。 此时R点坐标可表示为:

此, 可通过对伪旋转的输出加以补偿来获得真实旋转的结果。
PS:对比可知每次旋转的角度是正确的,但是模值增大了1/cosθ
注意:并不能通过数学方法去除cosθ,但是去除cosθ可以简化坐标平面旋转的计算操作。

  对于伪旋转, 可将 θ分解为一系列的微小角度的和, 即:

这样, 将一次旋转分解成为一系列的微旋转。 由式 (3.96) 可知, 第i+1 次旋转后的结果为:

下一步至关重要, 正是它使得该算法非常易于硬件实现, 即令:

这里di∈{-1,1}, 结合式( 3.99), 式 (3.98) 可重新改写为:

由式(3.100), 不难看出, 每次微旋转只需要加法 、 减法和移位操作即可完成。为了确定di的值,引入一个新的变量z,定义为:

z 初 始 化 为θ,即z0=θ,根据条件,对zi执行加或者减tan-12-i操作,使得z的最终值为0 ,该条件由di决定,即:

di为+1时表示逆时针旋转,为-1时表示顺时针旋转 。z的迭代过程是将z收敛于零的过程,也正是将θ分解为一系列θi的过程, 故zi可认为是第i次旋转剩余的角度。至此 ,CORDIC 算法之圆周系统的旋转模式迭代过程可表示为:

1.2 思考

  • (1 ) 由式 (3.99) 所确定的目标旋转角度的范围;

(2)如何确定伪旋转到真实旋转的模长补偿因子。

(1)根据式 (3.99 ) 可确定一系列θi的值, 如表 3.17 所示, 还可确定目标旋转角度θ的最大值 θmax 和 最 小 值 θmin , 如式( 3.104 ) 所示。

以目标旋转角度 55° 为例, 它可分解为
55° = 45.0° + 26.6° -14.0°- 7.1° + 3.6° + 1.8° - 0.9°
其迭代过程中角度的变化状况如表 3.18 所示。 假设初始向量位于X轴 正 半 轴, 前 3 次 的 微旋转如图 3.71 所示。

(2)在很多场合中需要目标旋转角度可以覆盖[-180°,180°], 这就需要预处理。 预处理的机制如表 3.19 所示, 不难看出, 只有当目标旋转角度|θ|>π/2 时需要预旋转 π/2 , 用公式表示如式 (3.105) 所示。

据此, 旋转过程可如图 3.72 所示。

由图 3.71 可以看出, 每次微旋转都导致向量模长发生了变化。以Ki表示第 i次微旋转模长补偿因子, 故第 i次微旋转真实旋转的结果应为:

其中,由于在伪旋转中,去掉了cosθi,所以Ki=cosθi 由式 (3.99) 可知:

若总的旋转次数为n, 则总的模长补偿因子K可表示为:

当n趋于无穷大时,K 逼近 0.607252935。
这部分计算,可以由matlab进行迭代计算:
具体如下:

close all;
clear;
clc;
% 初始化
die = 16;%迭代次数
jiao = zeros(die,1);%每次旋转的角度
cos_value = zeros(die,1);%每次旋转的角度的余弦值
K = zeros(die,1);%余弦值的N元乘积
K_1 = zeros(die,1);%余弦值的N元乘积的倒数
for i = 1 : diea = 2^(-(i-1));jiao(i) = atan(a);cos_value(i) = cos(jiao(i));if( i == 1)K(i) = cos_value(i);K_1(i) = 1/K(i);elseK(i) = K(i-1)*cos_value(i);K_1(i) = 1/K(i);end
end
jiao = vpa(rad2deg(jiao)*256,10)
cos_value = vpa(cos_value,10)
K = vpa(K,10)
K_1 = vpa(K_1,10)

 从上表也可以看出,当迭代次数为16,i=15时,cosθi的值已经非常趋近于1了,∏cosθi的值则约等于0.607253,1/∏cosθi为1.64676。所以当迭代次数等于16时,通过迭代得到的点坐标已经非常接近之前假设中的点坐标。

1.3 CORDIC算法应用

1.3.1 目标旋转角度的正、 余弦函数值

经过 n(n–>∞)次微旋转, 得到的最终结果可表示为:

式中, 当 n 趋于无穷大时, An逼近 1.646760258。 根据式 (3.109 ) 可知, 令 x0=1/An且y0 = 0 可得目标旋转角度的正、 余弦函数值, 如图 3.73 所示。 此时, 初始化 z0 即为目标旋转角度 。 需要注意的是当目标旋转角度|θ|>π/2 时应先预处理

1.3.1 极坐标系向直角坐标系的转换

  同样地, 由式 ( 3.109 ) 出发, 令 x0=r且y0 = 0,z0 =θ,则可以实现极坐标系向直角坐标系的转换, 如图 3.75 所示。 显然, 这里x0代表了极径, z0 代表了极角。

1.4 举例

  利用CORDIC算法,计算cosθ和sinθ,其中θ=π/4(迭代次数16)

  解析:

关参数转换如下:

CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode )相关推荐

  1. CORDIC算法——圆周系统之旋转模式

    CORDIC(Coordinate Rotation Digital Computer) 算法,这个算法只利用移位和加减运算,就能计算常用三角函数值,如Sin,Cos,Sinh,Cosh等函数. 历史 ...

  2. 算法详解_常用算法详解——打印杨辉三角形

    杨辉三角,是二项式系数在三角形中的一种几何排列.在中国南宋数学家杨辉1261年所著的<详解九章算法>一书中出现.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在165 ...

  3. 自动驾驶算法详解(3): LQR算法进行轨迹跟踪,lqr_speed_steering_control( )的python实现

    前言: LQR算法在自动驾驶应用中,一般用在NOP.TJA.LCC这些算法的横向控制中,一般与曲率的前馈控制一起使用,来实现轨迹跟踪的目标,通过控制方向盘转角来实现横向控制. 本文将使用python来 ...

  4. 蒙哥马利java算法_算法详解 - 蒙哥马利算法的概念与原理

    算法的详解 扯了一大顿,终于引出了今天文章的主角,前面讲到的两个算法,第一个就是蒙哥马利乘模,第二个就是蒙哥马利约减.下面我们来讲这两个算法的详解. 正如前面提到的蒙哥马利算法的三个特性之一是,不是基 ...

  5. 深度学习 --- BP算法详解(BP算法的优化)

    上一节我们详细分析了BP网络的权值调整空间的特点,深入分析了权值空间存在的两个问题即平坦区和局部最优值,也详细探讨了出现的原因,本节将根据上一节分析的原因进行改进BP算法,本节先对BP存在的缺点进行全 ...

  6. manacher算法详解(马拉车算法)

    马拉车算法 Manacher算法是由题目"求字符串中最长回文子串的长度"而来.比如 abcdcb 的最长回文子串为 bcdcb ,其长度为5. 回文:正着念,反着念都一样 暴力解不 ...

  7. 量子计算机算法详解,量子计算机量子算法以及物理实现.pdf

    CN43-1258/TP 计算机工程与科学 2012年第34卷第8期 V01.34,No.8,2012 ISSN1007-130X ENGINEERING&SCIENCE COMPUTER 文 ...

  8. CORDIC算法详解(五)-统一的 CORDIC 算法形式

    CORDIC算法详解(五)- 统一的 CORDIC 算法形式 文章目录 CORDIC算法详解(五)- 统一的 CORDIC 算法形式 5 统一的 CORDIC 算法形式 相关参考资料及源码   网上有 ...

  9. Cordic算法——圆周系统之向量模式

    转发博文背景: 在项目中用到了下面的知识:数据都是R+jI 的复数形式,首先要用CORDIC算法将数据转换成Ae^(jωt+φ) 形式.一句话就引出了一个知识点,这篇博文来总结这种功能的CORDIC算 ...

最新文章

  1. 如何使用日志进行程序调试_如何使用日志节省调试时间
  2. Vue从Hello World到打包(后端适读)
  3. 如何对DevOps数据库进行源代码控制
  4. cassandra本地连接失败_本地网络发现失败的解决方法连接到OS X中的服务器的问题 | MOS86...
  5. 用vue+webpack搭建的前端项目结构
  6. PHP面向对象(OOP)编程入门教程
  7. Springboot Gitlab Jenkins Maven Docker 持续集成/持续交付
  8. python中字符串格式化的形式_Python中format函数字符串格式化入门
  9. 跨境电商erp有哪些功能?跨境erp是跨境电商卖家必备么?
  10. 第三讲:tapestry增删改查---查询数据
  11. AlterID.exe解决teamview商业使用
  12. Excel闪退问题解决办法
  13. 数据平台作业调度系统详解-理论篇
  14. 这个1500个+Javascript特效代码,瞬间提升你的开发效率
  15. 【传感器】HT1621 LCD驱动芯片
  16. win10安装完ubuntu后win10时间改变了 最简单调整方式
  17. Linux 上通过 Rhythmbox 听音乐
  18. win10 怎么进入dos,并且通过路径运行可操作程序
  19. CCLE:肿瘤细胞系百科全书
  20. 密西西比河谷州立大学:Android应用程序开发(二)

热门文章

  1. 基于(springmvc+tomcat+JavaScript)实现化妆品商城系统
  2. SSD的王者 PCIe固态硬盘的未来在哪里
  3. 网络安全工具源码分析工具Joern cpg 查询使用教程
  4. pets vs cattle
  5. 雪后看疫情:一切能否变得更加清澈而透明?
  6. root精灵无法root,Root精灵
  7. 怎样使用终端在macOS Big Sur Finder中锁定文件?
  8. C# WPF动画,时钟程序源码分享,闹钟程序源码分享
  9. 2014华为机试,计算给定和牌麻将的番数
  10. 借助微信SEO也可以轻松引流快速增粉