前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CORDIC算法详解(一)-CORDIC 算法之圆周系统之旋转模式

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

作者头像
碎碎思
发布于 2020-06-28 09:25:11
发布于 2020-06-28 09:25:11
4.8K00
代码可运行
举报
文章被收录于专栏:OpenFPGAOpenFPGA
运行总次数:0
代码可运行

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

文章目录

  • CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode )
  • 1 CORDIC 算法之圆周系统及其数学应用
    • 1.1 圆周系统之旋转模式( Rotation Mode )
    • 1.2 思考
    • 1.3 CORDIC算法应用
      • 1.3.1 目标旋转角度的正、 余弦函数值
      • 1.3.1 极坐标系向直角坐标系的转换
    • 1.4 举例
  • CORDIC 算法之圆周系统及其数学应用结束

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


整个系列分别从圆周系统、 线性系统和双曲系统及硬件实现进行分析,如下:

CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode ) CORDIC算法详解(二)- CORDIC 算法之圆周系统之向量模式(Vectoring Mode) CORDIC算法详解(三)- CORDIC 算法之线性系统及其数学应用 CORDIC算法详解(四)- CORDIC 算法之双曲系统及其数学应用 CORDIC算法详解(五)- 统一的 CORDIC 算法形式 CORDIC算法详解(六)- 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进行迭代计算:   具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 : die
    a = 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);
    else
        K(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)

  解析:

  相关参数转换如下:

  • x0=1/An=1/1.646760258=0.607253;
  • y0 = 0;
  • z0=π/4(由于|θ|<π/2,所以不需要进行预处理);
  • 经过16次迭代计算后,得到的x16 和y16分别为cosθ和sinθ。 相关程序如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
close all;
clear;
clc;
% 初始化
die = 16;%迭代次数
x = zeros(die+1,1);
y = zeros(die+1,1);
z = zeros(die+1,1);
x(1) = 0.607253;%初始设置
z(1) = pi/4;%待求角度θ
%迭代操作
for i = 1:die
    if z(i) >= 0
        d = 1;
    else
        d = -1;
    end
    x(i+1) = x(i) - d*y(i)*(2^(-(i-1)));
    y(i+1) = y(i) + d*x(i)*(2^(-(i-1)));
    z(i+1) = z(i) - d*atan(2^(-(i-1)));
end
cosa = vpa(x(17),10)
sina = vpa(y(17),10)
c = vpa(z(17),10)

  最后得到的结果:

  • x16=0.707095876358217
  • y16=0.707117836980767

  证明算法思路正确。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从官方安装更新 openwrt for pogoplug 第一部分 (不需要自己编译)
