CORDIC算法的来历与用途大家网上随处可以见到,这里写 一下自己的理解。

将P(x,y)旋转角度a得到新的坐标P’(x’,y’)。这里的坐标变换为:

x’= x cos(a) – y sin(a)  = cos(a)(x-y *tan(a))

y’= y cos(a) + xsin(a) = cos(a)(y+x*tan(a))

旋转角度a为常数时,如果tan(a)=2-i ,即可用移位代替乘法便于快速高效在FPGA中实现。每次都旋转固定角度delta, 则cos(delta)=cos(arctan(2-i)).

从而得到简便计算如下:atan(2^-i)的结果是预先计算好存储下来了

K­i=cos(arctan(2-i))

X­i+1­­­ =k­i ­[x­i ­– y­i x di x 2-i]

Y­i+1 ­=K­i ­[y­I + X­I x d­ix 2-i]

CORDIC有两种模式

1 rotation模式 每次旋转Z一个角度 直到等于要求的角度 即从极坐标变换到直角坐标

2 vectoring 模式 。旋转使与x轴对齐 y=0时得到的z值即所要旋转的角度,由直角坐标到极坐标的变换

CORDIC算法实现极坐标(polar)到直角坐标系(Cartesian)的变换。

   1:  function [horizonal,vertical]=polar2car(mag, pha);
   2:  x =mag;   %令变量x等于极坐标的幅度,在直角坐标中y分量等于零,使其旋转角度pha,得到的分量即是得到在
   3:  y =0;     %直角坐标系里的坐标
   4:  z=pha;
   5:  d=0;
   6:  i=0;
   7:  k = 0.6073; %K 增益
   8:  x = k*x;
   9:  while i<50
  10:      if z<0 d =-1;
  11:      else d = 1;
  12:      end
  13:      xNew=x-y*d*(2^(-i));
  14:      y=y+x*d*(2^(-i));
  15:      z=z-d*atan(1/2^(i));
  16:      i=i+1;
  17:       
  18:       
  19:      x=xNew;
  20:  end
  21:  horizonal = x;
  22:  vertical = y;

CORDIC算法实现直角坐标到极坐标系的变换。

function [mag, pha]= car2polar(x,y);

%y =0;
%将直角坐标系中的点(x,y)旋转到x轴,旋转的角度即为其极坐标的相位,在x轴的长度等于极坐标的幅度
d=0; %可用于求相位,幅度
i=0;
z=0;
k = 0.6073; %K 增益 while i<50
if y<0 d = 1;
else d = -1;
end
xNew=x-y*d*(2^(-i));
y=y+x*d*(2^(-i));
z=z-d*atan(1/2^(i));
i=i+1; x=xNew;
end
x = x*k;
mag=x;
pha=z;

验证:

[a,b]= polar2car( 1,pi/3)

a =

0.5000

b =

0.8661

[a,b]=  car2polar( 0.5000, 0.8661)

a =

1.0001

b =

1.0472

计算正切值atan只需将直角坐标变换为极坐标的程序中取出最后的角度值,即可得到反正切值。
function [ pha]= cordic_arcsin(c);

%y =0;
%将点(1,0)旋转至其纵坐标=c,旋转的角度为角度 求反余弦也是同样道理
d=0;
i=0;
z=0;
x=1;
y=0;
k = 0.6073; %K 增益
xNew = x* k;
while i<100
if y<=c d = 1;
else d = -1;
end
x =xNew-y*d*(2^(-i));
y=y+xNew*d*(2^(-i));
z=z+d*atan(1/2^(i));
i=i+1; xNew=x;
end %mag=x;
pha=z;

function [pha]= cordic_arccos(c);

%y =0;
d=0;
i=0;
z=0;
x=1;
y=0;
k = 0.6073; %K 增益
xNew = x* k;
while i<100
if x>=c d = 1;
else d = -1;
end
x =xNew-y*d*(2^(-i));
y=y+xNew*d*(2^(-i));
z=z+d*atan(1/2^(i));
i=i+1; xNew=x;
end %mag=x;
pha=z;
function [  pha]= cordic_arctan(x,y);

%y =0;
%将点(x,y)旋转到x轴所需要的角度
d=0;
i=0;
z=0;
k = 0.6073; %K 增益
x = x*k;
while i<50
if y<0 d = 1;
else d = -1;
end
xNew=x-y*d*(2^(-i));
y=y+x*d*(2^(-i));
z=z-d*atan(1/2^(i));
i=i+1; x=xNew;
end %mag=x;
pha=z;
function [sine,cosine] = cordic_sine(angle);
% Initialitation
%%angle=30 ;
x = 1;
y = 0;
z = angle;
d = 1; i = 0; % Iterative factor
k = 0.6073; %K Factor
xNew = k*x;
while i < 50
if z <=0 d =-1;
else d = 1;
end
x= xNew -d*y*2^(-i);
y=y+d*xNew*2^(-i);
z=z-d*atan(2^(-i));
i=i+1;
xNew=x;
end
cosine = x
sine = y



