用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 (θ)。


五。程序解釋(后續更新)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM