新浪博客

cordic算法的应用(三角函数、相位模值、乘法除法、双曲函数、指数平方差)

2020-04-25 12:16阅读:
cordic算法是一种易于硬件实现的求基本函数的算法,将复杂运算转化为加法、减法和移位操作的组合,避免硬件上不易实现的复杂运算,比如除法,开方等,另外可以避免查找表方法带来的占用较多存储资源的问题。关于cordic的原理很多资料已经介绍的比较详细,这儿不会详细推导,这里只关注如何应用。
一、三角函数运算
1、已知角度值,计算sin、cos
********************代码*****************
import numpy as np
def cordic_for_sincos(alpha,coridc_num):
x0=0.607253
y0=0
z0=alpha

xlast=x0
ylast=y0
zlast=z0

for i in range(coridc_num):
sign=-1
if zlast>=0:
sign=1
xnow=xlast-ylast*(1/2)**i*sign
ynow=ylast+xlast*(1/2)**i*sign
znow=zlast-np.arctan((1/2)**i)*sign
xlast=xnow
ylast=ynow
zlast=znow

result_cos=xlast
result_sin=ylast
return result_cos,result_sin
********************代码*****************
算法的大致原理是:在单位圆上,从x轴开始旋转,旋转到角度alpha,此时横坐标对应余弦,纵坐标对应正弦。
仿真代码很简单,其中反正切值根据迭代次数i提前算出写入表格,x0是迭代初值,这个初值是cordic增益的倒数,cordic增益根据迭代次数唯一确定。迭代次数越多,则计算越精确,需要的中间位宽也越多,当然cordic增益值也不同。
2、已知sin、cos值,求alpha
********************代码*****************
def cordic_for_alpha(sin,cos,coridc_num):
x0=cos
y0=sin
z0=0

xlast=x0
ylast=y0
zlast=z0

for i in range(coridc_num):
sign=1
if ylast>=0:
sign=-1
xnow=xlast-ylast*(1/2)**i*sign
ynow=ylast+xlast*(1/2)**i*sign
znow=zlast-np.arctan((1/2)**i)*sign
xlast=xnow
ylast=ynow
zlast=znow

reult_alpha=zlast
return reult_alpha
********************代码*****************
求角度和求正弦余弦恰好反过来了,相当于把第一象限单位圆上的点旋转回去,因此代码只用更改初始值,符号判断条件。
3.已知alpha的正切值,求alpha(反正切)
代码与第二节相同,只是函数的第一个参数的输入为alpha正切值,第二个参数的输入值为1。从数学本质上讲,已知正弦余弦求alpha和已知正切值求alpha是一种运算,但是对于实现是有区别的。现在能查到的大量资料显示的多是反正切的求法。如果这时候知道正弦和余弦,强行套用反正切cordic算法,相当于增加了一次正弦与余弦的比值除法运算,代价就变大了。
二、三角函数运算的推广
将第一象限单位圆上的三角函数运算推广至整个坐标平面的第一象限,cordic可以完成三角函数运算、角度求解之外的很多功能。
1、已知坐标,求平面模值
求反正切代码中,若输入变量cos=x,sin=y,返回值改为xlast/G,其中G代表cordic增益,则可以求解平面点(x,y)的模值。利用这一点,可以快速实现多个数的平方和开方。
2、已知坐标,求相位角
在1.2节中,若输入变量cos=x,sin=y,返回值代表平面点(x,y)的相位角
3、已知平面点的模值和相位角,求平面点的坐标
在1.1节中,若输入初始变量x0改为M/G,M代表模值,G代表cordic增益,z0为相位角alpha,则返回坐标值(x,y)。即x=M*cos(alpha),y=M*sin(alpha)
三、乘除法运算
1.乘法
********************代码*****************
def cordic_mul(x,z,coridc_num):
xlast=x
ylast=0
zlast=z
for i in range(coridc_num):
sign=-1
if zlast>=0:
sign=1
ynow=ylast+xlast*((1/2)**i)*sign
znow=zlast-(1/2)**i*sign
ylast=ynow
zlast=znow
result_mul=ylast
return result_mul
********************代码*****************
以上算法可以输出x和z的乘积,x无范围要求,但是z必须小于2,否则计算结果会出错,对于z大于2的情况,需要移位归一化处理,比如5*10=5*(10/8)*8,其中8=2^3,可通过移位实现,将10转化为0-2之间的数。
2、除法
********************代码*****************
def cordic_div(x,y,coridc_num):
xlast=x
ylast=y
zlast=0
for i in range(coridc_num):
sign=1
if ylast>=0:
sign=-1
ynow=ylast+xlast*((1/2)**i)*sign
znow=zlast-(1/2)**i*sign
ylast=ynow
zlast=znow
result_div=zlast
return result_div
********************代码*****************
以上算法可以计算出y/x的值,但是y/x的值必须小于2,否则计算结果会出错,对于y比x大得多的情况,同样需要移位归一化处理,可将y移位变小或者x移位变大,方法和上一节一样。
四、双曲函数计算
1、已知alpha,计算sinh,cosh
********************代码*****************
def cordic_for_sinhcosh(alpha,coridc_num):
x0=1.2051363585399921
y0=0
z0=alpha

xlast=x0
ylast=y0
zlast=z0

for i in range(coridc_num):
sign=-1
if zlast>=0:
sign=1
xnow=xlast+ylast*(1/2)**(i+1)*sign
ynow=ylast+xlast*(1/2)**(i+1)*sign
znow=zlast-np.arctanh((1/2)**(i+1))*sign
xlast=xnow
ylast=ynow
zlast=znow

result_cosh=xlast
result_sinh=ylast
return result_cosh,result_sinh
********************代码*****************
x0的初值是cordic增益,与迭代次数一一对应。需要额外注意的是:双曲函数的迭代运算中,2的指数从1开始,和三角函数不同,三角函数从0开始。
此外,双曲函数的角度alpha输入必须在(-1,1)之间
2、求-1-1之间数双曲反正切
********************代码*****************
def cordic_for_arctanh(x,y,coridc_num):
x0=x
y0=y
z0=0

xlast=x0
ylast=y0
zlast=z0

for i in range(coridc_num):
sign=1
if ylast>0:
sign=-1
xnow=xlast+ylast*(1/2)**(i+1)*sign
ynow=ylast+xlast*(1/2)**(i+1)*sign
znow=zlast-np.arctanh((1/2)**(i+1))*sign
xlast=xnow
ylast=ynow
zlast=znow

result_x=xlast*1.2051363585399921
result_z=zlast
return result_x,result_z
********************代码*****************
输入x代表双曲余弦,输入y代表双曲正弦,返回值result_z可计算出双曲反正切的值。和三角函数计算思路一致。但必须满足y小于x,因为双曲正切的值域为(-1,1)
五、双曲函数的推广应用
1、自然指数
在4.1节中,若输入变量alpha范围为(-1,1),则返回值result_cosh+result_cosh=e^alpha,因此可计算自然指数函数。当需要计算指数值大于1时,可以拆开运算,比如e^1.5=e^1*e^0.5。另外可根据指数运算的性质推导出其他cordic的运算应用,这个以后补充
2、平方差开方
在4.2节中,若输入变量y小于x,则返回值result_x代表sqrt(x^2-y^2),函数中1.2051363585399921代表cordic增益,由迭代次数确定。由此可以计算平方差。

我的更多文章

下载客户端阅读体验更佳

APP专享