用cordic 算法产生正/余弦波形

摘要:
仿真波形如上所示,dout_Sin和dout_Cos以补码的形式输出三角函数的值,其中使用dout _ vld表示信号的有效性,其中正弦余弦频率与clk相关。这里,360个连续clk是对应的角度0-359,并且周期是360*clk。dout_Sin和dout_Cos是输出三角函数值,dout_Vld用于指示dout_Sin和dout_Cos的有效性。至于对cordic算法的个人理解,我们使用了接近方法,如下图所示:在单位圆中,假设P2向P1旋转某个角度,如上所示,如果我们每次移动某个角度怎么办?

引言:本文旨在通过该算法产生正余弦波形(不使用IP核)。欢迎大家一起交流,Q群:912014800。

一。仿真波形

用cordic 算法产生正/余弦波形第1张

   如上所示,dout_sin 和dout_cos 通过补码形式输出三角函数的值,其中使用dout_vld指示信号的有效性,其中正余弦频率与clk有关系,这里360个连续clk为对应角度0 - 359,周期为360 * clk。

二。代码下载

 点我下载,然后自己加入到modelsim中就可以仿真了(具体方法略。。)。

信号说明:

用cordic 算法产生正/余弦波形第2张

如上所示,只要给din_vld 和din即可,din的范围是0 - 359,din_vld用来指示din的有效性。

dout_sin 和 dout_cos 是输出的三角函数值,dout_vld 用来指示dout_sin和dout_cos的有效性。

三。推荐知识参考

参考资料,请先看下这份资料,或者查阅相关资料做个铺垫。

四。关于cordic算法的个人理解

(1)这里我们采用逼近的手段,如下图:

用cordic 算法产生正/余弦波形第3张

在单位圆中,假设P2旋转一定的角度到P1点,则如上所示,那如果我们每次都移动一定的角度呢?则会和下图类似:

 

用cordic 算法产生正/余弦波形第4张

结论:当旋转多次后(注:旋转的角度有顺时针和逆时针两个方向),最终将会接近X轴,xn -> 1,yn - >0。

 

在上图中,我们可以令每次移动的角度满足一定的规律,这里我们可以这样做,令tan(α) = 2 - i(2的 - i次方),旋转的角度可以通过电脑的计算器算出一系列的 α 值,而2-i可以通过一系列的右移操作得到,便于在fpga实现。


接下里引用一幅截图,该图片指示了重复这个过程16次的部分结果,如下:

用cordic 算法产生正/余弦波形第5张

从图中,可以看到 θi 是每次移动的角度,cos θ是每次对应的余弦值,∏cos θi是累乘的结果,最后是1/∏cos θi的结果。当经过16次移动后,cos 的值已经非常趋近于1 ,说明经过16次移动后,已经非常接近X轴了。

(2)反方向推导过程

用cordic 算法产生正/余弦波形第6张

如上图所示,在单位圆中,假设P1点旋转 θ 到P2,P2旋转θ2到P3。

这里令P1的X坐标为x1,Y坐标y1,P2同理。则可以得到以下式子(这里仅针对顺时针,逆时针[如P2旋转一定角度到P1]可自行推导):

P1: x1 = cos (α)
     y1 =  sin (α)
P2:x2  = cos(θ + α) = cos(θ) * cos(α) - sin (θ) * sin(α)  = x1*cos(θ) - y1*sin(θ) = cos(θ) * (x1 - y1*tan(θ) )=cos(θ) * x2'
    y2  = sin(θ + α) = sin(θ) * cos(α) + sin(α)  * cos(θ)  = x1*sin(θ) + cos(θ)*y1 = cos(θ) * (y1 + x1*tan(θ) )=cos(θ) * y2'

P3(令β = θ + α,且x2 = cos(β),y2 = sin(β) ):

    x3 = cos(β + θ2) = cos(β) * cos(θ2) - sin (β) * sin(θ2)  = x2*cos(θ2) - y2*sin(θ2) = cos(θ2) * (x2 - y2*tan(θ2) )

       = cos(θ) * cos(θ2) * (x2' - y2'*tan(θ2)) = cos(θ) * cos(θ2) * x3'

    y3 = sin(β + θ2) = sin(β) * cos(θ2) + sin(θ2) * cos(β)   = y2*cos(θ2) + sin(θ2)*x2 = cos(θ2) * (y2 + x2*tan(θ2) )

       = cos(θ) * cos(θ2) * (y2' + x2'*tan(θ2)) = cos(θ) * cos(θ2) * y3'

 ......

