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

目录

一、向量模式

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.mzph.cn/pingmian/31179.shtml

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

相关文章

问题1.用PGP解密出keybox.xml,过程中报“Can‘t check signature: No public key”如图,这个正常吗?如何解决?

问题1.我要写Google attenstation key到设备。就需要keybox.xml生成keybox.kdb文件。而测试机构给我们的是加密的文件,需要用PGP解密出keybox.xml,过程中报“Can’t check signature: No public key”如图,这个正常吗?如何解决&am…

真实前端面试题(蚂蚁外包)

1.闭包定义应用场景 闭包(Closure) 是指一个函数包含了对其外部作用域中变量的引用,即使在该函数外部作用域执行完毕后仍然可以访问这些变量。闭包允许你在一个函数内部访问另一个函数的变量,这在许多编程语言中是一种强大的特性…

IPv6 中 MAC 33:33 的由来

一、33:33 由来 1. RFC9542 - 2024-05-02 Note IANA allocates addresses under the IANA OUI (00-00-5E) as explained in [RFC9542]. Unicast addresses under the IANA OUI start with 00-00-5E, while multicast addresses under the IANA OUI start with 01-00-5E. In t…

React的列表和Key

React的列表 如果我们要在React中把一个数组转化成为我们的列表要怎么转换呢? 你可以通过使用 {} 在 JSX 内构建一个元素集合。 //定义一个NumberList组件 function NumberList(props) {//使用组件需要传入一个number值const numbers props.numbers;//使用 map(…

2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Python)-C卷D卷-100分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 定义构造三叉搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于…

【OC】为category添加weak属性

友友们都知道,分类当中是不能添加property的,因为运行时系统不会自动完成synthesize,所以需要使用runtime的关联对象形式完成property。也就是这一对函数 /** 设置关联对象 param object : 添加属性的对象,通常填入se…

T200HSA单路SDI/HDMI+1路3.5音频高清万能采集卡

产品简介: 同三维T200HSA单路高清万能采集卡,可以采集1路SDI/HDMI高清信号1路3.5音频信号,卡上有1个是HDMI接口1个是SDI接口1个3.5音频口,配件有: 1个小档板,PCI-E2.0 X1,分辨率最高可以达到10…

机器学习模型评估之校准曲线

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我…

【python数据可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图

用Python爬虫抓取全年天气数据并绘制天气轮播图 一、运行结果: 二、代码展示: 由csv文件生成↓ 接下来是绘制天气轮播图 运行结果: 完整代码请看这里↓👇 提醒制作这个项目你需要执行以下几个步骤: 确定数据源&#x…

OTN分层结构变成什么样了?

传统OTN的三层架构包括光传输段层(OTS)、光复用段层(OMS)和光通道层(OCh),它们共同构成了OTN的三层结构。 其中: 光传输段层(OTS):OTS是OTN中最高…

React是如何渲染元素和组件的

元素的概念 元素是构成 React 应用的最小单位。元素描述了你在屏幕上想看到的内容。React 元素是创建开销极小的普通对象。React DOM 会负责更新 DOM 来与 React 元素保持一致。 将一个元素渲染为 DOM 假设我们的 HTML 文件有一个根元素 <div>该节点内的所有内容都将由 …

鸿蒙 Web组件的生命周期(api10、11、12)

概述 开发者可以使用Web组件加载本地或者在线网页。 Web组件提供了丰富的组件生命周期回调接口&#xff0c;通过这些回调接口&#xff0c;开发者可以感知Web组件的生命周期状态变化&#xff0c;进行相关的业务处理。 Web组件的状态主要包括&#xff1a;Controller绑定到Web组…

力扣SQL50 平均售价 ifnull SUM 连表查询

Problem: 1251. 平均售价 &#x1f468;‍&#x1f3eb; 参考题解&#xff08;题目数据增强&#xff0c;代码只能过90%的点&#xff09; &#x1f37b; AC code SELECT p.product_id, ROUND(ifnull(SUM(units * price) / SUM(units), 0),2) AS average_price FROM prices a…

初学51单片机之数字秒表

不同数据类型间的相互转换 在C语言中&#xff0c;不同数据类型之间是可以混合运算的。当表达式中的数据类型不一致时&#xff0c;首先转换为同一类型&#xff0c;然后再进行计算。C语言有两种方式实现类型转换。一是自动类型转换&#xff0c;另外一种是强制类型转换。 转换的主…

2024GLEE生活暨教育(上海)博览会,8月20-22日,国家会展中心(上海)

2024GLEE生活暨教育(上海)博览会将于8月20-22日在中国国家会展中心&#xff08;上海&#xff09;举行&#xff0c;博览会总面积近万平方米&#xff0c;设有美好生活和教育产品两大主力展区&#xff0c;全面覆盖婴幼儿、学龄前、小学、初中、高中、大学、中年、老年各个年龄段的…

数据库复习重点

第一章通常涵盖数据库系统的基础概念&#xff0c;这里将概述数据库、数据库系统、数据库管理系统的基本概念&#xff0c;数据库系统的三级模式结构&#xff0c;以及数据模型的三要素。 基本概念 数据&#xff08;Data&#xff09;&#xff1a; 数据是描述事物的符号记录&#…

Nvidia Isaac Sim搭建仿真环境 入门教程 2024(4)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

银行数仓项目实战(六)--基础层(完成存款的明细表---宽表)

文章目录 熟悉业务模型设计梳理映射关系加工宽表测试提交 FDM基础层&#xff1a;根据主题&#xff08;需求&#xff09;&#xff0c;将源数据加工集成&#xff0c;形成业务明细表–宽表 熟悉业务 当我们的工作来到基础层&#xff0c;我们首先要做的是跟甲方沟通&#xff0c;要…

未完工数据和系统数据对比分析

select * FROM ( select a.db_close_systime AS a_db_close_systime, -- 订单关闭时间 u.db_close_systime AS u_db_close_systime, -- 订单关闭时间 COALESCE( u.db_close_systime,a.db_close_systime) AS db_close_systime_coalesced ,-- 取非空值的订单关闭时间 a.i…

Harmony设计模式-单例模式

Harmony设计模式-单例模式 前言 软件设计模式&#xff08;[Design pattern](https://baike.baidu.com/item/Design pattern/10186718?fromModulelemma_inlink)&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经…