cordic算法圆周系统计算sin、cos、平方和开根、atan、坐标系变换

cordic算法圆周系统计算sin、cos、平方和开根、atan

  • 一、cordic圆周系统旋转模式和向量模式
    • 1.1 旋转模式
    • 1.2 向量模式
  • 二、一些需要考虑的事项
    • 2.1角度范围
    • 2.2输入正负
    • 2.3关于迭代精度
    • 2.4坐标系旋转
  • 参考文献:

若想计算 s i n sin sin c o s cos cos x 2 + y 2 \sqrt{x^2+y^2} x2+y2 a t a n atan atan、坐标系旋转等复杂的数学运算,cordic算法提供了一种逼近的思想。cordic的圆周系统可以较精准的求解出上述数学运算,它将复杂的三角函数等数学运算通过迭代的方式分解为移位和加法,最终逼近所需要的求解精度。

一、cordic圆周系统旋转模式和向量模式

关于cordic算法的背景和理论网上已经有大量的参考文献,此处仅仅简述cordic算法的工作模式:

1.1 旋转模式

旋转模式的思想就是想通过旋转的方式,初始化 x 0 = K x_0=K x0=K y 0 = 0 y_0=0 y0=0 z 0 = θ z_0=\theta z0=θ,每次迭代通过 z i z_i zi值的正负性确定旋转方向,将已知的角度值 z 0 z_0 z0通过不断的迭代,逐渐逼近到 z n = 0 z_n=0 zn=0的过程。最终 x n = c o s θ x_n=cos \theta xn=cosθ y n = s i n θ y_n=sin \theta yn=sinθ θ ∈ ( − π ∼ π ) \theta\in(-\pi \sim \pi) θ(ππ)

1.2 向量模式

向量模式的思想就是初始化 x 0 = A x_0=A x0=A y 0 = B y_0=B y0=B z 0 = 0 z_0=0 z0=0,每次迭代通过 y i y_i yi值的正负性确定旋转方向,最终使初始向量旋转至 x x x轴的正半轴,使 y n y_n yn趋向于 0 0 0。最终 x n = A 2 + B 2 x_n=\sqrt{A^2+B^2} xn=A2+B2 y n = a r c t a n ( B A ) y_n= arctan(\frac{B}{A}) yn=arctan(AB)

二者模式的对比如下:
cordic圆周系统

二、一些需要考虑的事项

2.1角度范围

旋转模式的目标旋转角度 θ i \theta_i θi的取值范围是 [ − 99.8829 ° ∼ 99.8829 ° ] [-99.8829\degree \sim 99.8829\degree] [99.8829°99.8829°] ,而计算sin、cos大部分需要的角度要大于此角度,因此可通过正余弦定理将第一二三四象限的角度全部统一到第一象限,即0-90度。即可满足 [ − 180 ° ∼ 180 ° ] [-180\degree \sim 180\degree] [180°180°] 的实际项目需要。计算arctan的角度需要的范围完全满足,因此不需要特殊处理。

2.2输入正负

当求解 x 2 + y 2 \sqrt{x^2+y^2} x2+y2 时,注意输入的x,y值建议为正数,若为signed值,建议将负数转化成正数。实测发现当输入为负数时,求得的结果的误差较输入全正数时大的多。

2.3关于迭代精度

因项目要求,需要尽可能的减少资源,因此要求在保证精度的前提下通过减少迭代次数等方式进行优化来降低资源占用。
在迭代精度上,以求解 a t a n atan atan的精度为例:当迭代16次时,求解 a r c t a n 1 arctan1 arctan1 的角度值如图1所示,能精确到小数点后两位。经过实测,如图2所示,当迭代8次时,通过四舍五入的方式求得的角度值基本符合项目要求(要求数值精确到整数)。
图1:求解atan迭代16次精度

图1 求解atan迭代16次的精度

在这里插入图片描述

图2 求解atan迭代8次的精度

例2: 求解 1 2 + 1 2 \sqrt{1^2+1^2} 12+12 迭代16次的精度如图3所示, 精度非常高:
求解根号迭代16次的精度

图3 求解$\sqrt{1^2+1^2}$迭代16次的精度

2 \sqrt{2} 2 的理论值如下:
根号2的理论值

2.4坐标系旋转

