0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA使用Cordic算法求解角度正余弦值

FPGA研究院 ? 来源:FPGA之旅 ? 2025-06-19 09:54 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一. FOC之使用Cordic算法求解sin/cos

在进行坐标变换的时候,需要计算角度的正余弦值,而在FPGA中是不能直接进行求解的,需要采用其它的方式进行求解。最常使用的方法有如下两种:

基于ROM的查找表方式: 首先在PC上使用python等高级语言将一个周期内的正余弦值全部计算出来,角度的分辨率根据实际需求来确定,分辨率越精细,那么需要存储ROM的深度就越深,反之约小,然后将计算出来的正余弦值进行一个扩大取整保留数据精度,最后按照角度顺序依次存入ROM中。很明显,通过这种方式计算正余弦值所需要的时钟周期特别短,消耗FPGA的存储资源大。

基于Cordic算法计算: Cordic算法并不直接求解正余弦值,而且通过旋转逼近的思想来进行拟合正余弦函数。该算法拟合的精度非常高,因而被广泛应用于计算机图形学、数字信号处理等领域。

Cordic算法运算过程中,只设计到移位和加减运算,这种运算是非常适合于FPGA的,从面积和计算速度两方面进行综合考虑,最终选择占用面积较小、计算速度略低的Cordic算法来求解sin/cos函数值。

首先如下图所示,假设单位圆上有任意两点Q和P,它们之间的角度关系已知,则它们的XY轴坐标可以表示如下:

2324023c-47e6-11f0-b715-92fbcf53809c.png

将Q点的坐标公式进行展开,然后再将P点的坐标公式代入其中可得:

232fc5fe-47e6-11f0-b715-92fbcf53809c.png

为了统一变量类型,将cos函数作为公共相提取出来,可以得到如下形式:

233c02c4-47e6-11f0-b715-92fbcf53809c.png

可以看出,由P点旋转至Q点后,Q点的最终表达式如上所示,这种形式便是Cordic算法旋转的基本公式了。如果将旋转初始点P设置为一个特殊位置:X轴上,那么很明显Q点的坐标值就是对应旋转角度的正余弦值。

234fa798-47e6-11f0-b715-92fbcf53809c.png

有了上述基本推论,就可以开始真正的进行旋转拟合了。P点直接一步旋转到Q点,肯定是不可取的。如果将P点经过多次旋转,每一次旋转的角度均为特殊角度,tan函数对应的角度值如下,这样就将乘法运算巧妙的转换成了左移运算。

235a373a-47e6-11f0-b715-92fbcf53809c.png

每一次旋转迭代的公式如下,每一次旋转的公式里面还包括了cos函数,这也是不方便在FPGA内计算的,观察表达式可以知道,cos函数在这里起到的作用是对坐标值起到等比例缩放的作用,并不会影响旋转的点对应向量的方向。

236767e8-47e6-11f0-b715-92fbcf53809c.png

所以可以将每一次旋转过程中的cos函数提取出来,最后进行运算,这样就不用参与到每次的旋转计算中去,由于旋转的角度是已知的,所以当确定好旋转次数后,可以将这部分运算提取计算出来,作为一个系数K,K的表达式如下图所示。

23762db4-47e6-11f0-b715-92fbcf53809c.png

接下来就是需要研究每次旋转对应的角度值了,角度对应的tan函数值是已知的,可以通过Python直接求解出对应的角度,然后汇总成如下表格:

2380baa4-47e6-11f0-b715-92fbcf53809c.png

通过上表可以看出,当旋转到16次的时候,角度的误差只有千分之一了,而cosβ和K的值均趋近于一个定值,故Cordic旋转拟合是收敛的。在旋转的过程中,可能会出现旋转角度大于目标角度的情况,所以在旋转的过程中还需要增加一个变量d来控制旋转的方向,另外用z来表示旋转到的角度值,最终的旋转迭代公式如下:

239c9756-47e6-11f0-b715-92fbcf53809c.png

最终目标角度的正余弦值如下:

23a99ece-47e6-11f0-b715-92fbcf53809c.png

FPGA内部实现的过程中,需要对旋转角度值以及K值扩大2^16次方,然后取整,为的是在保持计算精度的情况下,免去数据的小数部分,这些都是固定值,不会根据目标角度的变化而变化,可以在程序中直接定义出来,如下图所示。

23b36c7e-47e6-11f0-b715-92fbcf53809c.png

另外还要一个关键点需要注意的是迭代公式中使用的是tan函数,需要对目标角度限制在-90°到90°范围内,所以在目标角度输入模块之后,需要先对角度进行一个象限变换,为了处理的方便,本设计将目标角度变换到第一象限内,也就是0°到90°,如下图所示,象限变换不会影响正余弦数组的大小,只会影响其数值的符号,所以在迭代完成后,根据需要对坐标点进行取反运行即可。

来源:本文转载FPGA 之旅公众号

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1646

    文章

    22070

    浏览量

    619738
  • 算法
    +关注

    关注

    23

    文章

    4715

    浏览量

    95738
  • 函数
    +关注

    关注

    3

    文章

    4384

    浏览量

    65132
  • CORDIC
    +关注

    关注

    0

    文章

    38

    浏览量

    20268
  • FOC
    FOC
    +关注

    关注

    21

    文章

    350

    浏览量

    44472

