最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

使用 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和角度 φ:


        (1.23)



        (1.24)


其中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和角度 φ:


        (1.23)



        (1.24)


其中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 向下坐標,失去精度。

關鍵詞: DSP

版權與免責聲明

凡本網(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)系,否則視為放棄相關權利。

OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術客服:

0571-85317607

網(wǎng)站技術支持

13606545031

客服在線時間周一至周五
9:00-17:30

關注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!