由于多个雷达的点云数据需要统一到同一个坐标系下进行计算,因此用到了坐标系旋转。该算法也可利用Cordic算法思想进行求解,此时输入为 x 0 x_0 x0 y 0 y_0 y0 θ \theta θ,输出取 x n x_n xn y n y_n yn。迭代方程此时变为:
{ x n = K ( x 0 + d i y 0 2 − i ) y n = K ( y 0 − d i y 0 2 − i ) \left\{ \begin{matrix} x_n=K(x_0+d_i y_0 2^{-i}) \\ y_n=K(y_0-d_i y_02^{-i}) \end{matrix} \right. {xn=K(x0+diy02i)yn=K(y0diy02i)
将原有的Cordic算法稍作更改即可实现。

参考文献:

流水线求sincos:
https://blog.csdn.net/u010712012/article/details/77755567
坐标系旋转:
https://zhuanlan.zhihu.com/p/631899064
https://zhuanlan.zhihu.com/p/41263701
流水线求arctan:
https://blog.csdn.net/zwl_liang/article/details/104885263
开源ip核:
https://opencores.org/projects/cordic_atan_iq

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python3 中try 异常调试 raise 异常抛出

一、什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 一般情况下,在Python无法正常处理程序时就会发生一个异常。 异常是Python对象,表示一个错误。 当Python脚本发生异常时我…

Django学习全纪录:编写你的第一个 Django 应用,Django内置数据库的配置,以及扩展性的数据库介绍和配置

天下古今之庸人,皆以一惰字致败;天下古今之人才,皆以一傲字致败。——[清]曾国藩 导言 大家好,在上一篇文章里,我们一起学习了Django的视图以及路由,并且对Django的应用有了初步的认识,掌握了…

Java实现CRM客户管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 用例设计3.2 E-R 图设计3.3 数据库设计3.3.1 客户表3.3.2 商品表3.3.3 客户跟踪表3.3.4 客户消费表3.3.5 系统角色表 四、系统展示五、核心代码5.1 查询客户5.2 新增客户跟踪记录5.3 新增客户消费订单5.4 查…

本地搭建three.js官方文档

因为three.js官网文档是国外的网站,所以你没有魔法的情况下打开会很慢,这时我们需要在本地搭建一个官方文档便于我们学习查看。 第一步:首先我们先访问GitHub地址 GitHub - mrdoob/three.js: JavaScript 3D Library. 下载不下来的小伙伴们私…

30、二维数组/字符串操作相关练习20240214

一、编程实现二维数组的杨辉三角。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h>int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(in…

本地部署Stable Diffusion WebUI

官网 Stable Diffusion在线 Github上的Stable Diffusion WebUI 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、 环境所需资源 PythonPycharmAnacondastable-diffusion-webui项目代码 注意事项 python版本一定要3.10&#xff0c;最好是3.10.6版本的。…

vue3 之 商城项目—购物车

购物车业务逻辑梳理拆解 1️⃣整个购物车的实现分为两个大分支&#xff0c;本地购物车操作和接口购物车操作 2️⃣由于购物车数据的特殊性&#xff0c;采取Pinia管理购物车列表数据并添加持久话缓存 本地购物车—加入购物车实现 stores/cartStore.js // 封装购物车模块 imp…

片上网络NoC(6)——路由算法

目录 一、概述 二、路由算法的类型 三、避免死锁 四、实现 4.1 源路由实现 4.2 基于节点查找表的路由实现 4.3 组合电路实现 五、总结 一、概述 路由算法&#xff08;routing algorithm&#xff09;&#xff0c;即决定数据包在网络拓扑中从起点到终点路径的算法。路由算…

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置&#xff1a; 首先npm install types/node --save-dev&#xff08;需要用到node其中的path&#xff09;接着在vite.config.ts配置文件中进行配置&#xff1a; 引入 import path from ‘path’&#xff0c;然…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码&#xff0c;robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC&#xff0c;服务器上面安装了Ubuntu&#xff0c;想着可以在服务器接个串口到BMC&#xff0c;然后SSH到服务器的Ubuntu&#xff0c;用minicom来查看串口信息。 准备&#xff1a; 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

Web前端 ---- 【Vue】(组件)父子组件之间的通信一文带你了解

目录 前言 父组件传子组件 ---- props 给要传递数据的子组件绑定要传过去的属性及属性值 在子组件中使用props配置项接收 props配置项 子组件传父组件 ---- 组件的自定义事件 子组件向父组件传递数据 通过代码来绑定自定义事件 前言 本文将介绍在Vue中父子组件如何进行…

算法学习——LeetCode力扣回溯篇4

算法学习——LeetCode力扣回溯篇4 332. 重新安排行程 332. 重新安排行程 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

一周学会Django5 Python Web开发-Django5 Hello World编写

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

SpringCloud之Eureka注册中心和负载均衡

SpringCloud之Eureka注册中心和负载均衡 微服务技术栈认识微服务单体架构分布式架构微服务 微服务拆分及远程调用微服务拆分注意事项 Eureka注册中心提供者与消费者原理分析服务调用出现的问题Eureka的作用 使用流程1、搭建EurekaServer2、注册user-service3、在order-service完…

【Godot4自学手册】第十三节初建创建敌人

从本节起&#xff0c;将要学习创建第一人。 一、创建敌人动画 1.导入素材。 在Sprites文件夹下新建Enemy文件夹&#xff0c;并将需要的敌人素材导入到文件夹。文档结构如下&#xff1a; 2.创建Enemy场景。 新建场景&#xff0c;根节点设置为CharacterBody2D&#xff0c;命…

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…

PR:熟悉PR工作环境

新建项目 设置自己的页面布局 首选项