CORDIC逼近算法

现在开始学习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
 16 output    reg    signed [7 : 0]    r, syta
 17
 18 );
 19
 20 parameter    WIDTH = 8;
 21
 22
 23 reg    signed     [WIDTH - 1 : 0]    x0_r, x1_r, x2_r, x3_r, x4_r;
 24 reg    signed    [WIDTH - 1 : 0]    y0_r, y1_r, y2_r, y3_r, y4_r;
 25 reg    signed    [WIDTH - 1 : 0]    syta0_r, syta1_r, syta2_r, syta3_r, syta4_r;
 26
 27
 28 always @(posedge clk or negedge rst_n)    begin
 29     if(!rst_n)    begin
 30         syta0_r <= 0;
 31     end
 32     else    begin
 33     //first stage----------------------------------------------------------
 34         if(x0 >= 0)    begin        //in the first sector or forth sector
 35             x0_r <= x0;
 36             y0_r <= y0;
 37             syta0_r <= 0;
 38         end
 39         else    if(y0 >= 0)    begin    //in the second sector
 40             x0_r <= y0;
 41             y0_r <= -x0;
 42             syta0_r <= 90;
 43         end
 44         else    begin                    //in the third sector
 45             x0_r <= -y0;
 46             y0_r <= x0;
 47             syta0_r <= -90;
 48         end
 49     //second stage arctan(1)-------------------------------------------------------
 50         if(y0_r >= 0)    begin
 51             x1_r <= x0_r + y0_r;
 52             y1_r <= y0_r - x0_r;
 53             syta1_r <= syta0_r + 45;
 54         end
 55         else    begin
 56             x1_r <= x0_r - y0_r;
 57             y1_r <= y0_r + x0_r;
 58             syta1_r <= syta0_r - 45;
 59         end
 60     //third stage arctan(2)---------------------------------------------------------
 61         if(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;
 65         end
 66         else    begin
 67             x2_r <= x1_r - y1_r / 2;
 68             y2_r <= y1_r + x1_r / 2;
 69             syta2_r <= syta1_r - 26;
 70         end
 71     //forth stage arctan(4)---------------------------------------------------------
 72         if(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;
 76         end
 77         else    begin
 78             x3_r <= x2_r - y2_r / 4;
 79             y3_r <= y2_r + x2_r / 4;
 80             syta3_r <= syta2_r - 14;
 81         end
 82     //fiveth stage arctan(8)---------------------------------------------------------
 83         if(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;
 87         end
 88         else    begin
 89             x4_r <= x3_r - y3_r / 8;
 90             y4_r <= y3_r + x3_r / 8;
 91             syta4_r <= syta3_r - 7;
 92         end
 93
 94     //output
 95         r <= x4_r;
 96         syta <= syta4_r;
 97     end
 98
 99
100
101 end    //always
102 //
103
104
105
106 endmodule

仿真结果:

其中使用了三组数据:(-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。在角度的时候有一定的误差。如果要增加精度,就增加迭代的次数。

时间: 2024-11-08 04:47:34

CORDIC逼近算法的相关文章

理解逐次逼近寄存器型ADC:与其它类型ADC的架构对比【转】

转自:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=86760 摘要:逐次逼近寄存器型(SAR)模数转换器(ADC)占据着大部分的中等至高分辨率ADC市场.SAR ADC的采样速率最高可达5Msps,分辨率为8位至18位.SAR架构允许高性能.低功耗ADC采用小尺寸封装,适合对尺寸要求严格的系统. 本文说明了SAR ADC的工作原理,采用二进制搜索算法,对输入信号进行转换.本文还给出了SAR ADC的核心架构,即电容式DAC和高速比较器.

最大期望算法 Expectation Maximization概念

在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variabl).最大期望经常用在机器学习和计算机视觉的数据集聚(Data Clustering)领域. 可以有一些比较形象的比喻说法把这个算法讲清楚.比如说食堂的大师傅炒了一份菜,要等分成两份给两个人吃,显然没有必要拿来天平一点一点的精确的去称分量,最简单的办法是先随意的把菜分到两个碗中,

FPGA机器学习之机器学习的n中算法总结1

机器学习是AI领域的重要一门学科.前面我描述过,我计划从事的方向是视觉相关的机器学习分类识别,所以可能在每个算法的分析中,只加入在视频,视觉领域的作用. 我毛华望849886241.技术博客http://blog.csdn.net/my_share SA算法,Fea-G算法,DANOVA算法,SOA算法,Shooting算法.这个是从网页中,百度说他们特有的算法. Fea-G算法,DANOVA算法,SOA算法,没有任何资料. shooting算法,叫射门算法(百度和必应的结果).但是射门算法,并

EM算法[转]

最大期望算法:EM算法. 在统计计算中,最大期望算法(EM)是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量. 最大期望算法经过两个步骤交替进行计算: 第一步是计算期望(E),利用对隐藏变量的现有估计,计算其最大似然估计值: 第二步是最大化(M),最大化在E步上求得的最大似然值来计算参数的值. M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行. 总体来说,EM算法流程如下: 1.初始化分布参数 2.重复直到收敛: E步:估未知参数的

OpenCV与EmguCV中的图像轮廓提取

轮廓是图像中表示边界的一系列点的集合. 虽然边缘检测算法可以根据像素间的差异检查出轮廓边界的像素,但是它并没有把轮廓做为一个整体表示出来.所以下一步工作是把这些边缘检测出来的像素组装成轮廓. openCV中可以用findContours()函数来从二值图像中提取轮廓. openCV中一般用序列来存储轮廓信息.序列中的每一个元素是曲线中一个点的位置. 函数findContours()从二值图像中寻找轮廓.findContours()处理的图像可以是Canny()后得到的有边缘像素的的图像,也可以是

ADC类型总结

1.SAR型 (逐次逼近型) 摘要:逐次逼近寄存器型(SAR)模数转换器(ADC)占据着大部分的中等至高分辨率ADC市场.SAR ADC的采样速率最高可达5Msps,分辨率为8位至18位.SAR架构允许高性能.低功耗ADC采用小尺寸封装,适合对尺寸要求严格的系统. 本文说明了SAR ADC的工作原理,采用二进制搜索算法,对输入信号进行转换.本文还给出了SAR ADC的核心架构,即电容式DAC和高速比较器.最后,对SAR架构与流水线.闪速型以及Σ-Δ ADC进行了对比. 引言 逐次逼近寄存器型(S

Opencv图像识别从零到精通(23)----轮廓

当看到轮廓的时候,发现没有办法具体到什么, 因为关系轮廓的东西似乎有很多,例如检测轮廓,提取轮廓,轮廓跟踪,轮廓面积,周长,标记,匹配,还有一系列的外接最小矩形,圆形,椭圆,图像矩,填充孔洞等,不得不说东西真的很好. 轮廓其实最容易和边缘检测联系到一起,有很多的相同,但是我理解的是边缘是检测,是预处理,而轮廓就可能是你要用的特征. 一.函数:一个是找,一个是画 <span style="font-size:18px;">void findContours//提取轮廓,用于提

java OPENCV 连通域, Imgproc.findContours 例子,参数说明

http://stackoverflow.com/questions/29491669/real-time-paper-sheet-detection-using-opencv-in-android/29492699#29492699 at srcImg; //you may want to apply Canny or some threshold before searching for contours List<MatOfPoint> contours = new ArrayList&

OpenCASCADE Interpolations and Approximations

OpenCASCADE Interpolations and Approximations [email protected] Abstract. In modeling, it is often required to approximate or interpolate points to curves and surfaces. In interpolation, the process is complete when the curve or surface passes throug