基于FPGA的Cordic向量模式原理及设计

news2024/11/28 8:30:43

目录

一、向量模式

1、向量模式原理

1.1

1.2 

2、向量模式的MATLAB仿真

3、向量模式的FPGA实现

3.1 预处理

3.2 迭代

3.3 结果计算


一、向量模式

1、向量模式原理

       已知直角坐标下一点(x,y),如何求该点在极坐标系的坐标(ρ,\theta)?当x和y都为正数时,有\theta=\arctan (y/x),求\theta的过程即就是求反正切函数的过程。CORDIC算法的思想就是:将向量(x,y)顺时针旋转一定的度数,如果旋转之后纵坐标为0,那么累计旋转的度数就是\theta,横坐标x的值就是ρ,也就是向量的模长。、

设(x_{^{0}}, y_{^{0}})为原始坐标,以原点为中心,顺时针旋\theta之后的坐标为(x_{^{1}}, y_{^{1}}),则有如下公式:

                                                      

那么每一次旋转的方程都可以这样表示:

                                                        

上式经过多次迭代之后,x_{^{i+1}}就是模长ρ,对于上式迭代有如下化简。

1.1 \tan \theta ^{_{i}}=2^{-i}

前面通过提取公共系数\cos \theta将乘法的次数减少了一半,进一步化简从\tan \theta入手:除了\tan (\pi /4)为1外,其余\tan \theta均为无理数,必须进行乘法操作,但乘法其实也是由多个移位器组成,因此如果旋转某个特殊的\theta值,使得\tan \theta为简单移位操作,则所有的旋转乘法都可以修改为移位算法。

目前能够将乘法变为移位操作的序列通常都是1/2的n次方或者这些数的组合,例如a\times (1/2)^{^{-2}},计算就可以转化为a右移2位,即a>>2。基于这种思想,可以使各次移位的角度满足\tan \theta ^{_{i}}=2^{-i}或者\theta=\arctan (1/2^{n}),计算出正切值如下表所示。

 

1.2 K_{n}

表达式中\cos \theta在迭代时只是一个系数,旋转过程中这个系数与角度\theta的大小无关且只需关注y_{i+1}^{_{_{}}}

趋近于0即可,因此迭代过程中可将\cos \theta的值忽略为1,这样带来的结果是每次旋转后的新坐标模值都比前一次上,具体情况如下图所示。

在仅求解\theta时可以忽略掉系数\cos \theta,,但求模值时,\cos \theta每次都会使得横坐标变长,\cos \theta是一系列固定的值,每次迭代过程中可以忽略,在最终计算模长时统一处理。

K_{n}每一次都作为乘积因子出现补偿由于旋转作用带来的模长减小,对于确定迭代次数n的方程而言它是一个确定的乘数。

                                              

该乘法多项式的极限为:

                                           

1.3d_{i}

在每次顺时针旋转后,若纵坐标y_{i}大于0,说明旋转的度数不够,下一次迭代还要顺时针接着旋转;若纵坐标y_{i}小于0,说明旋转的度数太大,下一次迭代就要变为逆时针往回补偿。

所以在向量伪旋转的基础上引入d_{i}来描述向量旋转的方向,d_{i}决定了\tan \theta的正负,进而表示旋转方向,当y_{i}>0时,

顺时针旋转,取1,逆时针则相反。

同时,引入角度累加器参数z用来记录向量的总旋转角度。

综上所述我们得到第i次的迭代方程:

                                                         

因此n次旋转后P_{n}的坐标为:

                                                      

z_{0}=0,那么z_{n}就是对应向量的相角,x_{n}*K_{n}就是对应向量的模值。

2、向量模式的MATLAB仿真

第一步:生成数值表,由数值表,第16次迭代可以达到0.001精度的要求。

迭代次数

角度

tan()正切值

K系数

1/K

0

45

1

0.707106781

1.414213562

1

26.56505118

0.5

0.632455532

1.58113883

2

14.03624347

0.25

0.613571991

1.629800601

3

7.125016349

0.125

0.608833913

1.642484066

4

3.576334375

0.0625

0.607648256

1.645688916

5

1.789910608

0.03125

0.60735177

1.646492279

6

0.89517371

0.015625

0.607277644

1.646693254

7

0.447614171

0.0078125

0.607259112

1.646743507

8

0.2238105

0.00390625

0.607254479

1.64675607

9

0.111905677

0.001953125

0.607253321

1.646759211

10

0.055952892

0.000976563

0.607253032

1.646759996

11

0.027976453

0.000488281

0.607252959

1.646760193

12

0.013988227

0.000244141

0.607252941

1.646760242

13

0.006994114

0.00012207

0.607252937

1.646760254

14

0.003497057

6.10E-05

0.607252935

1.646760257

15

0.001748528

3.05E-05

0.607252935

1.646760258

16

0.000874264

1.53E-05

0.607252935

1.646760258

17

0.000437132

7.63E-06

0.607252935

1.646760258

18

0.000218566

3.81E-06

