FPGA-CORDIC算法專題-00-認識CORDIC算法

寫在前面

這個系列將會更很久吧,本文是該系列的開篇,主要參考的文章是黑金系列的FPGA STORY–CORDIC,黑金的論壇貌似喫灰好久了,教程感覺條理性挺好,就分享給大家吧,讀書筆記和個人總結,希望對大家有幫助。

CORDIC是什麼?

CORDIC(Coordinate Rotation Digital Computer)算法即座標旋轉數字計算方法,是J.D.Volder1於1959年首次提出,主要用於三角函數、雙曲線、指數、對數的計算。該算法通過基本的加和移位運算代替乘法運算,使得矢量的旋轉和定向的計算不再需要三角函數、乘法、開方、反三角、指數等函數。

我們知道描述語言缺乏數學的天賦,故數學函數可能是一處死穴,而且數學還令人聯想到噁心的浮點數,再者描述語言也不支持浮點數,更不用想象旁邊有一座浮點數的數學庫。在此,我們必須感嘆命運的偉大,讓我們獲取一件數學工具,它與硬件不謀而合,它和 FPGA 臭味相投,它和描述語言更是天生一對!

這裏黑金的教程說的很生動,確實在FPGA中,是不同擅長複雜的數學計算的,(我理解的不擅長只是形式複雜,實現比較麻煩,而不是本身沒有MCU實現運算的效率高)因爲FPGA不支持浮點數,所以很多操作就受到了限制,而在cordic的幫助下,FPGA可以熟練實現各種比較複雜的數學計算。這正是和硬件描述下一直缺少的部分是互補的。

12345.12345 // 定點數
1.234512345 x 10 4 or 12.34512345 x 10 3 // 浮點數

數學上,定點數是實數,浮點數也是實數,兩者只有表達方式不同而已。定點數的小數點被鎖死,浮點數的小數點則可以移動,這也表示後者擁有更大的計數範圍。
CORIDC 算法自定義很強,我們完全可以按照自己的意思去調配它,甚至可以去到斤斤計較的程度。它伸縮自如,變換莫測,簡直就是神器 …

CORDIC知識掃盲

這裏參考黑金的解釋:

在這裏插入圖片描述

假設矢量 V0 向矢量 V1 移動θ幅度,正常情況下的矢量會沿着圓形的軌
跡進行移動,這種情況我們稱爲旋轉(Rotation)。相對之下,CORDIC 算法的情況比較特別,假設矢量 V0 向矢量 V1’移動θ幅度,故它不會是沿着圓形軌跡移動,而是按照僞旋轉(Pseu Do Rotation)的方式進行。

當然,僞旋轉也不是隨心所欲想去哪裏就去哪裏,它必須遵守自己的變換規則。那麼,什麼是變換規則?這個問題就要涉及 CORDIC 算法的公式了。
在這裏插入圖片描述
假設源矢量 Vn 嘗試逼近目標矢量 V4,對此它有 3 種視角解讀。左圖顯示,這是旋轉角度的視角,矢量每旋轉一次角度就減小一些,如果讀者覺得角度很難理解,我們可以把它視爲距離,然後再看中圖更容易理解了。中圖顯示,旋轉角度被視爲移動距離,大致過程如下:

(一)Vn 移動至 V0 是 1/2 的距離。
(二)V0 移動至 V1 是 1/4 的距離。
(三)V1 移動至 V2 是 1/8 的距離。
(四)V2 移動至 V3 是 1/16 的距離。
(五)V3 移動至 V4 是 1/32 的距離

結果而言,源矢量每一次向目標矢量逼近,下一次的距離是上一次的一半。另外,這幅圖也告訴我們矢量存在旋轉方向。假設以矢量 V4 的紅線爲參考系,那麼其它矢量的表現如下:

(一)Vn 在移動之前,它在目標矢量的下面,所以它向上移動成爲 V0。
(二)V0 在移動之前,它在目標矢量的上面,所以它向下移動成爲 V1。
(三)V1 在移動之前,它在目標矢量的下面,所以它向上移動成爲 V2。
(四)V2 在移動之前,它在目標矢量的上面,所以它向下移動成爲 V3。
(五)V3 在移動之前,它在目標矢量的上面,所以它向下移動成爲 V4。

理論上,矢量的旋轉方向是有一個判斷基準,上面雖然是矢量 V4。但是在算法裏面,這個基準會根據模式而有所改變,具體內容請容許筆者放在後面再解釋。最後,右圖顯示,源矢量每次向目標矢量逼近,它的長度會越來越接近目標矢量。總結而言,圖 1.2告訴我們:

五個核心

(一)矢量移動的距離(角度)
(二)矢量移動的次數(精度)
(三)矢量移動的規則(公式)
(四)矢量移動的方向(加減)
(五)矢量最終的長度(結果)

CORDIC 算法是一種統稱,規則和模式可以千變萬化,但原理都離不開以上 5 個核心。理論上,矢量只要擁有足夠的移動次數,它就會越來越接近目標,而且距離也會越來越短。矢量一旦停止移動,它的最終長度也代表最終結果,如果移動次數足夠,那麼結果的精度也會越高。

源矢量究竟要移動多少次纔會停止

這裏有兩個控制選項:

  • 矢量達到預設的移動次數。
  • 源矢量與目標矢量的距離。

一般上,移動次數可以人爲,所以 CORDIC 算法可以隨意控制它的精度與速度。換句話說,要精度就拉長移動次數,要速度則是縮短移動次數。相對之下,CORDIC 算法在執行中有一個參數會撲向 0 值,這個參數表示源矢量與目標矢量之間的距離,它越接近零值結果越是收斂成熟。

兩個模式:

  1. 矢量模式(Vectoring Mode)
  2. 旋轉模式(Rotation Mode)

在旋轉模式下,矢量的旋轉方向由角度決定,
在矢量模式下,矢量的旋轉方向則由座標決定。

三個系統

(一)線性函數(Linear Method)
(二)三角函數(Circular/Trigonometric Method)
(三)雙曲函數(Hyberbolic Method)

線性函數,三角函數(圓函數)以及雙曲函數都是現代數學的支柱,CORDIC 算法的任務就是實現它們。細分之下,這些函數還有許多的成員。

/*** 線性函數 ***/

a*b,a/b // 乘法,除法


/*** 三角函數 ***/

cos()sin()tan() // 三角函數
arccos()arcsin()atan()/arctan() // 反三角函數


/*** 雙曲函數 ***/

cosh()sinh()tanh() // 雙曲函數
arccosh()arcsinh()arctanh() // 反雙曲函數
e x ,ln(x) // 自然字數,自然對數
√a, // 平方根
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章