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函数我觉得只要改变旋转角度的选取就行啦
- sysgen学习之cordic算法的理解
- Cordic算法的FPGA实现之原理学习随记
- Cordic算法的原理
- CORDIC算法的FPGA实现
- Cordic 算法的原理介绍
- Cordic 算法的原理介绍
- sysgen学习之hdl coder使用
- 2---理解正余弦、复数求模、反正切和乘除运算的CORDIC算法实现
- Cordic 算法入门
- FPGA实现cordic算法
- cordic算法详解
- cordic算法的总结和verilog代码的编写
- xilinx cordic IP核的用法- arctan的算法
- FPGA基于CORDIC算法的求平方实现
- verilog实现基于Cordic算法的双曲函数计算
- 基于FPGA的CORDIC算法实现——Verilog版
- CORDIC的FPGA实现
- 三角函数计算,Cordic 算法入门
- win7下安装红帽linux
- 【LeetCode】Anagrams
- Android中Gson解析详解json
- 自定义UITableViewCell详细步骤+++++++++++++++
- C++显式类型转换---static_cast
- sysgen学习之cordic算法的理解
- 自定义提示框
- 十七、oracle 权限
- 自动白平衡(AWB)算法---1,色温曲线
- “数据结构”学习总计划及其策略
- C盘太满,程序不能运行的原因
- FZU2108:Mod problem(数学)
- 代码1
- 怎么最快提高自己的知识