0.607252935

1.646760258

19

0.000109283

1.91E-06

0.607252935

1.646760258

第二步:开始迭代。

3、向量模式的FPGA实现

3.1 预处理

表中的角度值都为浮点数,在硬件在不易实现,故而将角度做乘法以适当扩大,便于硬件计算。由仿真可知,要达到0.001精度需要16次迭代,也就是说_{}x^{_{n}}y^{_{n}}最小需要乘以2^{_{-16}}后做加减,故而在开始16次迭代之前,首先将初始值x^{_{0}}y^{_{0}}都算数左移16位,相当于先乘以2^{_{16}},这样可以保证16次迭代中,x和y都一定是整形计算。另外,为了统一起见,这里对所有角度也都乘以2^{_{16}},同样保证角度累加z为整形计算。这样处理后计算的结果也都是乘以2^{_{16}}的值,将结果再算数右移16位即得到原始结果。

3.2 迭代

(i+1)次迭代时,判断上一次迭代结果y^{_{i}}的符号位y[31]的情况,当符号位为0时说明y^{_{i}}为正,此时纵坐标大于0,下一次迭代角度要增加,

                                                x^{_{i+1}} = x^{_{i}}+(y^{_{i}}>>i)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        y^{_{i+1}} = y^{_{i}}-(x^{_{i}}>>i)

当符号位为1时相反。以第4次迭代为例。

3.3 结果计算

16次迭代结束后的结果值,y^{_{16}}趋近0,x^{_{16}}为扩展后的模值,z^{_{16}}为角度值。

x^{_{16}}乘以旋转因子K即可得到模值。16次迭代后的K=0.607252935,在硬件层面做如下化简:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

则模值为:

                                                      

FPGA代码链接:基于FPGA的CORDIC算法向量模式实现资源-CSDN文库

Matlab代码链接:基于Matlab的CORDIC算法实现资源-CSDN文库

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] API集群访问频次统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

多路h265监控录放开发-(4)完成摄像机管理的数据的增删改模型层代码(单例模式)

xcamera_config.h #pragma once #include <vector> #include <mutex> struct XCameraData {char name[1024] { 0 };char url[4096] { 0 }; //摄像机主码流char sub_url[4096] { 0 }; //摄像机辅码流char save_path[4096] { 0 }; //视频录制存放目…

RX8025/INS5T8025实时时钟-国产兼容RS4TC8025

该模块是一个符合I2C总线接口的实时时钟&#xff0c;包括一个32.768 kHz的DTCXO。 除了提供日历&#xff08;年、月、日、日、时、分、秒&#xff09;功能和时钟计数器功能外&#xff0c;该模块还提供了大量其他功能&#xff0c;包括报警功能、唤醒定时器功能、时间更新中断功能…

基于EKF算法估计电动汽车蓄电池的SOC

电动汽车&#xff08;EV&#xff09;作为未来汽车的一大发展方向&#xff0c;其动力源——动力锂电池组的荷电状态&#xff08;SOC&#xff09;估计显得尤为重要。SOC直接反应了电池组剩余容量的多少&#xff0c;是预测EV行驶里程、使用和维护电池组的重要依据。 然而&#xf…

读AI新生:破解人机共存密码笔记07概念和理论

1. 全球层面的智能 1.1. 仅仅为了阅读完当前世界上所有的出版物&#xff08;更不用说过去所有的书面材料&#xff09;就需要20万名全职人员&#xff0c;收听当前的广播则还需要6万名全职人员 1.1.1. 监听世界上所有的电话也是可能的&#xff08;这项工作需要大约2000万人&…

深度学习之计算机视觉

神经网络简介 全连接层和卷积层的根本区别在于权重在中间层中彼此连接的方式。图5.1描述了全连接层或线性层是如何工作的。 在计算机视觉中使用线性层或全连接层的最大挑战之一是它们丢失了所有空间信息&#xff0c;并且就全连接层使用的权重数量而言复杂度太高。例如&#xf…

电商爬虫API的定制开发:满足个性化需求的解决方案

一、引言 随着电子商务的蓬勃发展&#xff0c;电商数据成为了企业决策的重要依据。然而&#xff0c;电商数据的获取并非易事&#xff0c;特别是对于拥有个性化需求的企业来说&#xff0c;更是面临诸多挑战。为了满足这些个性化需求&#xff0c;电商爬虫API的定制开发成为了解决…

Spring Boot集成tensorflow实现图片检测服务

1.什么是tensorflow&#xff1f; TensorFlow名字的由来就是张量(Tensor)在计算图(Computational Graph)里的流动(Flow)&#xff0c;如图。它的基础就是前面介绍的基于计算图的自动微分&#xff0c;除了自动帮你求梯度之外&#xff0c;它也提供了各种常见的操作(op&#xff0c;…

使用 jQuery 选择器获取页面元素,然后利用 jQuery 对象的 css() 方法设置其 display 样式属性,从而实现显示和隐藏效果。

