现在开始学习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.

 //*****************************************************************************************
//
// function: achieve the coordinate rotation digital computers 5
//
//
// corn 2014.11.15
//
//
//***************************************************************************************** module cordic_module(
input clk, rst_n, input signed [ : ] x0, y0, output reg signed [ : ] r, syta ); parameter WIDTH = ; reg signed [WIDTH - : ] x0_r, x1_r, x2_r, x3_r, x4_r;
reg signed [WIDTH - : ] y0_r, y1_r, y2_r, y3_r, y4_r;
reg signed [WIDTH - : ] syta0_r, syta1_r, syta2_r, syta3_r, syta4_r; always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
syta0_r <= ;
end
else begin
//first stage----------------------------------------------------------
if(x0 >= ) begin //in the first sector or forth sector
x0_r <= x0;
y0_r <= y0;
syta0_r <= ;
end
else if(y0 >= ) begin //in the second sector
x0_r <= y0;
y0_r <= -x0;
syta0_r <= ;
end
else begin //in the third sector
x0_r <= -y0;
y0_r <= x0;
syta0_r <= -;
end
//second stage arctan(1)-------------------------------------------------------
if(y0_r >= ) begin
x1_r <= x0_r + y0_r;
y1_r <= y0_r - x0_r;
syta1_r <= syta0_r + ;
end
else begin
x1_r <= x0_r - y0_r;
y1_r <= y0_r + x0_r;
syta1_r <= syta0_r - ;
end
//third stage arctan(2)---------------------------------------------------------
if(y1_r >= ) begin
x2_r <= x1_r + y1_r / ;
y2_r <= y1_r - x1_r / ;
syta2_r <= syta1_r + ;
end
else begin
x2_r <= x1_r - y1_r / ;
y2_r <= y1_r + x1_r / ;
syta2_r <= syta1_r - ;
end
//forth stage arctan(4)---------------------------------------------------------
if(y2_r >= ) begin
x3_r <= x2_r + y2_r / ;
y3_r <= y2_r - x2_r / ;
syta3_r <= syta2_r + ;
end
else begin
x3_r <= x2_r - y2_r / ;
y3_r <= y2_r + x2_r / ;
syta3_r <= syta2_r - ;
end
//fiveth stage arctan(8)---------------------------------------------------------
if(y3_r >= ) begin
x4_r <= x3_r + y3_r / ;
y4_r <= y3_r - x3_r / ;
syta4_r <= syta3_r + ;
end
else begin
x4_r <= x3_r - y3_r / ;
y4_r <= y3_r + x3_r / ;
syta4_r <= syta3_r - ;
end //output
r <= x4_r;
syta <= syta4_r;
end end //always
// 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。在角度的时候有一定的误差。如果要增加精度,就增加迭代的次数。

CORDIC逼近算法的更多相关文章

  1. FPGA之CORDIC算法实现_理论篇(上)

    关于cordic的算法原理核心思想就是规定好旋转角度,然后通过不停迭代逐步逼近的思想来实现数学求解,网上关于这部分的资料非常多,主要可以参考: 1)https://blog.csdn.net/qq_3 ...

  2. 使用CORDIC算法求解角度正余弦及Verilog实现

    本文是用于记录在了解和学习CORDIC算法期间的收获,以供日后自己及他人参考:并且附上了使用Verilog实现CORDIC算法求解角度的正弦和余弦的代码.简单的testbench测试代码.以及在Mod ...

  3. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

  4. EM最大期望化算法

    最大期望算法(Expectation-maximization algorithm,又译期望最大化算法)在统计中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计. 在统计计算中,最 ...

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

    转自:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=86760 摘要:逐次逼近寄存器型(SAR)模数转换器(ADC)占据着大部分的中等至高分辨 ...

  6. 最大期望算法 Expectation Maximization概念

    在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Lat ...

  7. STM32 逐次逼近寄存器型(SAR)模拟数字转换器(ADC)

    是采样速率低于5Msps (每秒百万次采样)的中等至高分辨率应用的常见结构. SAR ADC的分辨率一般为8位至16位,具有低功耗.小尺寸等特点. 这些特点使该类型ADC具有很宽的应用范围,例如便携/ ...

  8. 机器学习: 共轭梯度算法(PCG)

    今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法.我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法. ...

  9. EM算法[转]

    最大期望算法:EM算法. 在统计计算中,最大期望算法(EM)是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量. 最大期望算法经过两个步骤交替进行计算: 第 ...

随机推荐

  1. TotoiseSVN的使用方法

    详细教程 https://www.jianshu.com/p/6b3b7b915332 SVN提交修改 https://jingyan.baidu.com/article/6c67b1d6f524d5 ...

  2. flowable EngineConfiguration的实现分析(2)

    EngineConfiguration的实现类是一个抽象类:AbstractEngineConfiguration 一.引擎配置的分类 继承 AbsractEngineConfiguration的子类 ...

  3. dyld: lazy symbol binding failed: Symbol not found: ___sincosf_stret

    This is the error I get: dyld: lazy symbol binding failed: Symbol not found: ___sincosf_stret Refere ...

  4. visual studio 一些小技巧 整理

    本博客将会陆续的整理一些作者在实际开发中的一些小技巧,一些挺有意思的东西,将会持续更新, 如果有问题,可以加群讨论,QQ群:592132877 #warning的使用 #warning 的意思是在程序 ...

  5. .NET c# 新特性

    <.NET之美>p181 Product item=new Product(188),{Price=4998.5F},Name="Lumia 920" 实例化,.NET ...

  6. Swift 发送邮件和发短信

    // MARK: - Action // MARK: compose mail 发送邮件 @IBAction func composeMail(sender: AnyObject) { // 判断能否 ...

  7. 体验 k8s 的核心功能

    快速体验 k8s 的核心功能:应用部署.访问.Scale Up/Down 以及滚动更新 https://yq.aliyun.com/articles/337209?spm=a2c4e.11153940 ...

  8. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  9. wpf 动态得到label的宽度(无刷新情况)

    var l =newLabel(){Content="Hello"}; l.Measure(newSize(double.PositiveInfinity,double.Posit ...

  10. CH1801 括号画家

    题意 Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号.这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号( ).中括号[ ]和大括号{ },总长度为N.这排随意绘制的括 ...