使用 DSP 加速 CORDIC 算法
出處:維庫電子市場網(wǎng) 發(fā)布于:2023-03-29 15:46:30
數(shù)字信號處理器 (DSP) 為需要快速模擬到數(shù)字到模擬轉換的應用處理數(shù)字,例如軟件無線電和雷達。如果您沒有使用 DSP,您可以使用 CORDIC 算法在您的 IC 上執(zhí)行類似的計算。CORDIC 算法的優(yōu)勢在于它能夠在不使用乘法器的情況下求解矢量旋轉。
盡管 CORDIC 的屬性有據(jù)可查,但您不會經(jīng)常發(fā)現(xiàn)它在 DSP 上實現(xiàn),因為 CORDIC 是 49 年前構思出來的,當時乘法器硬件的成本高得令人望而卻步。(DSP 通常配備乘法器。)但是當您將兩者混合時會發(fā)生什么情況?當在 DSP 處理器上實現(xiàn) CORDIC 算法時,乘法器能否提高 CORDIC 的性能,還是可以閑置?
我們將通過提出一種將 CORDIC 算法映射到 DSP 硬件的新穎方法來積極回答這個問題。這種新方法使用 DSP 的 MAC(乘法/累加)單元并消除了條件,從而保留了機器流水線。
CORDIC 是 COordinate Rotation DIgital Computer 的首字母縮寫詞,是一類在平面中旋轉矢量的移位相加算法。CORDIC 已成為內(nèi)存和 CPU 受限嵌入式系統(tǒng)中的常用方法,因為它是計算每個科學計算器中的雙曲函數(shù)和三角函數(shù)的簡單而有效的方法。
大多數(shù)情況下,當沒有可用的硬件乘法器時(例如在微控制器和 FPGA 中),會使用該算法,因為它所需的操作是加法、減法、位移位和查表。
CORDIC 由于其簡單性和相對快速收斂的特性而被廣泛使用。它有很多應用,包括計算三角函數(shù)和將笛卡爾坐標轉換為極坐標(反之亦然)。
基本上,CORDIC 算法會選擇特殊的旋轉角度,這樣它就可以通過簡單的移位和加法來執(zhí)行旋轉操作,而不是一般情況下所需的乘法函數(shù)。因此,設計團隊可以使用 CORDIC 算法而不是硬件乘法器,后者需要更多的門數(shù)并且構建成本更高。
在我們詳細了解如何將 CORDIC 算法映射到 DSP 引擎之前,我們將簡要回顧一下 CORDIC 算法,該算法根據(jù)笛卡爾坐標計算矢量的大小和角度。然后我們將描述該算法在 DSP 處理器上的實現(xiàn),它僅使用加法和移位運算。
不過,首先讓我們回顧一下實現(xiàn) CORDIC 的傳統(tǒng)方法。
令v為具有笛卡爾坐標 ( x, y ) 的向量。為了簡化描述,我們只考慮單位圓的右半平面,換句話說,我們假設 1> x >0, 1> y。
如果我們能以某種方式將向量v = ( x , y ) 旋轉到v e = ( x e , y e ) 使得y e = 0,則大小r 將是x坐標x e ,角度 φ 將是旋轉后的坐標角度。這種旋轉實際上是通過多次連續(xù)旋轉(稱為子旋轉)來實現(xiàn)的。對于每個子旋轉,正確選擇旋轉角度,以便:
? 計算可以僅通過加法和移位運算來完成(避免使用乘法)。
? 子旋轉集將向量v驅動 到x軸,換句話說,使坐標y 等于0;如果當前旋轉是前一個旋轉的一半,則可以保證這一點。
在數(shù)學上,CORDIC 算法可以描述如下:
初讓:
x 0 = x
y 0 = y
φ 0 =0
個操作會將 v 0 = ( x 0 , y 0 ) 旋轉 α 0 =45° 以獲得 v 1 = ( x 1 , y 1 )。
x 1 = x 0 cos(α 0 ) – d 0 y 0 sin(α 0 ) (1.3)
y 1 = y 0 cos(α 0 ) + d 0 x 0 sin(α 0 ) (1.4)
φ 1 = φ 0 – d 0 α 0 (1.5)
其中d 0 是旋轉方向:
d 0 =1 如果y 0 <0 (1.6)
d 0 =-1 如果y 0 ≥0 (1.7)
等式 1.3 和 1.4 與以下相同:
x 1 = cos(α 0 )[ x 0 – d 0 y 0 tan(α 0 )] (1.8)
y 1 = cos(α 0 )[ y 0 + d 0 x 0 tan(α 0 )] (1.9)
一般來說,第i次旋轉是:
x i +1 = cos(α i )[ x i – d i y i tan(α i ) (1.10)
y i +1 = cos(α i )[ y i + d i x i tan(α i )] (1.11)
φ i +1 = φ i – d i α i (1.12)
其中d i 是旋轉方向:
d i =1 如果y i <0(向上旋轉) (1.13)
d i =-1 如果y i ≥0(向下旋轉) (1.14)
因為我=0,1,…
如果選擇 a i 使得 tan(a i )= 2 -i ,則方程 1.10 到 1.12 變?yōu)椋?/p>
x i +1 = K i [ x i – d i y i 2 -i ] (1.15)
y i +1 = K i [ y i + d i x i 2 -i ] (1.16)
φ i +1 = φ i – d i α i (1.17)
在哪里:
K i = cos(arctan(2 -i )) (1.18)
α i = arctan(2 -i ) (1.19)
由于稍后可以去除常數(shù)K i 的影響 (參見公式 1.23),公式 1.15 到 1.17 中的 CORDIC 算法可以實現(xiàn)為:
xi +1 = xi – d i y i 2 -i ( 1.20 )
y i +1 = y i + d i x i 2 -i (1.21)
φ i +1 = φ i – d i α i (1.22)
其中d i 和 α i 在方程 1.13、1.14 和 1.19 中定義。
假設經(jīng)過N 次旋轉后,達到了所需的精度,則 可以通過以下方式近似找到 大小r和角度 φ:
其中K = K N -1 ? …? K 0 = cos(arctan(2 -( N -1) ))?... ?cos(arctan(2 -0 )),可以地預先計算。
等式 1.20 到 1.24 中 CORDIC 的典型偽代碼是:
如果 ( y < 0) (1.25)
x i +1 = x i – y i ' (1.26)
y i +1 = y i + x i ' (1.27)
φ i +1 = φ i – α i (1.28)
如果 ( y i ≥ 0) (1.29)
x i +1 = x i + y i ' (1.30)
y i +1 = y i – x i ' (1.31)
φ i +1 = φ i + α i (1.32)
在哪里:
x i '= x i 2 -i = x i >> i (1.33)
y i '= y i 2 -i = y i >> i (1.34)
我=0,1,…
符號“ z >> i ”表示z中的位 將向下移動i 位(本文檔中的移位始終是算術移位,而不是邏輯移位)。
圖 1 顯示了 CORDIC 算法的圖示。公式 1.25 到 1.32 中的偽代碼很簡單,只需要加法和移位運算。由于不需要乘法函數(shù),硬件實現(xiàn)也很簡單,因此CORDIC算法在ASIC(專用集成電路)和FPGA(現(xiàn)場可編程門陣列)中得到廣泛應用。
現(xiàn)代架構的新 CORDIC 實現(xiàn)
人們普遍認為 DSP 處理器無法提高 CORDIC 算法的性能。乍一看,這似乎是合理的,因為在大多數(shù)實現(xiàn)中 CORDIC 的主要優(yōu)勢是它避免了乘法函數(shù)。但是,如果有一個乘法器,是否可以提高 CORDIC 算法的性能呢?我們建議重新制定 CORDIC,以利用 DSP 的硬件架構。
在 DSP 架構上實現(xiàn) CORDIC 時還有另一個重要的考慮因素——即流水線。為了提高性能,現(xiàn)代處理器通常采用多達 10 個階段的流水線。這種流水線設計允許處理器以時間片的方式執(zhí)行任務。 只要代碼不會用分支破壞指令流,流水線就是一種有效的方法。傳統(tǒng)的 CORDIC 算法需要條件執(zhí)行(參見方程 1.25 到 1.32 中的偽代碼),這通常會破壞流水線并導致停頓。因此,CORDIC 算法的性能在現(xiàn)代流水線架構中可能很慢。
我們的新方法主要通過在 DSP 處理器中使用乘法單元來解決這個困難;它還消除了條件執(zhí)行的需要。我們首先重新制定算法,使其更適合使用乘法器。
x i +1、y i +1和 φ i +1的迭代公式 (參見方程 1.25 至 1.32)可寫為:
x i +1 = φ i ( x i – y i ')+(1- f i ) ( x i + y i ') (2.1)
y i +1 = fi ( y i + x i ')+(1- f i ) ( y i – x i ') ( 2.2)
f i +1 = φ i (φ i – a i )+(1- f i ) (φ i + α i ) (2.3)
在哪里:
f i =1 如果y i <0 (2.4)
f i =0 如果y i ≥0 (2.5)
x i '= x i 2 -i = x i >>i (2.6)
y i '= y i 2 -i = y i >>i (2.7)
公式 2.1 中的迭代可寫為:
x i +1 = f i (– 2 y i ')+ ( x i + y i ')
= 2[- f i y i '+ x i /2+ y i '/2]
= 2[(- f i + 1 / 2) y i '+ x i /2] (2.8)
= 2[(- f i + 1 / 2)' y i + x i /2]
在哪里:
(- f i + 1 / 2)' = (- f i + 1 / 2)2 -i = (- f i + 1 / 2)>> i (2.9)
同樣,方程 2.2 和 2.3 中的迭代可寫為:
y i +1 = 2[-(- f i + 1 / 2)' x i + y i /2] (2.10)
φ i +1 = 2 i [(- f i + 1 / 2)α i +φ i /2] (2.11)
綜合以上,我們有實現(xiàn)的算法:
x i +1 = 2[(- f i + 1 / 2)' y i + x i /2] (2.12)
y i +1 = 2[-(- f i + 1 / 2)' x i + y i /2] (2.13)
φ i +1 = 2 i [(- f i + 1 / 2)α i +φ i /2] (2.14)
在哪里:
f i =1 如果y i <0 (2.15)
f i =0 如果y i ≥ 0 (2.16)
(- f i + 1 / 2)' = (- f i + 1 / 2)2 – i = (- f i + 1 / 2)>>i (2.17)
公式 2.12 到 2.17 相對于公式 1.25 到 1.32 的優(yōu)點如下:
1. 方程 2.12 到 2.17 的執(zhí)行是無條件的;因此,它解決了管道破裂的困難,這是在執(zhí)行方程式 1.25 到 1.32 時的情況。
2. 方程式 2.12 到 2.17 中的移位操作只會進行(以獲得修改后的標志 (- f i + 1 / 2)' ),而在方程式 1.25 到 1.32 中,需要兩次移位操作(以獲得x i '和y i '),因此它節(jié)省了操作。
3. 標志已被選擇為具有兩個可能的值,1 / 2 或 –1 / 2。公式 1.15 小數(shù)格式中的這些值分別以十六進制表示法表示為 0x4000 和 0xC000。由于特定值的選擇,標志常量在向下移動時不會丟失精度。
4. 新的CORDIC公式在迭代過程中不會下移x i 和y i坐標值。 因此,原始 ( x , y ) 坐標值的精度不會丟失。
5. 標志 (- f i +1 / 2)' 與x i 或y i 坐標值的乘積存儲在 40 位累加器中。參見公式 2.8 和 2.10。
6. 作為改進 3、4 和 5 的結果,新的 CORDIC 公式實現(xiàn)了約 0.5 位的更高精度。
公式 2.12 到 2.17 中的公式特別適合在流水線 DSP 架構上實現(xiàn)。當在 Analog Devices 的 Blackfin BF533 DSP 處理器上實現(xiàn)時,每次迭代需要四個周期,而公式 1.25 到 1.32 中的傳統(tǒng)實現(xiàn)每次迭代需要七個周期。例如,在軟件無線電應用中,我們需要為 240 kHz 的兩個信道實現(xiàn) CORDIC 算法。迭代次數(shù)(子旋轉)為 13。我們的新方法將消耗 2×240,000x13x4 = 25 mips(每秒百萬條指令),而 2×240,000x13x7 = 44 mips。
這表示在 mips 方面節(jié)省了 43%。此外,對于相同的迭代次數(shù),方程式 2.12 到 2.17 中新方法的結果平均比方程式 1.25 到 1.32 中的傳統(tǒng)方法的精度高 0.5 位。
CORDIC 的 C 和匯編代碼
在本節(jié)中,我們提供三個代碼示例:
? 清單 1: 實現(xiàn)原始 CORDIC 的 C 代碼。
? 清單 2:實現(xiàn)重新編寫的 CORDIC 的 Blackfin 匯編代碼。
? 清單 3: 實現(xiàn)原始 CORDIC 的 Blackfin 匯編代碼。
可以使用 ADI 的 VisualDSP++ 工具編譯和執(zhí)行清單 1中的代碼和清單 2 中的完整代碼。請注意,清單 2中的代碼 是一個摘錄——完整的代碼代碼假定 | x |, | y |<1 格式為 1.15;換句話說,x , y在[0x8000, 0x7fff] 范圍內(nèi)。輸出相位為1.31格式的32位;換句話說,-p 由0x80000000 表示 ,p 由0x7fffffff 表示。匯編代碼可能有一些特殊要求,可以在注釋中看到。
清單 3中的代碼 只是展示原始 CORDIC 如何在 ADI 匯編上實現(xiàn)的一部分。在清單 3中,我們僅顯示了迭代的代碼(總共七行代碼,花費了七個周期)。ITER_NUM=i 是一個變量i =0,…,14 是迭代次數(shù)。它應該在一個寄存器中,可以從內(nèi)存中加載。為了清楚起見,我們將其保留原樣。寄存器 r2 = φ i +1 , i =0,1,…,14 初始時 r2=φ 0 =0(見 1.32)。除了以下實現(xiàn)的緩慢性能外,由于行r1 = r0>>> ITER_NUM (v) ,它的精度較低,它移動了x i y i 向下坐標,失去精度。數(shù)字信號處理器 (DSP) 為需要快速模擬到數(shù)字到模擬轉換的應用處理數(shù)字,例如軟件無線電和雷達。如果您沒有使用 DSP,您可以使用 CORDIC 算法在您的 IC 上執(zhí)行類似的計算。CORDIC 算法的優(yōu)勢在于它能夠在不使用乘法器的情況下求解矢量旋轉。
盡管 CORDIC 的屬性有據(jù)可查,但您不會經(jīng)常發(fā)現(xiàn)它在 DSP 上實現(xiàn),因為 CORDIC 是 49 年前構思出來的,當時乘法器硬件的成本高得令人望而卻步。(DSP 通常配備乘法器。)但是當您將兩者混合時會發(fā)生什么情況?當在 DSP 處理器上實現(xiàn) CORDIC 算法時,乘法器能否提高 CORDIC 的性能,還是可以閑置?
我們將通過提出一種將 CORDIC 算法映射到 DSP 硬件的新穎方法來積極回答這個問題。這種新方法使用 DSP 的 MAC(乘法/累加)單元并消除了條件,從而保留了機器流水線。
CORDIC 是 COordinate Rotation DIgital Computer 的首字母縮寫詞,是一類在平面中旋轉矢量的移位相加算法。CORDIC 已成為內(nèi)存和 CPU 受限嵌入式系統(tǒng)中的常用方法,因為它是計算每個科學計算器中的雙曲函數(shù)和三角函數(shù)的簡單而有效的方法。
大多數(shù)情況下,當沒有可用的硬件乘法器時(例如在微控制器和 FPGA 中),會使用該算法,因為它所需的操作是加法、減法、位移位和查表。
CORDIC 由于其簡單性和相對快速收斂的特性而被廣泛使用。它有很多應用,包括計算三角函數(shù)和將笛卡爾坐標轉換為極坐標(反之亦然)。
基本上,CORDIC 算法會選擇特殊的旋轉角度,這樣它就可以通過簡單的移位和加法來執(zhí)行旋轉操作,而不是一般情況下所需的乘法函數(shù)。因此,設計團隊可以使用 CORDIC 算法而不是硬件乘法器,后者需要更多的門數(shù)并且構建成本更高。
在我們詳細了解如何將 CORDIC 算法映射到 DSP 引擎之前,我們將簡要回顧一下 CORDIC 算法,該算法根據(jù)笛卡爾坐標計算矢量的大小和角度。然后我們將描述該算法在 DSP 處理器上的實現(xiàn),它僅使用加法和移位運算。
不過,首先讓我們回顧一下實現(xiàn) CORDIC 的傳統(tǒng)方法。
令v為具有笛卡爾坐標 ( x, y ) 的向量。為了簡化描述,我們只考慮單位圓的右半平面,換句話說,我們假設 1> x >0, 1> y。
如果我們能以某種方式將向量v = ( x , y ) 旋轉到v e = ( x e , y e ) 使得y e = 0,則大小r 將是x坐標x e ,角度 φ 將是旋轉后的坐標角度。這種旋轉實際上是通過多次連續(xù)旋轉(稱為子旋轉)來實現(xiàn)的。對于每個子旋轉,正確選擇旋轉角度,以便:
? 計算可以僅通過加法和移位運算來完成(避免使用乘法)。
? 子旋轉集將向量v驅動 到x軸,換句話說,使坐標y 等于0;如果當前旋轉是前一個旋轉的一半,則可以保證這一點。
在數(shù)學上,CORDIC 算法可以描述如下:
初讓:
x 0 = x
y 0 = y
φ 0 =0
個操作會將 v 0 = ( x 0 , y 0 ) 旋轉 α 0 =45° 以獲得 v 1 = ( x 1 , y 1 )。
x 1 = x 0 cos(α 0 ) – d 0 y 0 sin(α 0 ) (1.3)
y 1 = y 0 cos(α 0 ) + d 0 x 0 sin(α 0 ) (1.4)
φ 1 = φ 0 – d 0 α 0 (1.5)
其中d 0 是旋轉方向:
d 0 =1 如果y 0 <0 (1.6)
d 0 =-1 如果y 0 ≥0 (1.7)
等式 1.3 和 1.4 與以下相同:
x 1 = cos(α 0 )[ x 0 – d 0 y 0 tan(α 0 )] (1.8)
y 1 = cos(α 0 )[ y 0 + d 0 x 0 tan(α 0 )] (1.9)
一般來說,第i次旋轉是:
x i +1 = cos(α i )[ x i – d i y i tan(α i ) (1.10)
y i +1 = cos(α i )[ y i + d i x i tan(α i )] (1.11)
φ i +1 = φ i – d i α i (1.12)
其中d i 是旋轉方向:
d i =1 如果y i <0(向上旋轉) (1.13)
d i =-1 如果y i ≥0(向下旋轉) (1.14)
因為我=0,1,…
如果選擇 a i 使得 tan(a i )= 2 -i ,則方程 1.10 到 1.12 變?yōu)椋?/p>
x i +1 = K i [ x i – d i y i 2 -i ] (1.15)
y i +1 = K i [ y i + d i x i 2 -i ] (1.16)
φ i +1 = φ i – d i α i (1.17)
在哪里:
K i = cos(arctan(2 -i )) (1.18)
α i = arctan(2 -i ) (1.19)
由于稍后可以去除常數(shù)K i 的影響 (參見公式 1.23),公式 1.15 到 1.17 中的 CORDIC 算法可以實現(xiàn)為:
xi +1 = xi – d i y i 2 -i ( 1.20 )
y i +1 = y i + d i x i 2 -i (1.21)
φ i +1 = φ i – d i α i (1.22)
其中d i 和 α i 在方程 1.13、1.14 和 1.19 中定義。
假設經(jīng)過N 次旋轉后,達到了所需的精度,則 可以通過以下方式近似找到 大小r和角度 φ:
其中K = K N -1 ? …? K 0 = cos(arctan(2 -( N -1) ))?... ?cos(arctan(2 -0 )),可以地預先計算。
等式 1.20 到 1.24 中 CORDIC 的典型偽代碼是:
如果 ( y < 0) (1.25)
x i +1 = x i – y i ' (1.26)
y i +1 = y i + x i ' (1.27)
φ i +1 = φ i – α i (1.28)
如果 ( y i ≥ 0) (1.29)
x i +1 = x i + y i ' (1.30)
y i +1 = y i – x i ' (1.31)
φ i +1 = φ i + α i (1.32)
在哪里:
x i '= x i 2 -i = x i >> i (1.33)
y i '= y i 2 -i = y i >> i (1.34)
我=0,1,…
符號“ z >> i ”表示z中的位 將向下移動i 位(本文檔中的移位始終是算術移位,而不是邏輯移位)。
圖 1 顯示了 CORDIC 算法的圖示。公式 1.25 到 1.32 中的偽代碼很簡單,只需要加法和移位運算。由于不需要乘法函數(shù),硬件實現(xiàn)也很簡單,因此CORDIC算法在ASIC(專用集成電路)和FPGA(現(xiàn)場可編程門陣列)中得到廣泛應用。
現(xiàn)代架構的新 CORDIC 實現(xiàn)
人們普遍認為 DSP 處理器無法提高 CORDIC 算法的性能。乍一看,這似乎是合理的,因為在大多數(shù)實現(xiàn)中 CORDIC 的主要優(yōu)勢是它避免了乘法函數(shù)。但是,如果有一個乘法器,是否可以提高 CORDIC 算法的性能呢?我們建議重新制定 CORDIC,以利用 DSP 的硬件架構。
在 DSP 架構上實現(xiàn) CORDIC 時還有另一個重要的考慮因素——即流水線。為了提高性能,現(xiàn)代處理器通常采用多達 10 個階段的流水線。這種流水線設計允許處理器以時間片的方式執(zhí)行任務。 只要代碼不會用分支破壞指令流,流水線就是一種有效的方法。傳統(tǒng)的 CORDIC 算法需要條件執(zhí)行(參見方程 1.25 到 1.32 中的偽代碼),這通常會破壞流水線并導致停頓。因此,CORDIC 算法的性能在現(xiàn)代流水線架構中可能很慢。
我們的新方法主要通過在 DSP 處理器中使用乘法單元來解決這個困難;它還消除了條件執(zhí)行的需要。我們首先重新制定算法,使其更適合使用乘法器。
x i +1、y i +1和 φ i +1的迭代公式 (參見方程 1.25 至 1.32)可寫為:
x i +1 = φ i ( x i – y i ')+(1- f i ) ( x i + y i ') (2.1)
y i +1 = fi ( y i + x i ')+(1- f i ) ( y i – x i ') ( 2.2)
f i +1 = φ i (φ i – a i )+(1- f i ) (φ i + α i ) (2.3)
在哪里:
f i =1 如果y i <0 (2.4)
f i =0 如果y i ≥0 (2.5)
x i '= x i 2 -i = x i >>i (2.6)
y i '= y i 2 -i = y i >>i (2.7)
公式 2.1 中的迭代可寫為:
x i +1 = f i (– 2 y i ')+ ( x i + y i ')
= 2[- f i y i '+ x i /2+ y i '/2]
= 2[(- f i + 1 / 2) y i '+ x i /2] (2.8)
= 2[(- f i + 1 / 2)' y i + x i /2]
在哪里:
(- f i + 1 / 2)' = (- f i + 1 / 2)2 -i = (- f i + 1 / 2)>> i (2.9)
同樣,方程 2.2 和 2.3 中的迭代可寫為:
y i +1 = 2[-(- f i + 1 / 2)' x i + y i /2] (2.10)
φ i +1 = 2 i [(- f i + 1 / 2)α i +φ i /2] (2.11)
綜合以上,我們有實現(xiàn)的算法:
x i +1 = 2[(- f i + 1 / 2)' y i + x i /2] (2.12)
y i +1 = 2[-(- f i + 1 / 2)' x i + y i /2] (2.13)
φ i +1 = 2 i [(- f i + 1 / 2)α i +φ i /2] (2.14)
在哪里:
f i =1 如果y i <0 (2.15)
f i =0 如果y i ≥ 0 (2.16)
(- f i + 1 / 2)' = (- f i + 1 / 2)2 – i = (- f i + 1 / 2)>>i (2.17)
公式 2.12 到 2.17 相對于公式 1.25 到 1.32 的優(yōu)點如下:
1. 方程 2.12 到 2.17 的執(zhí)行是無條件的;因此,它解決了管道破裂的困難,這是在執(zhí)行方程式 1.25 到 1.32 時的情況。
2. 方程式 2.12 到 2.17 中的移位操作只會進行(以獲得修改后的標志 (- f i + 1 / 2)' ),而在方程式 1.25 到 1.32 中,需要兩次移位操作(以獲得x i '和y i '),因此它節(jié)省了操作。
3. 標志已被選擇為具有兩個可能的值,1 / 2 或 –1 / 2。公式 1.15 小數(shù)格式中的這些值分別以十六進制表示法表示為 0x4000 和 0xC000。由于特定值的選擇,標志常量在向下移動時不會丟失精度。
4. 新的CORDIC公式在迭代過程中不會下移x i 和y i坐標值。 因此,原始 ( x , y ) 坐標值的精度不會丟失。
5. 標志 (- f i +1 / 2)' 與x i 或y i 坐標值的乘積存儲在 40 位累加器中。參見公式 2.8 和 2.10。
6. 作為改進 3、4 和 5 的結果,新的 CORDIC 公式實現(xiàn)了約 0.5 位的更高精度。
公式 2.12 到 2.17 中的公式特別適合在流水線 DSP 架構上實現(xiàn)。當在 Analog Devices 的 Blackfin BF533 DSP 處理器上實現(xiàn)時,每次迭代需要四個周期,而公式 1.25 到 1.32 中的傳統(tǒng)實現(xiàn)每次迭代需要七個周期。例如,在軟件無線電應用中,我們需要為 240 kHz 的兩個信道實現(xiàn) CORDIC 算法。迭代次數(shù)(子旋轉)為 13。我們的新方法將消耗 2×240,000x13x4 = 25 mips(每秒百萬條指令),而 2×240,000x13x7 = 44 mips。
這表示在 mips 方面節(jié)省了 43%。此外,對于相同的迭代次數(shù),方程式 2.12 到 2.17 中新方法的結果平均比方程式 1.25 到 1.32 中的傳統(tǒng)方法的精度高 0.5 位。
CORDIC 的 C 和匯編代碼
在本節(jié)中,我們提供三個代碼示例:
? 清單 1: 實現(xiàn)原始 CORDIC 的 C 代碼。
? 清單 2:實現(xiàn)重新編寫的 CORDIC 的 Blackfin 匯編代碼。
? 清單 3: 實現(xiàn)原始 CORDIC 的 Blackfin 匯編代碼。
可以使用 ADI 的 VisualDSP++ 工具編譯和執(zhí)行清單 1中的代碼和清單 2 中的完整代碼。請注意,清單 2中的代碼 是一個摘錄——完整的代碼可以從www.embedded.com/code/2008code.htm 獲得。代碼假定 | x |, | y |<1 格式為 1.15;換句話說,x , y在[0x8000, 0x7fff] 范圍內(nèi)。輸出相位為1.31格式的32位;換句話說,-p 由0x80000000 表示 ,p 由0x7fffffff 表示。匯編代碼可能有一些特殊要求,可以在注釋中看到。
清單 3中的代碼 只是展示原始 CORDIC 如何在 ADI 匯編上實現(xiàn)的一部分。在清單 3中,我們僅顯示了迭代的代碼(總共七行代碼,花費了七個周期)。ITER_NUM=i 是一個變量i =0,…,14 是迭代次數(shù)。它應該在一個寄存器中,可以從內(nèi)存中加載。為了清楚起見,我們將其保留原樣。寄存器 r2 = φ i +1 , i =0,1,…,14 初始時 r2=φ 0 =0(見 1.32)。除了以下實現(xiàn)的緩慢性能外,由于行r1 = r0>>> ITER_NUM (v) ,它的精度較低,它移動了x i y i 向下坐標,失去精度。
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://udpf.com.cn,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- 掌握 DSP:原理剖析與應用實踐2025/5/8 14:03:24
- 模糊邏輯在 DSP 上實時執(zhí)行2023/7/25 17:13:30
- 多速率DSP及其在數(shù)模轉換中的應用2023/6/12 15:28:52
- 高速DSP系統(tǒng)的信號完整性2022/9/26 16:45:38
- 自適應噪聲消除系統(tǒng)的實現(xiàn)2022/1/17 17:51:17