CORDIC原理与FPGA实现(1)的更多相关文章

  1. CORDIC原理与FPGA实现(2)

    CORDIC算法实现极坐标(polar)到直角坐标系(Cartesian)的变换. 1: function [horizonal,vertical]=polar2car(mag, pha); 2: x ...

  2. 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:无 3.仿真工具:无 硬件平台: 1. FPGA型号:无 2. DDR3型号:无 二. 存储器的分类 存储器一 ...

  3. cordic算法的fpga实现

    cordic算法参考:http://wenku.baidu.com/view/6c623aa8910ef12d2bf9e732.html 这是百度文库的一个文档,详细介绍了cordic算法的基本内容. ...

  4. 学习cordic算法所得(流水线结构、Verilog标准)

    最近学习cordic算法,并利用FPGA实现,在整个学习过程中,对cordic算法原理.FPGA中流水线设计.Verilog标准有了更加深刻的理解. 首先,cordic算法的基本思想是通过一系列固定的 ...

  5. CORDIC算法(1):圆周旋转模式下计算三角函数和模值

    CORDIC(Coordinate Rotation Digital Computer)坐标旋转数字计算机,是数学与计算机技术交叉产生的一种机器算法,用于解决计算机的数学计算问题.发展到现在,CORD ...

  6. FPGA入门1

    FPGA入门知识介绍    近几年来,由于现场可编程门阵列(FPGA)的使用非常灵活,又可以无限次的编程,已受到越来越多的电子编程者的喜爱,很多朋友都想学习一些FPGA入门知识准备进行这个行业,现在关 ...

  7. 【接口时序】5、QSPI Flash的原理与QSPI时序的Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 4.Matlab版本:Matlab2014b/ ...

  8. 学习FPGA需要做哪些

    有些人比较差,做了一些介绍,有误导成分.有些人水平太高,介绍的很好,但是很多人依旧听不懂,得到的肯定很少.学习FPGA,在不同层次的人明显有不同的答案. 熟悉硬件描述语言语法,不需要什么都会,但是要记 ...

  9. Xilinx 常用模块汇总(verilog)【01】

    作者:桂. 时间:2018-05-07  19:11:23 链接:http://www.cnblogs.com/xingshansi/p/9004492.html 前言 该文私用,不定期更新,主要汇总 ...

随机推荐

  1. webservice 原理

    webservice 原理1.soap协议,其实就是用http协议来传输xml格式的数据,可以post,get.一般有post.2.服务端有:本地程序代码(也不是dll)和xml格式的文件用来描述dl ...

  2. 【图解】Eclipse下JRebel6.2.0热部署插件安装、破解及配置【转】

    标签: 这两天在做后台管理系统,前端框架用Bootstrap,后端用SpringMVC+Velocity.在开发过程中,经常需要对界面进行微调,调整传参等,每次更改一次java代码,就得重新部署一次, ...

  3. galera cluster各种问题专贴

    dbforge在galera cluster下debug存储过程hang... 经查看process list,dbforge cr_debug引擎使用了use_lock()函数,而galera cl ...

  4. handler机制的原理(转)

      Handler概述   andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageEx ...

  5. CSS之浮动那些事

    1.清除浮动 下面是两种常用的方式,而这两招也够用了(不用千招会,只需一招精). 1.结尾处加空div标签 clear:both <style type="text/css" ...

  6. javascript --- 只继承于原型

    正如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去. 如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了. 毕竟采用new her()方法将her的 ...

  7. SharePoint 2010: Nailing the error "The Security Token Service is unavailable"

    http://blogs.technet.com/b/sykhad-msft/archive/2012/02/25/sharepoint-2010-nailing-the-error-quot-the ...

  8. 安装sql server managerment studio报错"The instance id is required but it is missing"

    问题描述: 今天在安装sql server managerment studio的时候提示报错"The instance id is required but it is missing&q ...

  9. 安卓第十天笔记-fragment

    安卓第十天笔记-fragment Fragment(片段) 一.Fragment简介 *Fragment是3.0引入的API,主要为了解决平板,大屏幕手机显示问题 *Fragment代表了Activi ...

  10. andorid开发eclipse常见问题

    1.报错: BUILD FAILED D:\workspace\ganji\build.xml:144: The following error occurred while executing th ...