zoukankan      html  css  js  c++  java
  • 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。在角度的时候有一定的误差。如果要增加精度,就增加迭代的次数。

  • 相关阅读:
    php出现“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误的一种情况,及解决方法
    nginx配置:支持phpfastcgi,nginx和phpcgi通信,部分nginx常量解释
    一步步构建大型网站架构(转/收藏)
    PHP中$_REQUEST中包含的数据,数据被覆盖问题
    使用linux时碰到的两个问题
    小谈字节序
    备忘录(1)
    [c#]如何编写需要授权才能使用的WebService?
    [XML]XPath小记
    [Misc]如何得知系统存在哪几个COM口?
  • 原文地址:https://www.cnblogs.com/cornhill/p/4098123.html
Copyright © 2011-2022 走看看