CORDIC原理与FPGA实现(1)
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)的结果是预先计算好存储下来了
Ki=cos(arctan(2-i))
Xi+1 =ki [xi – yi x di x 2-i]
Yi+1 =Ki [yI + XI x dix 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)的更多相关文章
- CORDIC原理与FPGA实现(2)
CORDIC算法实现极坐标(polar)到直角坐标系(Cartesian)的变换. 1: function [horizonal,vertical]=polar2car(mag, pha); 2: x ...
- 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:无 3.仿真工具:无 硬件平台: 1. FPGA型号:无 2. DDR3型号:无 二. 存储器的分类 存储器一 ...
- cordic算法的fpga实现
cordic算法参考:http://wenku.baidu.com/view/6c623aa8910ef12d2bf9e732.html 这是百度文库的一个文档,详细介绍了cordic算法的基本内容. ...
- 学习cordic算法所得(流水线结构、Verilog标准)
最近学习cordic算法,并利用FPGA实现,在整个学习过程中,对cordic算法原理.FPGA中流水线设计.Verilog标准有了更加深刻的理解. 首先,cordic算法的基本思想是通过一系列固定的 ...
- CORDIC算法(1):圆周旋转模式下计算三角函数和模值
CORDIC(Coordinate Rotation Digital Computer)坐标旋转数字计算机,是数学与计算机技术交叉产生的一种机器算法,用于解决计算机的数学计算问题.发展到现在,CORD ...
- FPGA入门1
FPGA入门知识介绍 近几年来,由于现场可编程门阵列(FPGA)的使用非常灵活,又可以无限次的编程,已受到越来越多的电子编程者的喜爱,很多朋友都想学习一些FPGA入门知识准备进行这个行业,现在关 ...
- 【接口时序】5、QSPI Flash的原理与QSPI时序的Verilog实现
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 4.Matlab版本:Matlab2014b/ ...
- 学习FPGA需要做哪些
有些人比较差,做了一些介绍,有误导成分.有些人水平太高,介绍的很好,但是很多人依旧听不懂,得到的肯定很少.学习FPGA,在不同层次的人明显有不同的答案. 熟悉硬件描述语言语法,不需要什么都会,但是要记 ...
- Xilinx 常用模块汇总(verilog)【01】
作者:桂. 时间:2018-05-07 19:11:23 链接:http://www.cnblogs.com/xingshansi/p/9004492.html 前言 该文私用,不定期更新,主要汇总 ...
随机推荐
- 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract
[源码下载] 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 ...
- 启动Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误
启动Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误,如下 原因:eclipse的版本与jre或者jdk版本不 ...
- 线段树的区间更新---A Simple Problem with Integers
POJ 3468 Description 给出了一个序列,你需要处理如下两种询问. "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 100 ...
- 【Qt】2.4 做一个“猜数字”的游戏
使用对话框和Qt设计师来实现一个相当简单的小游戏.同时将通过这个程序来看布局的隐藏和显示是如何来影响窗口界面的变化的. 新建一个Qt项目,把Qt Creator默认给的mainwindow.h.mai ...
- 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...
- SQL Server 全局变量
SQL Server中所有全局变量都使用两个@符号作为前缀 --1.@@error 最后一个T-SQL错误的错误号(目的是或得违反约束的错误号) insert into Subject values( ...
- 对抗静态分析——运行时修复dex
对抗静态分析——运行时修复dex 本文来源:i春秋社区-分享你的技术,为安全加点温度 零.写在前面 这个系列本来题目想写对抗反编译,可是想想对抗反编译的这个范围有点大,总结如下 灵魂作图 ...
- Android 设计模式一:EIT造型
前言:首先不提造型,我们先来学习公式. 思绪回到于十七世纪中,牛顿提出了简单公式:F=ma:让人们能轻易理解物体运动的复杂<关系>. 再如,于二十世纪初,爱因斯坦发表了简单公式:E=MC平 ...
- Android中使用抖动动画吸引来用户注意
原文:http://www.androidcn.org/topic/552e65bc61d460226ab27a5c 在应用中,有时候我们要吸引用户去点击某些按钮,比如应用市场的推荐按钮,为了能够吸引 ...
- 【读书笔记】iOS-Xcode-模拟器操作的一些快捷键
Cmd+1/2/3 可以切换模拟器的显示比例. Option+Shift 可以在模拟器中调出双指拖动效果. Option 可以在模拟器中调出双指放大缩小效果. Comma ...