根据规律可以得到如下的公式:

1)假设经过一次旋转后得到xn和yn(引用上式的红色部分公式),则:

xn  = x1*cos(θ) - y1*sin(θ)

yn  = x1*sin(θ) + cos(θ)*y1


2)假设经过很多次旋转后,得到近似的xn''和yn''(应用上式的蓝色部分公式),则:

∏cosθi * xn' = xn'' 
∏cosθi * yn' = yn''

3)当经过16次后,(xn''和y'')已经和(xn和yn)非常接近了,若忽略误差,这里令xn'' = xn,yn'' = yn,则可以得到如下的式子:

xn'  = 1/∏cosαi * ( x1*cos(θ) - y1*sin(θ) ) 

yn'  = 1/∏cosαi( y1* cos(θ) +sin(θ) *x1 ) 

 

现在假设我们从x轴旋转得到我们要得到的坐标,则上述公式中,x1 = ∏cosαi , y1 = 0; 则经过一定次数(16次)旋转后, xn' = cos (θ) , yn' = sin (θ)。


五。程序解释(后续更新)

 

免责声明:文章转载自《用cordic 算法产生正/余弦波形》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springboot+mybatis+druid+sqlite/mysql/oraclemaven中总是生成lastUpdate文件的原因下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenCV实现图像变换(python)-仿射变换原理

一般对图像的变化操作有放大、缩小、旋转等,统称为几何变换,对一个图像的图像变换主要有两大步骤,一是实现空间坐标的转换,就是使图像从初始位置到终止位置的移动。二是使用一个插值的算法完成输出图像的每个像素的灰度值。其中主要的图像变换有:仿射变换、投影变换、极坐标变换。 仿射变换## 二维空间坐标的仿射变换公式: [left( egin{matrix} ove...

windows命令行下批量拷贝同一后缀的文件到另外一个目录

一个目录下有很多文件夹,想拷贝每个文件夹下面的wmv文件到另外一个目录,如果鼠标打开一个文件,拷贝一个,再打开其他的,逐一操作,很麻烦的,百度了一下,xcopy命令就可以实现:例如将C盘x1目录下所有的.wmv格式的文件拷贝到d盘x2目录:xcopyc:x1*.wmv/sd:x2以上命令会将x1下的子目录也拷贝到x2下如果只想拷贝文件不需要x1下的目录,可...

各种图示的介绍及绘制(boxplot、stem)

1. 箱线图(boxplot) 也叫作箱形图; 一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。 主要包含六个数据节点,将一组数据从大到小排列,分别计算出它的: 上边缘, 上四分位数Q3, 中位数, 下四分位数Q1, 下边缘, 还有一个异常值。 2. stem:茎叶图(刻画序列) clear,...

mif文件生成方法

mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据。常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语言生成 前两种方法都有一定的缺陷,主要介绍第三种方法,按照mif文件格式,使用高级编程语言(Matlab、C)编写生成。 注意: mif文件都是ASCⅡ码...

[转]对齐次坐标的理解

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”——F.S. Hill, JR。 齐次坐标主要是应用在矩阵转换中,我们通常运算的坐标系是“笛卡尔坐标系”,我们已经习惯了笛卡尔坐标系的表述方式,一个点都有唯一对应的数据值来表示,比如原点我们就记做(0,0)点。而笛卡尔坐标系和齐次坐标系的根...

地理空间距离计算及优化(依据两个点经纬度计算距离)

1.地理空间距离计算面临的挑战 打开美团app。无论是筛选团购还是筛选商家,默认的排序项都是“离我近期”或者“智能排序”(例如以下图所看到的)。 无论是“离我近期”还是“智能排序”。都涉及到计算用户位置与各个团购单子或者商家的距离(注:在智能排序中距离作为一个重要的參数參与排序打分)。以筛选商家为例。北京地区有5~6w个POI(本文将商家称之为POI)...