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

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

一。仿真波形

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

二。代码下载

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

信号说明:

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

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

三。推荐知识参考

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

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

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

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

 

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

 

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


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

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

(2)反方向推导过程

如上图所示,在单位圆中,假设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 (θ)。


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

 

原文地址:https://www.cnblogs.com/cofin/p/9188629.html