首先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函数我觉得只要改变旋转角度的选取就行啦