跳轉到內容

數位電路/CORDIC

來自華夏公益教科書,開放的書籍,開放的世界

一個 CORDIC (代表 **CO**ordinate **R**otation **DI**gital **C**omputer) 電路用於計算一些常見的數學函式,例如三角函式、雙曲函式、對數函式和指數函式。

CORDIC 只使用加法器和位移來計算結果,因此它可以使用相對基本的硬體實現。

像冪級數或查表法通常需要執行乘法。如果硬體乘法器不可用,CORDIC 通常更快,但如果可以使用乘法器,其他方法可能更快。

CORDIC 可以用多種方法實現,包括單級迭代方法,與乘法器電路相比,它需要很少的門。此外,CORDIC 可以使用完全相同的硬體計算許多函式,因此它們非常適合那些將降低成本(例如透過減少 FPGA 中的門數)優先於速度的應用。這種優先順序的一個例子是袖珍計算器,其中 CORDIC 被廣泛使用。

CORDIC 最初是由 J.E. Volder 於 1959 年在康維爾航空電子部門發明的,它被設計用於 B-58 轟炸機的導航計算機,以取代模擬分解器,一種計算三角函式的裝置(圓 CORDIC)。

1971 年,惠普的 J.S. Walther 將該方法擴充套件到計算雙曲函式、自然對數、自然指數、乘法、除法和平方根(線性 CORDIC 和雙曲 CORDIC)。

2019 年,基於雙曲 CORDIC,羅元勇等人進一步提出了一種廣義雙曲 CORDIC (GH CORDIC) 來直接計算具有任意固定基數的對數和指數。理論上,雙曲 CORDIC 是 GH CORDIC 的特例。

通用概念

[編輯 | 編輯原始碼]

考慮以下向量的旋轉

  • 從 (1, 0) 開始
  • 旋轉 θ
  • 我們得到 (cosθ, sinθ)
  • 從 (1, y) 開始
  • 旋轉直到 y = 0
  • 旋轉是 tan−1y

如果我們有一個計算效率高的向量旋轉方法,我們可以直接計算正弦、餘弦和反正切函式。但是,任意角度的旋轉並不容易(你必須知道正弦和餘弦,而這正是我們所沒有的)。我們使用兩種方法來簡化它

  • 我們不執行旋轉,而是執行“偽旋轉”,它們更容易計算。
  • 用一組特殊角度 αi 的和來構造所需的角度 θ

下圖顯示了長度為 Ri 的向量繞原點旋轉 ai 角的旋轉和偽旋轉

繞原點旋轉產生以下座標

回想一下身份 .

我們的策略是消除因子 ,並設法消除乘以 。偽旋轉生成一個與旋轉向量具有相同角度但長度不同的向量。事實上,偽旋轉將長度更改為

因此,我們現在有以下偽旋轉後的座標

偽旋轉成功地消除了我們的長度因子,而長度因子本來需要一個代價高昂的除法運算。然而,向量將在n個偽旋轉序列中增長K

然後,經過n個偽旋轉後的座標為

前三次偽旋轉。注意我們如何收斂到正確的角度,θ

如果角度總是相同的集合,那麼 K 是固定的,可以在以後考慮。我們根據兩個標準選擇這些角度

  • 我們還必須選擇角度,以便任何角度都可以透過所有角度的總和來構建,並帶有適當的符號。
  • 我們將所有 設定為 2 的冪,以便乘法可以透過二進位制數的簡單邏輯移位來執行。

正切函式在區間 [0, π/2] 上具有單調遞增的梯度,因此給定角度的正切始終小於該角度的一半正切的兩倍。這意味著如果我們使角度 ,我們可以滿足這兩個標準。請注意,正切函式是奇函式,這意味著要以另一種方式進行偽旋轉,您只需減去而不是新增角度的正切。

i αi = tan−1 (2−i)
弧度
0 45.00 0.7854
1 26.57 0.4636
2 14.04 0.2450
3 7.13 0.1244
4 3.58 0.0624
5 1.79 0.0312
6 0.90 0.0160
7 0.45 0.0080
8 0.22 0.0040
9 0.11 0.0020

在過程的步驟 i 中,我們以 進行偽旋轉,其中 是旋轉的方向(或符號),這將在每一步都選擇,以迫使角度收斂到所需的最終旋轉。例如,考慮 28° 的旋轉

我們採取的步驟越多,我們就可以透過連續旋轉來進行更好的近似。因此,我們有以下迭代座標計算

為了達到k位的精度,需要進行k次迭代,因為,隨著i的增加而收斂。

使用CORDICs

[編輯 | 編輯原始碼]

CORDICs可以用來計算許多函式。一個CORDIC有三個輸入,x0, y0z0。根據CORDIC的輸入,可以在輸出xn, ynzn產生不同的結果。

在旋轉模式下使用CORDIC

[編輯 | 編輯原始碼]





為了使zn收斂到0,選擇.

如果我們從x0 = 1/Ky0=0開始,在過程結束時,我們會發現xn=cos z0yn=sin z0

收斂域是,因為99.7°是列表中所有角度的總和。

在向量模式下使用CORDIC

[編輯 | 編輯原始碼]





為了使yn收斂到0,選擇.

如果我們從x0 = 1和z0 = 0開始,我們會發現zn=tan−1y0

CORDICs的實現

[編輯 | 編輯原始碼]

位並行,展開

[編輯 | 編輯原始碼]

位並行,迭代

[編輯 | 編輯原始碼]

如果不需要高速,可以使用一個加法器和一個移位器實現。

逐位序列

[編輯 | 編輯原始碼]

通用 CORDIC

[編輯 | 編輯原始碼]

透過引入因子μ,我們也可以滿足線性函式和雙曲函式的需求。

通用 CORDIC 實現的總結

[編輯 | 編輯原始碼]
模式 旋轉 向量化
圓形

μ = 1
αi = tan−12−i

線性

μ = 0
αi = 2−i

雙曲

μ = -1
αi = tanh−12−i

  • 在雙曲模式下,需要重複第 4,13,40,121,...,j,3j+1,... 步。下面的常數K' 可以解釋這一點。
  • K = 1.646760258121...
  • 1/K = 0.607252935009...
  • K' = 0.8281593609602...
  • 1/K' = 1.207497067763...

直接可計算函式

[編輯 | 編輯原始碼]

間接可計算函式

[編輯 | 編輯原始碼]

除了上述函式外,還可以透過組合先前計算結果來生成許多其他函式。

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書