转发博文背景:

在项目中用到了下面的知识:数据都是R+jI 的复数形式,首先要用CORDIC算法将数据转换成Ae^(jωt+φ) 形式。一句话就引出了一个知识点,这篇博文来总结这种功能的CORDIC算法。

向量模式的Cordic算法虽然解决的是从直角坐标到极坐标的转换,但是和上述需求不谋而合。

前人栽树,后人乘凉。这里仍然借鉴好的博文。

博文地址:https://www.cnblogs.com/rouwawa/p/7101703.html


有了上篇博文的基础,看这篇博文就容易多了:CORDIC算法——圆周系统之旋转模式

旋转模式用来解决三角函数,实现极坐标到直角坐标的转换。那么,向量模式则用来解决反三角函数的问题,体现的应用主要是直角坐标向极坐标转换,即已知一点的直角坐标(x,y),求其极坐标(α,γ),实际上是求arctan(y/x)。

旋转模式下,每次迭代使z趋近于α(α-z趋近于0),而向量模式下,则使y趋近于0,这一点很好理解,即从坐标位置,旋转到x正半轴,一共旋转了多少角度,则该角度即为α,从而知道了极角。

如图所示,在单位圆上,向量OP与X轴的正半轴夹角为α,故P点的坐标可表示为

根据开头描述,我们需要转动向量OP,先顺时针旋转θ角至向量OQ,Q点的坐标可表示为

这里定义θ为目标旋转角度。根据三角函数公式可将上式展开为

现在已经有点 Cordic 算法的样子了,但是我们看到每次旋转都要计算 4 次浮点数的乘法运算,运算量还是太大了。还需要进一步的改进,改进的切入点当然还是坐标变换的过程。

将式(1.1)代入到式(1.3)中可得

用矩阵形式表示为:

旋转了i次以后,可以得到:

最终需将y_Q_i+1转为0,先按45°的二分法查找来解释过程,用C语言描述过程为:

#include <stdio.h>
#include <stdlib.h>double cordic_v(double x, double y);int main(viod)
{double alfa = cordic_v(120.0,200.0);        //直角坐标(x,y)printf("\n 极角为 = %f \n",alfa);return 0;
}
double cordic_v(double x, double y)
{const double sine[] = {0.7071067811865,0.3826834323651,0.1950903220161,0.09801714032956,0.04906767432742,0.02454122852291,0.01227153828572,0.006135884649154,0.003067956762966,0.001533980186285,7.669903187427045e-4,3.834951875713956e-4,1.917475973107033e-4,9.587379909597735e-5,4.793689960306688e-5,2.396844980841822e-5};const double cosine[] = {0.7071067811865,0.9238795325113,0.9807852804032,0.9951847266722,0.9987954562052,0.9996988186962,0.9999247018391,0.9999811752826,0.9999952938096,0.9999988234517,0.9999997058629,0.9999999264657,0.9999999816164,0.9999999954041,0.999999998851,0.9999999997128};int i = 0;double x_new, y_new;double angleSum = 0.0;double angle = 45.0;        //第一次旋转角度为45°for( i=0; i<15;i++){if(y > 0){x_new = x * cosine[i] + y * sine[i];y_new = y * cosine[i] - x * sine[i];x = x_new;y = y_new;angleSum += angle;}else{x_new = x * cosine[i] - y * sine[i];y_new = y * cosine[i] + x * sine[i];x = x_new;y = y_new;angleSum -= angle;}printf("旋转次数: i = %2d 旋转角度 = %10f, 累计旋转角度 = %10f\n", i+1, angle,angleSum );angle /= 2;}return angleSum;
}

经过旋转模式的推导,向量模式的伪旋转公式,可表示为

C语言描述过程,如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>double cordic_v(double x, double y);
double r = 0.0; //定义一个模长全局变量        int main(viod)
{double alfa = cordic_v(120.0,200.0);        //直角坐标(x,y)printf("\n极角 = %5f, 模长 = %5f\n",alfa,r);return 0;
}
double cordic_v(double x, double y)
{const double theta[] = { 45.0, 26.56505118, 14.03624347, 7.125016349, 3.576334375, 1.789910608, 0.8951737102, 0.4476141709, 0.2238105004, 0.1119056771, 0.05595289189, 0.02797645262, 0.01398822714, 0.006994113675, 0.003497056851, 0.001748528427}; //旋转角度int i = 0;double x_new, y_new;double angleSum = 0.0;r = sqrt(x*x+y*y);for( i=0; i<16;i++){if(y > 0){x_new = x + y/(1<<i);y_new = y - x/(1<<i);x = x_new;y = y_new;angleSum += theta[i];}else{x_new = x - y/(1<<i);y_new = y + x/(1<<i);x = x_new;y = y_new;angleSum -= theta[i];}printf("旋转次数: i = %2d 旋转角度 = %10f, 累计旋转角度 = %10f, y = %5f\n", i+1,theta[i],angleSum,y );}return angleSum;
}

