基于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,一经查实,立即删除!

相关文章

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

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

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中最高…

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

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

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

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

初学51单片机之数字秒表

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

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

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

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基础层:根据主题(需求),将源数据加工集成,形成业务明细表–宽表 熟悉业务 当我们的工作来到基础层,我们首先要做的是跟甲方沟通,要…

Harmony设计模式-单例模式

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

动态网页制作技术

动态网页制作技术是一种利用脚本语言、数据库和服务器端程序来生成动态内容的网页技术。以下是常用的动态网页制作技术: 1.PHP:PHP是一种广泛使用的服务器端脚本语言,可以嵌入到HTML中,用于生成动态网页内容。它可以与各种数据库进…

前端调试技巧

1、利用console打印日志 2、利用debugger关键字,浏览器f12调用到方法debugger处会断点住,可以利用浏览器调试工具查看变量 a.监视表达式可以添加想要观察的变量 b.调用堆栈可以观察方法调用链 3、xhr断点 请求地址包含v1.0/banner_theme/pagelist&a…

中科大和字节AI视频生成CamTrol杀疯了!运动可控,效果惊艳!

大家好,我是阿潘,今年堪称视频生成的爆发的一年,sora 2024年2月15日发布,让全世界都震惊了。openai 有一次成为了行业标杆。从生成的效果来看,比起以往抽象的生成结果,有了巨大的提升。 今天和大家分享中科…

DevExpress WPF中文教程:Grid - 如何将更改发布到数据库(设计时)?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

c++设计模式之一创建型模式

1、创建型模式(常见的设计模式) Factory 模式(工厂模式,被实例化的子类) 在面向对象系统设计中经常可以遇到以下的两类问题: 下面是第一类问题和代码示例:我们经常会抽象出一些类的公共接口以…

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失,因此就此作罢。对于 macOS 用户来说,当文件被删除时,垃圾箱已被清空,他们可能不知道如何恢…

pytorch lighting: Trying to resize storage that is not resizable

问题 在用pytorch lighting进行训练时碰到如下错误 即 Trying to resize storage that is not resizable 。 解决方案 在dataloader采样图片以及label时,保证每次采样的图片的分辨率不变。

Mistral AI 发布 Codestral-22B,精通 80+ 编程语言,22B 参数超越 70B Code Llama

前言 大型语言模型 (LLM) 在代码生成领域展现出巨大的潜力,但现有的模型在支持的编程语言数量、生成速度和代码质量方面仍存在局限性。法国 AI 独角兽 Mistral AI 近期发布了其首款代码生成模型 Codestral-22B,宣称在多项指标上超越了 GPT-4 和 Llama3&…