进行cordic之前需要先把第二、第三象限的坐标旋转90°分别旋转到第一象限和第四象限(即需要旋转到x>0的象限),如果只求模不求相位角的话会更简单一些,直接对x取绝对值之后进行codic运算即可。

以第二象限的点求模和相位角为例,cordic实现步骤如下
① 将坐标(x,y)旋转90°到第一象限得到(X0,Y0)=(y,-x)
②将(X0,Y0)向靠近x轴的方向旋转45°。旋转前需要判断(X0,Y0)在第几象限。判断方法有两种,一是可以通过θ角度判断(θ是坐标点与x轴的夹角),如果θ大于0,则在第一象限,θ小于0,则在第四象限;二是判断Y,Y大于0在第一象限,Y小于0在第四象限(因为第一步已经将x旋转到x>0的象限了);如果在第一象限就往第四象限的方向旋转45°得到(X1,Y1)
如果θ>0或者Y>0,
X1= X0 + Y0/(2^0);
Y1= Y0 - X0/(2^0);
如果θ<0或者Y<0,
X1= X0 - Y0/(2^0);
Y1= Y0 + X0/(2^0);
③将(X1,Y1)向靠近x轴的方向旋转25°。
如果θ>0或者Y>0,
X2= X1 + Y1/(2^1);
Y2= Y1 - X1/(2^1);
如果θ<0或者Y<0,
X2= X1 - Y1/(2^1);
Y2= Y1 + X1/(2^1);
④将(X2,Y2)向靠近x轴的方向旋转12.5°。
如果θ>0或者Y>0,
X3= X2 + Y2/(2^2);
Y3= Y2 - X2/(2^2);
如果θ<0或者Y<0,
X3= X2 - Y2/(2^2);
Y3= Y2 + X2/(2^2);
以此类推,第n次旋转得到的(Xn,Yn):
如果θ>0或者Y>0,
Xn= X(n-1) + Y(n-1)/(2^(n-1));
Yn= Y(n-1) - X(n-1)/(2^(n-1));
如果θ<0或者Y<0,
Xn= X(n-1) - Y(n-1)/(2^(n-1));
Yn= Y(n-1) + X(n-1)/(2^(n-1));

Xn*K就是(x2+y2)开方的结果,即模值
至于旋转迭代多少次要看需要的精度,可以通过仿真确认。总之旋转的目的是让坐标点越来越靠近x轴,y值越来越小,最后的模值就约等于x值;
旋转的角度按45°、25°、12.5°、6.125°…顺序每次减少一半
串行输出的cordic模块架构

pipeline的cordic模块架构

CORDIC算法在第二、第三象限先做90°旋转,然后通过一系列45°、25°等角度的迭代旋转,使坐标点接近x轴,从而求得模值和相位角。该过程适用于计算精度要求不高的情况,旋转次数取决于所需精度。

442

被折叠的 条评论
为什么被折叠?



