cordic算法verilog实现求模

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

想深耕嵌入式?这个专辑值得收藏

MCU、FPGA、工控、传感器一站式学习,实战项目直接抄

进行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模块架构
在这里插入图片描述

想深耕嵌入式?这个专辑值得收藏

MCU、FPGA、工控、传感器一站式学习,实战项目直接抄

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值