问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/one11070910/article/details/139688906

CORDIC(Coordinate Rotation Digital Computer)算法是一种用于计算三角函数、反三角函数、指数和对数等数学函数的高效算法。基于FPGA的CORDIC向量模式实现,可以广泛应用于信号处理、图像处理等领域。本文将详细介绍CORDIC向量模式的原理及其在FPGA上的具体实现方法。

一、向量模式

1、向量模式原理

已知直角坐标下一点(x,y),如何求该点在极坐标系的坐标(ρ, θ)?当x和y都为正数时,有θ = arctan(y/x),求θ的过程即就是求反正切函数的过程。CORDIC算法的思想就是:将向量(x,y)顺时针旋转一定的度数,如果旋转之后纵坐标为0,那么累计旋转的度数就是θ,横坐标x的值就是ρ,也就是向量的模长。

设(x_i, y_i)为原始坐标,以原点为中心,顺时针旋转θ_i之后的坐标为(x_{i+1}, y_{i+1}),则有如下公式:

x_{i+1} = x_i - y_i * sin(θ_i)
y_{i+1} = y_i + x_i * cos(θ_i)

那么每一次旋转的方程都可以这样表示:

x_{i+1} = x_i - y_i * sin(θ_i)
y_{i+1} = y_i + x_i * cos(θ_i)

上式经过多次迭代之后,x_n就是模长ρ,对于上式迭代有如下化简。

1.1

前面通过提取公共系数cos(θ_i)将乘法的次数减少了一半,进一步化简从cos(θ_i)入手:除了θ_0为1外,其余cos(θ_i)均为无理数,必须进行乘法操作,但乘法其实也是由多个移位器组成,因此如果旋转某个特殊的θ_i值,使得cos(θ_i)为简单移位操作,则所有的旋转乘法都可以修改为移位算法。

目前能够将乘法变为移位操作的序列通常都是1/2的n次方或者这些数的组合,例如cos(θ_i) = 2^(-i),计算就可以转化为a右移i位,即a>>i。基于这种思想,可以使各次移位的角度满足θ_i = atan(2^(-i))或者tan(θ_i) = 2^(-i)。

计算出正切值如下表所示:

迭代次数
角度(度)
tan(θ_i)
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

1.2

表达式中K_i在迭代时只是一个系数,旋转过程中这个系数与角度θ_i的大小无关且只需关注y_i趋近于0即可,因此迭代过程中可将K_i的值忽略为1,这样带来的结果是每次旋转后的新坐标模值都比前一次上,具体情况如下图所示。

在仅求解θ时可以忽略掉系数K_i,但求模值时,K_i每次都会使得横坐标变长,K_i是一系列固定的值,每次迭代过程中可以忽略,在最终计算模长时统一处理。

每一次都作为乘积因子出现补偿由于旋转作用带来的模长减小,对于确定迭代次数n的方程而言它是一个确定的乘数。

该乘法多项式的极限为:

K = ∏(i=0 to n) cos(θ_i)

1.3

在每次顺时针旋转后,若纵坐标y_i大于0,说明旋转的度数不够,下一次迭代还要顺时针接着旋转;若纵坐标y_i小于0,说明旋转的度数太大,下一次迭代就要变为逆时针往回补偿。

所以在向量伪旋转的基础上引入d_i来描述向量旋转的方向,d_i决定了θ_i的正负,进而表示旋转方向,当y_i>0时,d_i顺时针旋转,取1,逆时针则相反。

同时,引入角度累加器参数z用来记录向量的总旋转角度。

综上所述我们得到第i次的迭代方程:

x_{i+1} = x_i - d_i * y_i * 2^(-i)
y_{i+1} = y_i + d_i * x_i * 2^(-i)
z_{i+1} = z_i + d_i * θ_i

因此n次旋转后(x_n, y_n)的坐标为:

x_n = x_0 * K
y_n ≈ 0
z_n = θ

设θ_0 = 0,那么z_n就是对应向量的相角, x_n就是对应向量的模值。

2、向量模式的MATLAB仿真

第一步:生成数值表,由数值表,第16次迭代可以达到0.001精度的要求。

迭代次数 角度 tan(θ_i)正切值 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和y最小需要乘以2^16后做加减,故而在开始16次迭代之前,首先将初始值x和y都算数左移16位,相当于先乘以2^16,这样可以保证16次迭代中,x和y都一定是整形计算。另外,为了统一起见,这里对所有角度也都乘以2^16,同样保证角度累加z为整形计算。这样处理后计算的结果也都是乘以2^16的值,将结果再算数右移16位即得到原始结果。

3.2 迭代

(i+1)次迭代时,判断上一次迭代结果y_i的符号位y[31]的情况,当符号位为0时说明y_i为正,此时纵坐标大于0,下一次迭代角度要增加,d_i当符号位为1时相反。以第4次迭代为例。

3.3 结果计算

16次迭代结束后的结果值,y趋近0,x为扩展后的模值,z为角度值。

将x乘以旋转因子K即可得到模值。16次迭代后的K=0.607252935,在硬件层面做如下化简:

K = 0.607252935 * 2^16

则模值为:

ρ = x * K / 2^16

FPGA代码链接:基于FPGA的CORDIC算法向量模式实现资源-CSDN文库

Matlab代码链接:基于Matlab的CORDIC算法实现资源-CSDN文库

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号