博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CORDIC的硬件算法实现(摘录整理)
阅读量:5142 次
发布时间:2019-06-13

本文共 3645 字,大约阅读时间需要 12 分钟。

该系统完成的是一个平面坐标旋转如图 1所示,可以看出,将向量(X i ,Y i ) 旋转 角,得到一个新的向量

( Xj,Yj)。

将Rcos()展开

矩阵形式

硬件上用乘除法很耗资源,未来节省资源采用这样的思路:最常用的代替乘法的方式是移位运算

来看下把这乘法最终转换为移位的思路:

移位运算只能做乘除2.    但这些运算组合可形成大的乘除法

将要旋转的角度分解,每次完成一小块,多次后就可逼近角度值

分解(逼近)方式入下:

其中的第n次旋转过程

第n次的旋转角度必须是这个(n为任意值)(arctan(1)= 45度)

Sn为符号(-,+) ,各种 组合成 (即真正要旋转的角度)

Zn为未旋转的角度

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

先看下如何消去

随着迭代的增加他将收敛与常数K(或1/P),故可用预先计算来消除.

··········································································································································································

未旋转的角度减少到0,用伪代码表示为

For n=0 to [inf]

If (Z(n) >= 0) then

      Z(n + 1) := Z(n) – atan(1/2^n);

Else

      Z(n + 1) := Z(n) + atan(1/2^n);

End if;

End for;

预先计算好arctan(1/2^n)的值,形成查找表的形式,[inf]为需要的迭代次数,每一位需要1次(16轮的迭代将产生16位的结果),如果加入X,Y的计算,用伪代码的表示如下:

For n=0 to [inf]

If (Z(n) >= 0) then

       X(n + 1) := X(n) – (Yn/2^n);

       Y(n + 1) := Y(n) + (Xn/2^n);

       Z(n + 1) := Z(n) – atan(1/2^n);

Else

       X(n + 1) := X(n) + (Yn/2^n);

       Y(n + 1) := Y(n) – (Xn/2^n);

       Z(n + 1) := Z(n) + atan(1/2^n);

End if;

End for;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使Z趋向于0

存在以下有趣的情况:

就是把矢量旋转到x轴上,这时候 x的坐标就是矢量的模啦

注意:参数范围

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

算法硬件实现原理图:

X,Y的输入为最原始的x,y值;k的输入为确定arctan(1/2^k)  ; 要旋转的角度

数据最高位为符号位1为负 0为正

···   左移右移k =n来完成·····

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

··· ···   ···· 这个反馈回路来完成迭代,一次次小的旋转最终完成大的旋转

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

预先计算好arctan(1/2^k)的值,形成查找表的形式

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 ···

这个回路·····   Z(n + 1) := Z(n) +atan(1/2^n);

                                                                                         Z(n + 1) = Z(n) -atan(1/2^n);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

判断Z(n),看是加还是减(? ? )

If (Z(n) >= 0) then

       X(n + 1) := X(n) – (Yn/2^n);

       Y(n + 1) := Y(n) + (Xn/2^n);

       Z(n + 1) := Z(n) – atan(1/2^n);

Else

       X(n + 1) := X(n) + (Yn/2^n);

       Y(n + 1) := Y(n) – (Xn/2^n);

       Z(n + 1) := Z(n) + atan(1/2^n);

End if;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

的硬件实现:

先给出RTL的图:

思路:

这里k有三位,故整个移位过程分3步进行  即 single ; double; triple

这三部分是将数依次移动 2^0, 2^1, 2^2

实例:

k = 3’b101;

k[0] = 1;     故数右移1*2^0位

k[1] = 0;      故数右移0*2^1位

k[2] = 1;      故数右移1*2^2位

  最终右移啦5位

k控制的的选择器

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

二进制角度表示查找表表 硬件实现

Look-Up Table

这儿用12位2进制数表示角度(bit[11],bit[10]……bit[0]

首先确定12位数与角度的关联:

bit[11] 表示-180度 (1:出现-180;0:不出现-180; 方便与后边的数累加  即可表示-180~ +180的值)

bit[10] 表示+90度

bit[9:0] 表示+90/(2^n) 

(n值得确定方式为:

1 为bit[9]

`

`

`

10 为bit[0]

)(其实就是角度减半减半再减半)

verilog 描述:

 

另外由于旋转因子需要进行0°、-90°或+90°三种预旋转,所以预旋转还要分配两位二进制数,这样存储旋转系数就为12位的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

硬件实现

12-bit Full Adder

有点像异或门做选择器,呵呵

二进制与1异或 相当于取反  取反后二进制的位置与原先的位置是对称的 故可以此表示-180  ~ +180

当与0异或时 原数不变

当sign = 0 时做加法

当sign = 1 时做减法 (其实是改变后的加法)

4 Bit Full Adder

这个4位的全加器就多讲啦

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``

最后:

Vectoring CORDIC  用于计算复数的模

用迭代使Y趋向0 就是将矢量旋转到x轴上 此时x轴坐标就是 矢量的模;

需要注意的是:

在迭代之前要保证矢量在(-90,,90)之间

操作方法是 当矢量在地1,2象限(0,180)是-90度

          当矢量在地3,4象限(-180,0)时+90度

参考资料:

转载于:https://www.cnblogs.com/sleepy/archive/2011/07/11/2103391.html

你可能感兴趣的文章
centos 常用命令
查看>>
P1137 旅行计划
查看>>
洛谷 P2212 [USACO14MAR]浇地Watering the Fields
查看>>
umask函数
查看>>
PHP高级笔记汇总
查看>>
cxGrid用法-最新
查看>>
如何在SqlServer中获取前端连接的IP地址,计算机名等信息
查看>>
webpack.optimize.CommonsChunkPlugin插件的使用
查看>>
在VS2010中配制Elmah邮件发送到Gmail
查看>>
变量的范围 namespace
查看>>
队列-生产者消费者模式
查看>>
学习笔记23_AspMVC项目
查看>>
webstrom提示不见了
查看>>
Linux 永久挂载镜像文件和制作yum源
查看>>
Lock和synchronized比较详解(转)
查看>>
eclipse代码编辑器中按alt+/提示No Default Proposals 的解决方法
查看>>
相似算法-编辑距离
查看>>
hql date比较
查看>>
前端如何判断音视频是否播放完毕
查看>>
[转]vi 常用命令行
查看>>