从官方安装更新 openwrt for pogoplug 第一部分 (不需要自己编译) 至从看到openwrt官网支持Pogoplu后(消息来源:godiy),我就想把破狗重装了一遍。 昨天花了半天的时间,终于把破狗从play4fun的"【2014.07.08】openwrt for pogo nand,3.14.9"版本,更新到官方最新版本,见下图 下面我把到底如何从play4fun的0708版本到官方的过程来写一下,以解除一些小白(包括我)的刷机迷惑。 刷
qinyang
2018/06/05
2.9K0
轻量服务器安装 OpenWrt
GitHub:https://github.com/esirplayground/VPS_OpenWrt
XRSec
2022/03/30
7.5K0
轻量服务器安装 OpenWrt
从官方安装更新 openwrt for pogoplug 第二部分
从官方安装更新 openwrt for pogoplug 第二部分 一,硬盘与USB以及samba USB驱动,用于使用移动硬盘     opkg install kmod-usb-core     opkg install kmod-usb-ohci     #安装usb ohci控制器驱动     opkg install kmod-usb2            #安装usb2.0      opkg install kmod-usb-storage  
qinyang
2018/06/05
1.8K0
把路由器改装成git服务器(OpenWRT环境的GIT服务器搭建)
在单位中,通常都标配了git服务器用来管理代码。 对于家庭或者小办公室,这种方式有点不经济。当然如果是开源项目就简单了,刚刚被微软收购的github是理想选择。但如果没有打算开源,我今天的话题可能对你有用。 我就属于喜欢在家中干活的那一类,以前常年开着一台电脑做下载,最近改了这个坏习惯。但是没有了长期开机的设备,也就没有了git server。 趁着周末,把一台老的路由器改了改,当成git server来用,感觉效果爆棚,不能不安利给大家。
俺踏月色而来
2018/08/10
7K0
CentOS 7安装配置美化Transmission及制作种子教程
最近在从hetzner整了台vps,想着闲着也不能闲着,毕竟怎么说也是个G管,刚好最近入了PT的坑,那就装个Transmisson来挂PT,成为一个大刷子吧O(∩_∩)O~~
暮城
2022/02/23
3.5K0
CentOS 7安装配置美化Transmission及制作种子教程
OpenWRT部署web站点并结合内网穿透实现无公网ip远程访问
uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器,目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器,并且和 OpenWrt 配置框架非常好地集成在一起。它是管理 OpenWrt 的默认的 Web 服务器,还提供了现代 Web 服务器所有的 功能 。
大海里的番茄
2024/02/23
9000
OpenWRT部署web站点并结合内网穿透实现无公网ip远程访问
轻量化Web服务器实践:内网穿透实现OpenWRT本地站点公网访问
本文和大家分享一下如何在OpenWRT上部署uhttpd搭建web服务器,同时使用cpolar将网站安全发布到公网上,让公网用户也可以正常访问到OpenWRT下的本地站点。
命运之光
2025/04/22
1620
轻量化Web服务器实践:内网穿透实现OpenWRT本地站点公网访问
OpenWRT 开源路由器OpenWrt官方镜像下载与安装指南(附官方下载渠道)
OpenWRT 是专为嵌入式设备设计的Linux发行版,支持5000+路由器型号,提供包管理、防火墙配置、VPN搭建等高级功能。2025版新增AI流量调度和IPv6安全增强模块,适用于:
万里顾一诚
2025/02/26
2.7K1
OpenWRT 开源路由器OpenWrt官方镜像下载与安装指南(附官方下载渠道)
N1盒子刷OpenWRT软路由系统结合内网穿透实现公网访问本地路由器
本文主要介绍如何在N1盒子原系统刷入OpenWRT软路由系统,并结合cpolar内网穿透工具轻松实现公网访问管理本地刷好OpenWRT软路由系统的N1盒子。
屿小夏
2024/04/20
6190
N1盒子刷OpenWRT软路由系统结合内网穿透实现公网访问本地路由器
【openwrt】Openwrt系统新增普通用户指南
Openwrt系统在默认情况下只提供一个 root账户,所有的服务都是以 root权限运行的,包括 WebUI也是通过root账户访问的,如果你的Openwrt设备支持 WAN口访问WebUI,那么这里就有极大的安全风险,为了尽可能的降低这种风险,新增一个普通用户可能是一个比较合理的方案。
知否知否应是绿肥红瘦
2025/02/19
1770
【openwrt】Openwrt系统新增普通用户指南
OpenWrt开源软路由项目使用
2020年9月10日 OpenWrt — building 成为最流行的自由和开源 (FOSS) 无线路由器项目已有16年的成功 — 今天加入 软件自由保护组织(SFC) 作为成员项目. FOSS无线路由器可确保所有互联网用户自由使用软件. 软件自由保护组织将帮助 OpenWrt 继续蓬勃发展并成为其新的财政赞助商. OpenWrt 在软件自由的历史上占有特殊的位置. OpenWrt的创建和发布表明 GPL 强制执行 有效并提高了软件自由度. 在2004年, Linksys发布了WRT54G路由器系列的固件代码时, 编码人员和修补匠重新重新控制了自己的路由器, 并且OpenWrt 根据GPL执法机构发布的资源启动了. 今天, OpenWrt 利用受GPL保护的软件自由与使用无线路由器连接到互联网的每个人共享该自由和控制权.
全栈工程师修炼指南
2022/09/29
3.9K0
OpenWrt开源软路由项目使用
OpenWrt系统安装内网穿透并配置SFTP服务实现远程访问
本次教程我们将在OpenWRT系统上安装SFTP服务,并结合cpolar内网穿透,创建安全隧道映射22端口,实现在公网环境下远程OpenWRT SFTP,安全地传输文件,比如备份文件、配置文件等。
YIN_尹
2024/07/01
4410
OpenWrt系统安装内网穿透并配置SFTP服务实现远程访问
通过kafka/flink加载MySQL表数据消费 快速安装配置
说明:对于数据迁移工具来说,好多封装了kafka和flink的,出于好奇,个人试着去下载了一下kafka和flink试着部署一下,本次就简单的记录一下安装过程,踩坑也比较多。部分比较典型的错误,后续整理完也分享一下。本次操作都是单机,单实例,单节点,不涉及分布式或者集群配置。
用户7689089
2021/04/29
1.4K0
pogoplug openwrt 安装 百度网盘python客户端 bypy
openwrt下的python客户端SyncY总是提示“import pycurl”,明明都已经配置OK的。有知道的人请回复我吧。。。 反正bypy客户端竟然配置成功。意外之喜。。。 首先要把python配置好,安装配置python是一定的 root@wangqinyang:~/bypy# opkg install python Package python (2.7.8-3) installed in root is up to date. python需要Requests库,先看看有
qinyang
2018/06/05
2.1K0
Twitter Storm安装配置(Ubuntu系统)单机版
要使用storm首先要安装以下工具:JDK、Python、zookeeper、zeromq、jzmq、storm (注:各个模块都是独立的,如果安装失败或者卡顿可以单独百度某个模块的安装,都是可以的。) JDK1.7安装 参见上篇《Ubuntu下安装配置JDK1.7》http://www.cnblogs.com/stone_w/p/4469548.html 第一步,安装Python2.7.2(ubuntu) wget http://www.python.org/ftp/python/2.7.2/Python
磊哥
2018/05/08
6280
Twitter Storm安装配置(Ubuntu系统)单机版
群辉安装Transmission套件、增强汉化WebUI并备份做种列表
请注意,本文编写于 433 天前,最后修改于 433 天前,其中某些信息可能已经过时。
吴蛋蛋
2023/03/14
6.2K0
群辉安装Transmission套件、增强汉化WebUI并备份做种列表
linux下安装mysql5.7步骤
链接:https://pan.baidu.com/s/1HyVFBJLlQPKGMOyXpao0cw 提取码:q2a6 下载完成之后通过 winscp 工具将压缩包上传到 /usr/local 路径下
萌萌哒的瓤瓤
2021/01/13
2.6K1
linux下安装mysql5.7步骤
OPKG包管理系统详解!带你管理OpenWrt系统软件[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131950.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/30
20.7K0
OPKG包管理系统详解!带你管理OpenWrt系统软件[通俗易懂]
监控神器普罗米修斯Prometheus安装配置「建议收藏」
普罗米修斯默认配置文件 vim /usr/local/Prometheus/prometheus.yml
全栈程序员站长
2022/06/27
4.4K0
监控神器普罗米修斯Prometheus安装配置「建议收藏」
破狗,pogoplus 之 百度同步 SyncY
破狗,pogoplus 之 百度同步 SyncY 传说中的百度同步软件syncy, 官网传送门 syncy有3个版本,经测试3版本中,只有perl版本,可以在pogoplug的官方版本上运行,bash版本跑时出错,python版本少库,perl版本OK 下载安装包括:http://pan.baidu.com/s/1ntsODjr image.png 安装好后,就可以在web界面上看到同步软件了 image.png 绑定百度帐号: image.png 绑好后,就可以设置
qinyang
2018/06/05
3700
推荐阅读
相关推荐
从官方安装更新 openwrt for pogoplug 第一部分 (不需要自己编译)
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode )
    • 文章目录
  • 1 CORDIC 算法之圆周系统及其数学应用
    • 1.1 圆周系统之旋转模式( Rotation Mode )
    • 1.2 思考
    • 1.3 CORDIC算法应用
      • 1.3.1 目标旋转角度的正、 余弦函数值
      • 1.3.1 极坐标系向直角坐标系的转换
    • 1.4 举例
  • CORDIC 算法之圆周系统及其数学应用结束
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档