在页面中显示电影排行榜 当单击“&#xff08;收起&#xff09;”链接时&#xff0c;排行榜中后三项的电影名称隐藏而且链接的文本更改为“&#xff08;展开&#xff09; ” 当单击“&#xff08;展开&#xff09;”的链接时&#xff0c;后三项的电影名称重新显示且链接的文本…

基于微信共享充电桩小程序毕业设计作品成品(3)开发技术文档_充电桩小程序前端技术栈

后台管理系统文件 所在路径&#xff1a;后台源码ht目录是后台 绿色显示的是系统框架&#xff0c;不要动 位置程序名说明源码根目录login.php后台登录页面源码根目录check_u_login.php后台登录处理程序ht 后台根目录index.php后台首页left.php后台左侧菜单u_logout.php退出登…

2024广东省职业技能大赛云计算赛项实战——OpenStack搭建

OpenStack搭建 前言 搭建采用双节点安装&#xff0c;即controller控制节点和compute计算节点。 CentOS7 系统选择 2009 版本&#xff1a;CentOS-7-x86_64-DVD-2009.iso 可从阿里镜像站下载&#xff1a;https://mirrors.aliyun.com/centos/7/isos/x86_64/ OpenStack使用竞赛培…

【NCBI】SRA toolkit安装及使用-WindowsLinux版本

文章目录 Windows版本下载安装- 设置环境变量使用下载SRA Linux版本下载安装使用 由于市面上的文章介绍SRA toolkit基本上都是基于Linux&#xff0c;而在windows下运行SRA toolkit基本上可以达到相同的效果且更为方便&#xff0c;故本文将分别阐明在Windows和Linux环境下SRA to…

【DAO】DAOS在后傲腾时代的发展策略

视频&#xff1a;DAOS在后傲腾时代的发展策略_哔哩哔哩_bilibili 代替方案 WAL &#xff08;write ahead log&#xff09; 在架构上用DRAM 代替PMEM&#xff0c;如图 变化是&#xff1a; 傲腾方案&#xff1a; PMEM 数据写到内存就完成"落盘"&#xff0c;是一个原…

10年265倍!动态展示全球第一股英伟达10年股价走势

英伟达在过去十年的股价走势展示了其在市场上的强劲表现和显著增长。自1999年上市以来&#xff0c;英伟达的股价经历了多次显著的涨幅&#xff0c;并在2024年达到了历史新高。 从2023年6月的数据来看&#xff0c;英伟达的股价为386.54美元/股&#xff0c;市值为9548亿美元。然…

探寻Scala的魅力:大数据开发语言的入门指南

大数据开发语言Scala入门 一、引言1.1 概念介绍1.2 Scala作为大数据开发语言的优势和应用场景1.2.1 强大的函数式编程支持1.2.2 可与Java无缝集成1.2.3 高性能和可扩展性1.2.4 大数据生态系统的支持 二、Scala基础知识2.1. Scala简介&#xff1a;2.1.1 Scala的起源和背景2.1.2 …

django学习入门系列之第三点《CSS基础样式介绍1》

文章目录 高度和宽度块级标签|行内标签的转换字体和颜色往期回顾 高度和宽度 如果在块级标签内&#xff0c;单独定义高度的话&#xff0c;宽度会默认拉满 使用百分比的时候 如果是块级标签&#xff0c;宽度可以用百分比&#xff0c;高度用不了&#xff08;使用起来没效果&…

前后端分离的后台管理系统源码,快速开发OA、CMS网站后台管理、毕业设计项目

那有没有一款软件解-决这种现状呢?答案是肯定的。引入我们的软件——eladmin。 介绍 ELADMIN,一个简单且易上手的 Spring boot 后台管理框架,已发布 Mybatis-Plus 版本,为开发者提供了一个全-面、高-效的解-决方案。 特点 高-效率:前后端完全分离,项目简单可配,内置代码…

MySQL:表的增删查改

文章目录 1.Create(创建)2.Retrieve(读取、查询)2.1 SELECT 列2.2 WHERE 子句2.3 结果排序(order by)2.4 筛选分页结果(limit、offset)2.5 Update更新2.6 Delete删除2.7 去重 3.聚合函数3.1 聚合函数的基本使用3.2group by子句的使用(分组查询) 增删查改&#xff1a;: Create(创…

自动驾驶学习-车载摄像头ISP(2)

背景 智能驾驶ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09;在自动驾驶和辅助驾驶系统中扮演着至关重要的角色。 典型的ISP通常会对摄像头输出的RAW数据先做黑电平矫正&#xff08;BLC&#xff09;、坏点矫正&#xff08;DPC&#xff09;、数…

社区团购多级分销流程:从入门到精通实践

随着电商平台和社交媒体的迅速发展&#xff0c;社区团购逐渐成为了一种新兴的购物模式。通过多级分销体系&#xff0c;社区团购有效地扩大了销售网络&#xff0c;提高了商品的流通速度和覆盖范围。本文将详细解析社区团购多级分销的流程&#xff0c;帮助你从入门到精通。 ### 一…