關於cordic的算法原理核心思想就是規定好旋轉角度,然后通過不停迭代逐步逼近的思想來實現數學求解,網上關於這部分的資料非常多,主要可以參考:
1)https://blog.csdn.net/qq_39210023/article/details/77456031
2)https://blog.csdn.net/rookiew/article/details/74967394
Xinlinx自帶的官方說明文檔也非常值得參考,文章末尾會補充相關參考資料。
1、cordic的優化算法:
1)
2)第一次旋轉,
為旋轉方向
3)第二次旋轉,
為旋轉方向
式子一直都會有和
,每次都可以提取
。雖然FPGA無法計算,但
,因此可以執行和
效果相同的移位操作
來取代
。對於
,可以預先全部提取出來,然后等待迭代結束之后,再把因為簡化計算過程抽出的
還原回去即可。
2、公式總結:
提取,2-i等效替換成
1)
2)
3)
迭代過程:
i從0開始迭代,假設當時,
趨向於0(i從0至n-1),得到點
,此時點
就近似等於之前假設的點
,此時將之前抽出的
還原回去。
進一步將式子轉化,可得
注意:,
的極值為1,因此當i的次數很大,
的值趨於一個常數。
3、求解sina,cosa的起點取值問題
設起點(x0,y0),當i = n-1時,迭代結束,到達終點(xn, yn), 因為中間用了偽旋轉,所以結果必須要乘以為了簡化計算過程抽出的,因此有
觀察上面的式子,我們的目標是根據迭代后的xn、yn求出sina,cosa,因此可設
可將(1)化簡得到
上式中的xn,yn是經過迭代后的結果,而不是之前一開始假設的點(xn,yn),要注意區分這一點。因此,我們可以觀察到,最后正余弦的求解僅僅是以初始點的設置以及的值有關,
可以預先通過matlab求解預存起來,一般經過16次的迭代后就逐漸趨於穩定。
下一篇,我會接着來講用FPGA來實現這個Cordic算法。