VIVADO中,cordic是一个实现通用坐标旋转计算的IP核,在进行数字信号处理时常常会用到,算法主要是通过迭代来解三角方程,不过这些原理的东西我们做FPGA实现的不需要掌握它的历史,重点是怎么用,正好最近刚刚做完一个bp神经网络的实现,很多地方都用到了cordic核,网上的讲解很散乱,所以决定自己写一个。 cordic核主要功能包括: - rotate 旋转 ——复数旋转
- translate 变换 ——复数转极坐标
- sin/cos
- arctan
- sinh/cosh
- arc tanh
- square root 平方根
我这里就介绍一部分功能:rotate、 translate、 arctan、 square root
1. 旋转cordic算法最初是为了实现矢量旋转设计的,对于(X,Y),旋转角度θ后为(X’,Y’),则有如下式子
在复平面上,旋转完成的功能如下所示:
如果我没记错的话,输入phase为正数,则逆时针旋转;输入为负数,则顺时针旋转。
旋转这个功能就说两个问题:phase输入问题、cordic输出模值不正确的问题。 PHASE输入cordic对phase输入有两种格式,一种是radians,另一种是scale radians。
radians格式下就是输入正常的弧度制,输入范围是(-π,π)
scale radians则是输入归一化的弧度值,输入范围是(-1,1)
说明白点,radians格式下,你的输入就相当于在scale radians下输入再乘π。 另外是cordic的输入与MATLAB中操作对应的问题,举个例子就明白了:
matlab代码如下:
xu2 = exp(-1i*pi*phase) .* (data);
则cordic核在scale radians格式下的phase应当输入-1i*phase,没错,记得输入负数,这里好坑,我试了好久才发现这个问题,之前写MATLAB的时候总是觉得选好phase就可以了,结果到了cordic竟然要我自己加个负号, |