同样,向量模式的cordic算法适用于第一、四象限的坐标变换,在第二、三象限的坐标需要进行预处理。

Cordic算法——圆周系统之向量模式相关推荐

  1. CORDIC算法——圆周系统之旋转模式

    CORDIC(Coordinate Rotation Digital Computer) 算法,这个算法只利用移位和加减运算,就能计算常用三角函数值,如Sin,Cos,Sinh,Cosh等函数. 历史 ...

  2. CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode )

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Pieces_thinking/arti ...

  3. Cordic算法——verilog实现

    转载自:https://www.cnblogs.com/rouwawa/p/7102173.html 上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分 ...

  4. CORDIC算法详解(五)-统一的 CORDIC 算法形式

    CORDIC算法详解(五)- 统一的 CORDIC 算法形式 文章目录 CORDIC算法详解(五)- 统一的 CORDIC 算法形式 5 统一的 CORDIC 算法形式 相关参考资料及源码   网上有 ...

  5. HLS / Chisel 实现CORDIC算法双曲系统

    CORDIC(坐标旋转数字算法)是一种计算三角.双曲和其他数学函数的有效方法.它是一种数字算法,每次运算均产生一次结果输出.这使我们能够根据应用需求调整算法精度:增加运算迭代次数可以得到更精确的结果. ...

  6. HLS / Chisel 实现CORDIC算法高性能复数除法

    CORDIC(坐标旋转数字算法)是一种计算三角.双曲和其他数学函数的数字算法,每次运算均产生一次结果输出.这使我们能够根据应用需求调整算法精度:增加运算迭代次数可以得到更精确的结果.CORDIC 是只 ...

  7. HLS / Chisel 利用CORDIC双曲系统实现平方根计算

    CORDIC(坐标旋转数字算法)是一种计算三角.双曲和其他数学函数的数字算法,每次运算均产生一次结果输出.这使我们能够根据应用需求调整算法精度:增加运算迭代次数可以得到更精确的结果.CORDIC 是只 ...

  8. CORDIC算法FPGA的实现

    基于CORDIC算法FPGA的实现 CORDIC算法原理利用简单的移位就实现,主要用于三角函数.双曲线.指数.对数的计算,在以二进制操作为基础的FPGA硬件中就显得尤为重要.虽然现在的fpga有了集成 ...

  9. 在fpga中用Cordic算法来产生正弦函数

    在fpga中实现正弦函数可有三种基本方法,Cordic法和查找表法和线性插值法,三种方法各有其优劣性,今天就使用Cordic算法来产生正弦函数 CORDIC ( Coordinate Rotation ...

最新文章

  1. vim复制内容到系统剪贴板
  2. 编译安卓的一些知识点
  3. 通过显示当前 python 程序占用的内存大小来比较生成器和迭代器(转载)
  4. Unity项目代码书写规范
  5. const成员函数重载
  6. gc java root_深入理解Java中的Garbage Collection
  7. 前端 domparser未定义怎么解决_开源|wwto:小程序跨端迁移解决方案——微信转其他小程序...
  8. linux文件系统F2FS,文件系统F2FS也将造福SSD
  9. java实现根据身份证计算年龄的两种方式
  10. 年薪百万不如狗?深圳的程序员才是买房界的黑天鹅!
  11. 理工附中2021年高考成绩查询,人大附中、理工附中、101中学、十二中等5区10校高考成绩汇总!...
  12. centos7网卡问题
  13. 机械键盘轴的小知识详解
  14. MySQL之二进制日志
  15. Android定位方式和测试方法,定位方式(d16)
  16. USACO Section 1.1 Broken Necklace
  17. iOS10 使用openURL打开其他应用
  18. java打印等腰三角形
  19. 利用类权重来改善类别不平衡
  20. opencv快速入门人脸检测与人脸识别

热门文章

  1. mysql server 5.6使用_关于MySQLServer5.6配置问题
  2. r语言ggplot怎么把多个维度数据合并在一个图中表示_R语言作图——Histogram
  3. 棉花糖主机送mysql_mysql操作
  4. 图解法求最优解的例题_【第四章 最优化理论】4.2 带约束最优化
  5. 大学计算机课英语心得体会,关于计算机网络辅助大学英语教学的思考学习心得...
  6. 索引名 oracle,ORACLE 索引名称矫情
  7. 支持的网卡列表_Windows 10的5G网卡折腾笔记(含采购链接)
  8. 基于PI Pico一些基础实验
  9. 灵动MM32 MCU助力全国大学生智能汽车竞赛
  10. mybatis trim标签_MyBatis学习笔记