原文标题:FPGA通过Cordic求解Sin/Cos函数(FOC)

文章出处:【微信号:FPGA研究院,微信公众号:FPGA研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于改进的CORDIC算法的FFT复乘及其FPGA实现

    的性能。但传统CORDIC算法中每次CORDIC迭代方向需由剩余角度的计算来确定,影响了工作速度。为此,本文根据定点FFT复乘中旋转因子的旋转方向可预先确定的特点,对
    发表于 07-11 21:32

    CORDIC算法求助

    请问CORDIC算法用verilog算法实现时,角度累加器中的45度,26.56度,14.04度怎么跟verilog语言相对应?
    发表于 07-11 20:18

    FPGA设计中必须掌握的Cordic算法

    大多数工程师在碰到需要在 FPGA 中实现诸如正弦、余弦或开平方这样的数学函数时,首先会想到的是用查找表,可能再结合线性内插或者幂级数(如果有乘法器可用)。不过对这种工作来说,CORDIC
    发表于 09-19 09:07

    基于FPGA的数控振荡器原理及设计方法

    余弦信号的实现过程,给出了在FPGA 中设计数控振荡器的顶层电路结构,并根据算法特点在设计中引入流水线结构设计。在正交数字混频器中,采用数字频率合成技术,可以将数字处理延续到正交调制
    发表于 07-15 08:00

    基于CORDIC算法2FSK调制器的FPGA设计

    本文提出了应用CORDIC(Coordinate Rotation Digital Computer)算法实时计算正弦的方案,并基于CORDIC
    发表于 05-31 10:22 ?2050次阅读
    基于<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>2FSK调制器的<b class='flag-5'>FPGA</b>设计

    FPGA实现高精度余弦函数

    在研究CORDIC算法的数学基础上,采用流水线的硬件结构实现了该算法,并在Altera公司的FPGA芯片上进行了验证,使
    发表于 12-16 14:30 ?33次下载
    <b class='flag-5'>FPGA</b>实现高精度<b class='flag-5'>正</b><b class='flag-5'>余弦</b>函数

    使用Xilinx CORDIC IP核生成余弦

    本文介绍如何调用Xilinx的CORDIC IP核生成某一频率的正弦波和余弦波。 主要是CORDIC IP核的设置,下面对其具体参数的设置进行了说明。 标注1:选择函数的类型,这里选择sin和cos
    发表于 02-08 15:24 ?7680次阅读
    使用Xilinx <b class='flag-5'>CORDIC</b> IP核生成<b class='flag-5'>正</b>、<b class='flag-5'>余弦</b>波

    FPGA基于CORDIC算法的求平方实现

    CORDIC是在没有专用乘法器(最小化门数量)情况下,一组完成特定功能的算法,包括平方、超越、Log、sin/cos/artan。原理为连续的旋转一个较小的角度,以一定精度逼近想要的角度
    发表于 02-11 19:24 ?6183次阅读

    关于FPGA设计中使用CORDIC算法的教程分享

    虽然CORDIC 是实现 DSP 和数学函数最重要的算法之一,但许多设计人员并不熟悉。 作者:Adam P. Taylor 首席工程师 阿斯特里姆公司 (EADS Astrium
    发表于 10-06 10:52 ?2199次阅读
    关于<b class='flag-5'>FPGA</b>设计中使用<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>的教程分享

    基于FPGACordic算法实现的设计与验证

    本文是基于FPGA实现Cordic算法的设计与验证,使用Verilog HDL设计,初步可实现正弦、余弦、反正切函数的实现。将复杂的运算转化成FPG
    发表于 07-03 10:18 ?3152次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b>实现的设计与验证

    如何使用查找表和Newton插算法实现正余弦函数的FPGA

    余弦函数在任意次谐波电流的无锁相环护矗检测法中有着重要应用.提出了一种基于查找表和Hewton插算法相结合的
    发表于 03-19 17:41 ?29次下载
    如何使用查找表和Newton插<b class='flag-5'>值</b><b class='flag-5'>算法</b>实现正<b class='flag-5'>余弦</b>函数的<b class='flag-5'>FPGA</b>

    高精度余弦函数的FPGA实现(打印)

    高精度余弦函数的FPGA实现(打印)实现。
    发表于 04-27 14:14 ?5次下载

    怎样使用CORDIC算法求解角度余弦呢?

    CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。
    的头像 发表于 08-31 14:54 ?3583次阅读
    怎样使用<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b><b class='flag-5'>求解</b><b class='flag-5'>角度</b><b class='flag-5'>正</b><b class='flag-5'>余弦</b>呢?

    FPGA实现Cordic算法求解arctanθ

    由于在项目中需要使用的MPU6050,进行姿态解算,计算中设计到arctan 和 sqr(x*2 + y * 2),这两部分的计算,在了解了一番之后,发现Cordic算法可以很方便的一次性求出这两个这两部分的计算。
    的头像 发表于 09-27 09:30 ?3128次阅读
    <b class='flag-5'>FPGA</b>实现<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b><b class='flag-5'>求解</b>arctanθ

    深度解析CORDIC算法原理

    CORDIC算法的思想是通过迭代的方法,使得累计旋转过的角度的和无限接近目标角度。它是一种数值计算逼近的方法,运算只有移位和加减。
    的头像 发表于 04-29 16:48 ?4113次阅读
    深度解析<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>原理