FPGA-CORDIC算法专题-00-认识CORDIC算法

写在前面

这个系列将会更很久吧,本文是该系列的开篇,主要参考的文章是黑金系列的FPGA STORY–CORDIC,黑金的论坛貌似吃灰好久了,教程感觉条理性挺好,就分享给大家吧,读书笔记和个人总结,希望对大家有帮助。

CORDIC是什么?

CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。

我们知道描述语言缺乏数学的天赋,故数学函数可能是一处死穴,而且数学还令人联想到恶心的浮点数,再者描述语言也不支持浮点数,更不用想象旁边有一座浮点数的数学库。在此,我们必须感叹命运的伟大,让我们获取一件数学工具,它与硬件不谋而合,它和 FPGA 臭味相投,它和描述语言更是天生一对!

这里黑金的教程说的很生动,确实在FPGA中,是不同擅长复杂的数学计算的,(我理解的不擅长只是形式复杂,实现比较麻烦,而不是本身没有MCU实现运算的效率高)因为FPGA不支持浮点数,所以很多操作就受到了限制,而在cordic的帮助下,FPGA可以熟练实现各种比较复杂的数学计算。这正是和硬件描述下一直缺少的部分是互补的。

12345.12345 // 定点数
1.234512345 x 10 4 or 12.34512345 x 10 3 // 浮点数

数学上,定点数是实数,浮点数也是实数,两者只有表达方式不同而已。定点数的小数点被锁死,浮点数的小数点则可以移动,这也表示后者拥有更大的计数范围。
CORIDC 算法自定义很强,我们完全可以按照自己的意思去调配它,甚至可以去到斤斤计较的程度。它伸缩自如,变换莫测,简直就是神器 …

CORDIC知识扫盲

这里参考黑金的解释:

在这里插入图片描述

假设矢量 V0 向矢量 V1 移动θ幅度,正常情况下的矢量会沿着圆形的轨
迹进行移动,这种情况我们称为旋转(Rotation)。相对之下,CORDIC 算法的情况比较特别,假设矢量 V0 向矢量 V1’移动θ幅度,故它不会是沿着圆形轨迹移动,而是按照伪旋转(Pseu Do Rotation)的方式进行。

当然,伪旋转也不是随心所欲想去哪里就去哪里,它必须遵守自己的变换规则。那么,什么是变换规则?这个问题就要涉及 CORDIC 算法的公式了。
在这里插入图片描述
假设源矢量 Vn 尝试逼近目标矢量 V4,对此它有 3 种视角解读。左图显示,这是旋转角度的视角,矢量每旋转一次角度就减小一些,如果读者觉得角度很难理解,我们可以把它视为距离,然后再看中图更容易理解了。中图显示,旋转角度被视为移动距离,大致过程如下:

(一)Vn 移动至 V0 是 1/2 的距离。
(二)V0 移动至 V1 是 1/4 的距离。
(三)V1 移动至 V2 是 1/8 的距离。
(四)V2 移动至 V3 是 1/16 的距离。
(五)V3 移动至 V4 是 1/32 的距离

结果而言,源矢量每一次向目标矢量逼近,下一次的距离是上一次的一半。另外,这幅图也告诉我们矢量存在旋转方向。假设以矢量 V4 的红线为参考系,那么其它矢量的表现如下:

(一)Vn 在移动之前,它在目标矢量的下面,所以它向上移动成为 V0。
(二)V0 在移动之前,它在目标矢量的上面,所以它向下移动成为 V1。
(三)V1 在移动之前,它在目标矢量的下面,所以它向上移动成为 V2。
(四)V2 在移动之前,它在目标矢量的上面,所以它向下移动成为 V3。
(五)V3 在移动之前,它在目标矢量的上面,所以它向下移动成为 V4。

理论上,矢量的旋转方向是有一个判断基准,上面虽然是矢量 V4。但是在算法里面,这个基准会根据模式而有所改变,具体内容请容许笔者放在后面再解释。最后,右图显示,源矢量每次向目标矢量逼近,它的长度会越来越接近目标矢量。总结而言,图 1.2告诉我们:

五个核心

(一)矢量移动的距离(角度)
(二)矢量移动的次数(精度)
(三)矢量移动的规则(公式)
(四)矢量移动的方向(加减)
(五)矢量最终的长度(结果)

CORDIC 算法是一种统称,规则和模式可以千变万化,但原理都离不开以上 5 个核心。理论上,矢量只要拥有足够的移动次数,它就会越来越接近目标,而且距离也会越来越短。矢量一旦停止移动,它的最终长度也代表最终结果,如果移动次数足够,那么结果的精度也会越高。

源矢量究竟要移动多少次才会停止

这里有两个控制选项:

  • 矢量达到预设的移动次数。
  • 源矢量与目标矢量的距离。

一般上,移动次数可以人为,所以 CORDIC 算法可以随意控制它的精度与速度。换句话说,要精度就拉长移动次数,要速度则是缩短移动次数。相对之下,CORDIC 算法在执行中有一个参数会扑向 0 值,这个参数表示源矢量与目标矢量之间的距离,它越接近零值结果越是收敛成熟。

两个模式:

  1. 矢量模式(Vectoring Mode)
  2. 旋转模式(Rotation Mode)

在旋转模式下,矢量的旋转方向由角度决定,
在矢量模式下,矢量的旋转方向则由坐标决定。

三个系统

(一)线性函数(Linear Method)
(二)三角函数(Circular/Trigonometric Method)
(三)双曲函数(Hyberbolic Method)

线性函数,三角函数(圆函数)以及双曲函数都是现代数学的支柱,CORDIC 算法的任务就是实现它们。细分之下,这些函数还有许多的成员。

/*** 线性函数 ***/

a*b,a/b // 乘法,除法


/*** 三角函数 ***/

cos()sin()tan() // 三角函数
arccos()arcsin()atan()/arctan() // 反三角函数


/*** 双曲函数 ***/

cosh()sinh()tanh() // 双曲函数
arccosh()arcsinh()arctanh() // 反双曲函数
e x ,ln(x) // 自然字数,自然对数
√a, // 平方根

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/107046807