首页 / 算法 / CORDIC逼近算法
CORDIC逼近算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了CORDIC逼近算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3255字,纯文字阅读大概需要5分钟。
内容图文
现在开始学习CORDIC算法
学习的博文:
(1)http://blog.csdn.net/liyuanbhu/article/details/8458769 三角函数计算,Cordic 算法入门
(1)很好的解释了cordic算法的思想。坐标旋转公式。推导http://www.cnblogs.com/ywxgod/archive/2010/08/06/1793609.html
顺时针旋转: x‘ = xcos(θ) + ysin(θ), y‘ = -xsin(θ) + ycos(θ);
逆时针旋转:x‘ = xcos(θ) - ysin(θ), y‘ = xsin(θ) + ycos(θ);
知道这个后,要确定(x,y)的极坐标ρ = sqrt(x2+y2 ), θ = arctan(y/x)。其中θ 的求解就是一个要求超函数。在博文中是通过二分查找发。其中逼近的指标是y = 0;到此我估计cordic算法也是一种类似的逼近。
这个二分查找实在是形象。
使用FPGA实现如下:只使用了5级流水线。其角度精度在26-7.
1 // ***************************************************************************************** 2 // 3 // function: achieve the coordinate rotation digital computers 5 4 // 5 // 6 // corn 2014.11.15 7 // 8 // 9 // ***************************************************************************************** 10 11 module cordic_module( 12 input clk, rst_n, 13 14 input signed [7 : 0] x0, y0, 15 16outputregsigned [7 : 0] r, syta 17 18); 19 20parameter WIDTH = 8; 21 22 23regsigned [WIDTH - 1 : 0] x0_r, x1_r, x2_r, x3_r, x4_r; 24regsigned [WIDTH - 1 : 0] y0_r, y1_r, y2_r, y3_r, y4_r; 25regsigned [WIDTH - 1 : 0] syta0_r, syta1_r, syta2_r, syta3_r, syta4_r; 26 27 28always @(posedge clk ornegedge rst_n) begin 29if(!rst_n) begin 30 syta0_r <= 0; 31end 32elsebegin 33//first stage---------------------------------------------------------- 34if(x0 >= 0) begin//in the first sector or forth sector 35 x0_r <= x0; 36 y0_r <= y0; 37 syta0_r <= 0; 38end 39elseif(y0 >= 0) begin//in the second sector 40 x0_r <= y0; 41 y0_r <= -x0; 42 syta0_r <= 90; 43end 44elsebegin//in the third sector 45 x0_r <= -y0; 46 y0_r <= x0; 47 syta0_r <= -90; 48end 49//second stage arctan(1)------------------------------------------------------- 50if(y0_r >= 0) begin 51 x1_r <= x0_r + y0_r; 52 y1_r <= y0_r - x0_r; 53 syta1_r <= syta0_r + 45; 54end 55elsebegin 56 x1_r <= x0_r - y0_r; 57 y1_r <= y0_r + x0_r; 58 syta1_r <= syta0_r - 45; 59end 60//third stage arctan(2)--------------------------------------------------------- 61if(y1_r >= 0) begin 62 x2_r <= x1_r + y1_r / 2; 63 y2_r <= y1_r - x1_r / 2; 64 syta2_r <= syta1_r + 26; 65end 66elsebegin 67 x2_r <= x1_r - y1_r / 2; 68 y2_r <= y1_r + x1_r / 2; 69 syta2_r <= syta1_r - 26; 70end 71//forth stage arctan(4)--------------------------------------------------------- 72if(y2_r >= 0) begin 73 x3_r <= x2_r + y2_r / 4; 74 y3_r <= y2_r - x2_r / 4; 75 syta3_r <= syta2_r + 14; 76end 77elsebegin 78 x3_r <= x2_r - y2_r / 4; 79 y3_r <= y2_r + x2_r / 4; 80 syta3_r <= syta2_r - 14; 81end 82//fiveth stage arctan(8)--------------------------------------------------------- 83if(y3_r >= 0) begin 84 x4_r <= x3_r + y3_r / 8; 85 y4_r <= y3_r - x3_r / 8; 86 syta4_r <= syta3_r + 7; 87end 88elsebegin 89 x4_r <= x3_r - y3_r / 8; 90 y4_r <= y3_r + x3_r / 8; 91 syta4_r <= syta3_r - 7; 92end 93 94//output 95 r <= x4_r; 96 syta <= syta4_r; 97end 98 99100101end//always 102// 103104105106endmodule
仿真结果:
其中使用了三组数据:(-41, 55),(4, -4),(3, 3)
使用计算机的结果:(68.6,-53), (5.6, -45) (4.2, 45)
仿真结果: (112,-126),(9, -40),(6, 50)其中(-126)180 = -54
结论: 半径有所增加,角度有一定的误差误差范围在27-7。在角度的时候有一定的误差。如果要增加精度,就增加迭代的次数。
原文:http://www.cnblogs.com/cornhill/p/4098123.html
内容总结
以上是互联网集市为您收集整理的CORDIC逼近算法全部内容,希望文章能够帮你解决CORDIC逼近算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。