CORIDIC算法学习记录

news/2025/3/22 10:26:20/文章来源:https://www.cnblogs.com/guochaoxxl/p/18786292

目录
  • 问题
  • 问题分析
  • CORDIC算法原理
    • 逼近方法及步骤
    • 逼近过程中的符号确定
    • 根据角度计算正切值
    • 举个例子逼近\(\theta=50^{\degree}\)并求其正切值

CORDIC算法叫坐标旋转数字计算法,由J.Volder在1959年提出,可以快速且简单的计算角度的数值。

问题

已知\(y,x\),如何快速计算角度\(\theta\)

问题分析

许多人,直接求解\(\arctan(\frac{y}{x})\),但是反正切求解没有那么容易,如果要查表,由不得又要一堆操作下来,费事费力。虽然可以借助计算机求解,计算机只能加减乘除,计算反正切,需要级数展开,根据泰勒公式\(\arctan(x)=x-\frac{x^3}{3}+\frac{x^5}{5}-\frac{x^7}{7}+\ldots\),可见包含了大量的乘法和除法,也不会快到哪里。

CORDIC算法原理

逼近方法及步骤
  • 选择一系列标准角度,A=[45 26.5651 14.0362 7.12502 3.57633 1.78991 0.895174 0.447614 0.223811 0.111906 0.0559529 0.0279765 0.0139882 0.0069941]
  • 将任何要计算的角度\(\theta\)与比较对象\(\beta\)比较,
  • 第一次\(\theta\)\(\beta\)\(A_{(1)}=45^{\degree}\)比较,
  • \(\theta>\beta=45^{\degree}\)时,增大\(\beta\),将\(\beta\)加上\(26.5651^{\degree}\)
  • 再次比较\(\theta\)\(\beta\)大小,当\(\theta > \beta\)就继续增加\(A\)的下一项,当\(\theta < \beta\)就继续减去\(A\)的下一项
  • 直到\(\theta\)\(\beta\)足够接近即可停止

例如:待测角度为\(53^{\degree}\),逼近过程用表格表示如下:

序号 初始值\(\beta\) 比较结果 变化的值 符号 备注
1 45 1 26.5651 +
2 71.5651 0 14.0362 -
3 57.5289 0 7.12502 -
4 50.4039 1 3.57633 +
5 53.9802 0 1.78991 -
6 52.1903 1 0.895174 +
7 53.0855 0 0.447614 -
8 52.611186 1 0.223811 +
9 52.834997 1 0.111906 +
10 52.946903 1 0.0559529 +
11 53.0028559 0 0.0279765 -
12 52.9748794 1 0.0139882 +
13 52.9888676 1 0.0069941 +

最终为52.9958617,可以看到距离53已经很接近了,如果不够还可以继续。

可以看到,上边的比较过程,用眼观察并判断下一项的正负号比较容易,有人觉得直接比较大小,随着小数位数的增加,比较大小并不可靠。

> if(0.999999999999999999999999<1)
> a=10;
> end

以上代码中,我这里octave9.4中,小数点后16以前比较大小正确,超过就可能出错了,编程中小数比较大小不一定可靠。

