sysgen学习之cordic算法的理解

来源:互联网 发布:华为交换机禁止mac 编辑:程序博客网 时间:2024/05/16 15:07

首先cordic算法可以实现在乘法器较少的情况下实现各种三角函数的求解。理解cordic算法很重要。

感谢作者liyuanbhu的分享,链接是http://blog.csdn.net/liyuanbhu/article/details/8458769;

下面是自己的一些学习心得,总结一下:

1、cordic算法的核心,伪旋转方程。

坐标系内的一点z(x,y)在旋转某以特定的角度therta时,他的旋转方程式为:

x‘ = x*cos(therta) +  y*sin(therta);

y' = y*cos(thrta) - x*sin(therta);

corid的算法方程式如下:

x‘ = (x +  y*tan(therta))*cos(therta);

y' = y - x*tan(therta) *cos(therta);

angle_sum = angle_sum + d*angle;

观察这个表达式,cordic算法的目的就是为了简化计算,这个表达式中已经有两个乘法,为简化计算,就把cos(therta)直接去掉,他并不影响角度,只是会影响信号的幅值。因此去掉cos后的表达是就可以写成:

x‘ = x +  y*tan(therta)

y' = y - x*tan(therta)

此时需要明白一个道理,我觉得也是理解的一个关键;我要通过旋转角度来时逼近真实角度,如上图所示,我真实的角度是therta;我要通过的旋转rotation_angle角度来逼近真实角度therta;把(x,y)这个向量往下旋转,一直旋转到它的y直接靠近0;即我的旋转角度就能够接近真实角度啦。因此在cordic算法中还有一个角度的累积量

angle_sum;当我的y>0的时候,把累计角度与旋转角度相加,当y<0的时候,累计角度与旋转角度相减。如下图所示:


当y逼近0的时候,这个时候我们的angle_sum就能够近似的逼近真实角度啦。

其中为了计算方便将tan(therta)用2^i;次方代替

实现方法:(matlab求解atan函数值)

%% --------------------------------------------------------------------------------------

tangen = [1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256 1/256 1/512 1/1024 1/2048 1/4096]; %%这个就是用来产生迭代的旋转角度

sum_times = length(tangen); %%角度的迭代次数

rotation_angle = atan(tangen)*180/pi; %%这个是tangen所对应的角度。

x_data = [100 200 300]; %%用来产生输入数据x,求解角度的

y_data = [120 230 350]; %%用于产生输入数据y,求解角度的

real_tangle = atan(y_data./x_data)*180/pi; %%对应于输入数据的真实角度

len = length(x_data); %%计算总共的数据长度,可以进行多输入值计算

angle_sum = 0; %%角度累积变量

angle_show = zeros(1,len);%%用于存放计算的结果

show_matri = 0; %%用于存放显示最后计算角度和真是角度矩阵

%% -----------------------------------------------------------------------------------------

for j = 1:len

x = x_data(j);

y = y_data(j);

for i = 1:sum_times

if(y >0)

x_new = x + y*tangen(i);

y_new = y - x*tangen(i);

x = x_new;

y = y_new;

angle_sum = angle_sum + rotation_angle(i) ;

else

x_new = x - y*tangen(i);

y_new = y + x*tangen(i);

x = x_new;

y = y_new;

angle_sum = angle_sum - rotation_angle(i) ;

end

end

angle_show(j) = angle_sum;

angle_sum = 0;

end

show_matri = [angle_show ;real_tangle];

%% --------------------------------------------------------------------------------------------------------------

求解sin;cos函数我觉得只要改变旋转角度的选取就行啦


0 0
原创粉丝点击