逼近过程中的符号确定
  • 将原角度对应的向量\((x,y)\)做相应角度的旋转,根据旋转后的纵坐标是否大于零,就知道下一次操作的正负号了
  • 若旋转后的坐标\((x_1,y_1)\),根据欧拉公式\(x_1=x\cos\alpha-y\sin\alpha\),\(y_1=x\sin\alpha+y\cos\alpha\),其中\(\alpha\)为旋转的角度,方向与正负号有关
  • 为了避免计算正余弦值,改造公式为:\(x_1=\cos\alpha(1-y\tan\alpha\)\(y_1=\cos\alpha(x\tan\alpha+y)\),我们只要能判断旋转后纵坐标\(y_1\)是否大于零,就能确定下次的旋转方向,无需计算\(\cos\alpha\),计算\(x\tan\alpha\)\(y\tan\alpha\)
  • 前面我们选择角度时取值的特征就是\(\tan(45^{\degree})=1\),依次为\(\frac{1}{2},\frac{1}{4},\frac{1}{8},\frac{1}{16}\ldots\),也就是说按照表里的角度值逼近时,无需计算正切值,每次都是前一个的\(\frac{1}{2}\)。是不是需要除法,计算机计算不需要,直接移位一次就能乘以或除以2了,是不是就很方便了。
根据角度计算正切值
  • 对角度\(\theta\),则\(\tan\theta=\frac{\sin\theta}{\cos\theta}\),计算出\(\sin\theta,\cos\theta\)
  • 由于\(\sin\theta=\frac{y}{r}\)\(\cos\theta=\frac{x}{r}\),单位圆内,知道\(x,y\)即可;
举个例子逼近\(\theta=50^{\degree}\)并求其正切值

使用的欧拉公式:

\[x_1=\cos\alpha(x-y\tan\alpha)\\ y_1=\cos\alpha(x\tan\alpha+y) \]

  1. 向量\((1,0)\)开始,向量的角度\(\alpha\)\(0^{\degree}\)
  2. 小于目标,需要增大\(\alpha\),增大\(45^{\degree}\),$\begin{bmatrix}x_1\y_1\end{bmatrix}=\cos{(45^{\degree})}\begin{bmatrix}x-y\tan 45^{\degree}\x\tan 45{\degree}+y\end{bmatrix}=\cos45\begin{bmatrix}x_1{'}\y_1\end{bmatrix} \(,这里只需要移位和加减即可得到\)\begin{bmatrix}x_1{'}\y_1\end{bmatrix}$,前面的余弦值计算稍后处理
  3. 比较新的\(\alpha\),依旧小于目标,需要继续增加,虽然离目标只有\(5^{\degree}\),无法直接计算正切还有坐标,继续选择标准角度26.5651,经过旋转后,新坐标:$ \begin{bmatrix}x_1\y_1\end{bmatrix}=\cos{(45{\degree})}\cos{(26.5651)}\begin{bmatrix}x_1{'}-y_1\tan 26.5651{\degree}\x_1\tan 26.5651{\degree}+y_1\end{bmatrix}=\cos45{\degree}\cos{(26.5651)}\begin{bmatrix}x_2{'}\y_2\end{bmatrix} $此时的角度:\(71.5651\)
  4. 比较新的\(\alpha\),大于目标,需要减小,选择角度-14.0362,就这样一直进行下去,最终角度会越来越接近50度,例如经过8次旋转,角度为:\(45+26.5651-14.0362-7.12502-3.56733+1.78911+0.895174+0.447614=49.9601\),此时的误差已经很小了,如果不够继续即可;
  5. \(\begin{bmatrix}x_8\\ y_8 \end{bmatrix}=\cos(45)^{\degree}\cos(26.5651)^{\degree}\cos(-14.0362)^{\degree}\cos(-7.12502)^{\degree}\cos(-3.56733)^{\degree}\cos(1.78911)^{\degree}\cos(0.895174)^{\degree}\cos(0.447614)^{\degree}\begin{bmatrix}x_8^{'}\\ y_8^{'} \end{bmatrix}\)

而且以上连乘序列最终收敛到0.6072529,由于\(\cos\alpha=\frac{1}{\sqrt{1+(\tan\alpha)^2}}\),也就是说以上序列就成了$\prodn_{i=0}\frac{1}{\sqrt{1+{(2)}^2}} $

验证如下:

N=20;
A=zeros(1,N);
for i=0:1:N-1A(i+1)=1./sqrt(1+2^(-2*i));
end
B=cumprod(A);i=1:N;
%双y轴做图
yyaxis left
%scatter(i,A,'markeredgecolor',[0 .7 .8],'markerfacecolor',[0 .5 .6],'linewidth',2.5);
scatter(i,A,'markeredgecolor','r','markerfacecolor','g','linewidth',2.5);
xlim([-1 N+1]);
ylim([0.55 1.05]);
title('difference A and B');
xlabel('i');
ylabel('A changes')yyaxis right
%scatter(i,B);
scatter(i,B,'markeredgecolor','b','markerfacecolor','r','linewidth',1.5);
ylim([0.55 1.05]);
ylabel('B,changes')

结果图就不放了,也就是说该多项式大概从第六项开始相乘时,就趋近与固定值0.6073了,以后无论怎么加项,角度在逼近,精度在提高,系统不再发生变化,随着N增加,A从第四项开始进入1%误差范围,从第七项开始,N每增加1,精度提高一个数量级,直到第27项开始matlab精度达到极值时,值为1.000000000000000不再变化。与A对应的B,从第4项开始进入到0.6系数中,从第7项开始进入0.6275开始进入精度稳定,直到第26项值为0.607252935008881,保持稳定不再变化。也就是说,才用CORDIC算法经过26次迭代,就可以实现几乎所有的精度要求。

参考:https://zhuanlan.zhihu.com/p/717126119

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903380.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

郑州商转公直还办理流程-2025年3月

先叠个甲,因为时间、地点、银行及每个人的情况可能都不一样,最终流程和结果可能也不一样,建议根据自己情况提前咨询,以下为我个人真实经历,仅供参考。 时间线:1.2025.3.10周一,去贷款行办理《同意提前结清商业贷款函》、《同意提前结清商业贷款函》、余额证明,12号周三…

设计一种将方向盘的旋转角度转换为USB信号的装置,用于汽车驾驶模拟

量角器是一种专门的设备,用于高精度测量旋转角度,并通过USB将这些测量结果传输到主机。它集成了一个精确的编码器,能够以1度的精度测量角度。树莓派Pico通过可编程I/O (Programmable I/O)高速读取编码器信号,而TinyUSB库则用于与主机共享数据。该量角器的开发主要是为了解决…

郑州商转公直还办理流程

时间线:1.2025.3.10周一,去贷款行办理《同意提前结清商业贷款函》、《同意提前结清商业贷款函》、余额证明,12号周三电话我已出好,可以去公积金中心办商转公了;2.2025.3.17周一,去公积金中心办理商转公直还,周四下午收到已放款短信,周五早上接到贷款行电话提醒去办提前…

构建一个2.4GHz无线网络分析仪,可兼作远程(LoRa)收发器

快速预览 呈现DualCast !我最新的(也是最先进的)项目。它是一种紧凑型无线设备,除了能够通过LoRa技术发送915MHz AES-128加密的远程命令外,还能够分析2.4GHz Wi-Fi网络上的实时流量。(默认设置下最高可达一公里!)翻转180以激活Wi-Fi模式。此外,它还配备了许多传感器,如用于…

Vue3 关闭vueDevTools工具

1、文件 vite.config.ts 2、注释

SecureCRT SecureFX 9.6.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输

SecureCRT & SecureFX 9.6.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输SecureCRT & SecureFX 9.6.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输 rock-solid terminal emulation & flexible secure file transfer for com…

deepseek模型部署到本地使用+投喂数据训练

近期,由于国外大量攻击,导致 DeepSeek 经常无法使用;另外,许多朋友希望在本地搭建自己的知识库,以保护自己的资料不被外泄。因此,越来越多的人希望能够在本地部署 DeepSeek,但对于技术难度有所担忧。别担心,这篇教程将为你扫清所有障碍!从环境搭建到模型运行,每一步都…

Axure RP上使用 Font Awesome 图标库

Axure RP 可以使用 Web Fonts,这让置入 Font Awesome 变得非常方便。Font Awesome 是一种字体,只是主要针对图标使用,而非我们所熟知的中文/西文字体。 进行简单的几步设置,就可以在自己项目上面使用 Font Awesome 的 1609 个免费图标。图标覆盖广泛,风格也相对统一。 一、…

读DAMA数据管理知识体系指南27文件和内容管理概念(上)

读DAMA数据管理知识体系指南27文件和内容管理概念(上)1. 文件和内容管理 1.1. 文件和内容管理是指针对存储在关系型数据库之外的数据和信息的采集、存储、访问和使用过程的管理 1.2. 重点在于保持文件和其他非结构化或半结构化信息的完整性,并使这些信息能够被访问 2. 业务驱…

(Windows11)如何自编译Aseprite(像素画软件) - 1.3.12版本

如何自编译Aseprite(像素画软件)-windows-以1.3.12版本为例 1. Aseprite说明开源像素画软件,自带调色板 Steam也可购买:steam购买2. 官方编译说明(Windows系统下) 官方库提供了win、mac以及Linux编译方式 文档地址:https://github.com/aseprite/aseprite/blob/main/INSTAL…