本發(fā)明屬于數字處理技術領域,特別是涉及一種CORDIC算法的優(yōu)化方法。
背景技術:
坐標旋轉數字式計算機(Coordinate Rotation Digital Computer)算法,是J.D.Volder1于1959年首次提出。在上個世紀五十年代,在大型實際計算機中的實行移位相加受到了當時技術的限制,所以使用CORDIC變得非常必要。到了七十年代,Hewlett Packard和其他公司出產了手持式計算器,許多計算器使用內部一個CORDIC單元來計算所有的三角函數。隨著八十年代高速乘法器與帶有大存儲量的通用處理器的出現,CORDIC算法變得無關緊要了。然而在二十一世紀的今天,對于FPGA來說,CORDIC一定是DSP應用中(諸如多輸入多輸出(MIMO),波束形成以其他自適應系統(tǒng))計算三角函數的備選技術。
CORDIC算法的基本思想是通過一系列固定的、與運算基數相關的角度不斷偏擺以逼近所需的旋轉角度。為了擴展可解決的基本函數個數,1971年J.Walther提出了統(tǒng)一CORDIC算法(The Unified Cordic Algorithms),把圓周旋轉、雙曲旋轉和直線旋轉統(tǒng)一到同一個迭代方程里,因此可以通過選擇不同的m值(如圖1 CORDIC算法的操作模式m所示)來實現多種不同的計算功能,設計通用的CORDIC芯片。
CORDIC算法可計算的函數包括乘、除、平方根、正弦、余弦、反正切、向量旋轉(即復數乘法)、坐標轉換、指數運算以及FFT、DHT、DFT、DCT、DST等技術函數。通常完成這些變換通過兩類方法:第一類是專用硬件電路或專用數字信號處理器,通常采用比較或查表的方法,這類方法一般來說運算結構精度低、芯片面積大,更為關鍵的是設計的靈活性差;第二類則采用軟件編程的方法,由于這些變換均是非線性變換,完成一次運算需要運行較多的程序,運算速度較低。上述兩種方法在精度、速度、簡單性和效率方面都不能兼顧,難以滿足現代高速實時信號處理的要求。相比之下,CORDIC算法很好地兼顧了這幾方面,非常適合FPGA的實現。對于傳統(tǒng)的硬件算法設計中既耗時又占用面積大的乘、除等基本數學函數運算,CORDIC算法將其分解成為一些簡單的且在硬件中容易實現的基本算法,如加法、移位等,使得這些算法在硬件上可以很好的實現。此外,該算法是一種規(guī)則化的算法,它滿足了硬件對算法的模塊化、規(guī)則化的要求,因此CORDIC算法可以充分發(fā)揮硬件的優(yōu)勢,利用硬件的資源,從而實現硬件與算法相結合的一種優(yōu)化方法。
目前CORDIC算法存在的主要問題:(1)CORDIC算法主要可通過迭代結構和流水線結構來實現。迭代結構使用一個算法單元,將輸出反饋到輸入反復迭代計算。這種結構節(jié)省計算資源,可以實現可調算法精度,但是運行速度慢;流水線結構是將迭代結構展開采用n個算法單元,這將大大提高系統(tǒng)速度,每增加一次迭代精度提高一位,理論上可以通過增加迭代次數無限制提高精度,但是精度受流水線級數的限制,要提高精度必須增加流水線級數,而隨著流水線級數的增加,系統(tǒng)面積成指數級增長。(2)CORDIC算法在每一級迭代中都需要在表ROM中取出事先預存好的arctan(2-i)值。但是隨著運算字長的擴大,ROM表的容量成指數增長,系統(tǒng)所占資源急劇加大,每次訪問ROM表也會降低系統(tǒng)速度。(3)傳統(tǒng)CORDIC算法的旋轉角度覆蓋的角度只有-99.88°~99.88°,為了確保算法收斂,其所有旋轉角度之和必須大于實際需要旋轉的角度,因此無法覆蓋整個周期0°≤θ≤360°。
由于CORDIC算法本身的局限性,曾提出過多種改進和優(yōu)化措施,主要技術總結如下:(1)增加多次的迭代,使得算法旋轉覆蓋的角度范圍達到一個完整的周期[0,2π]。(2)跳過不必要的旋轉。跳過輸入相位值中為0的位對應的旋轉,減少了迭代次數,并且只有正向旋轉。對于特殊角度,例如π/4,通過很少次數的旋轉就己經達到該角度,即可不再進行后面的旋轉。(3)用幾位最高有效數字來決定旋轉的方向。然而以上種技術主要針對CORDIC算法角度覆蓋范圍和運算速度方面的局限性對其進行改進,有效地優(yōu)化了傳統(tǒng)的CORDIC算法。但是,每種改進方法也同時引入了一些新的問題,例如方法1中校正因子為變量,很難確定其值;方法2不能顯著的減少迭代次數方法;方法3能有效的減少迭代次數,但是會引起比例因子的變化。
技術實現要素:
鑒于以上所述現有技術的缺點,本發(fā)明的目的在于提供一種CORDIC算法的優(yōu)化方法,用于解決現有技術中CORDIC算法的優(yōu)化方法存在的不能顯著減少迭代次數的問題,以及校正因子為變量、減少迭代次數的同時引起比例因子的變化而導致的計算精度不高的問題。
為實現上述目的及其他相關目的,本發(fā)明提供一種CORDIC算法的優(yōu)化方法,所述CORDIC算法的優(yōu)化方法包括以下步驟:
1)對輸入角度值θ進行區(qū)間轉換,以將所述輸入角度值θ轉換到第一象限[0,45°]區(qū)間;
2)根據公式對所述輸入角度值θ進行編碼,得到系數sn的二進制編碼S=s0s1s2...sn;其中,系數sn為所述二進制編碼S中第n位上的0或1;
3)依據所述二進制編碼S中0的位數判斷是否將所述二進制編碼進行重新編碼,并在需要重新編碼時將所述二進制編碼S進行重新編碼;
4)依據公式進行迭代運算,其中,sn為所述二進制編碼S中第n位上的0或1,或為所述二進制編碼S重新編碼后第n位上的0或1。
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,步驟1)包括以下步驟:
1-1)將輸入角度值θ轉換到第一象限;
1-2)依據公式將所述輸入角度值θ轉換到第一象限[0,45°]區(qū)間。
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,步驟2)中,使用m位的ROM表存儲其中,表示不小于的最小整數。
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,步驟3)中,依據所述二進制編碼S中0的位數判斷是否將所述二進制編碼進行重新編碼具體方法為:將所述二進制編碼S中0的位數記為t,當時不需要將所述二進制編碼S進行重新編碼,當時將所述二進制編碼S進行重新編碼。
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,步驟3)中,將所述二進制編碼S進行重新編碼的方式為取所述二進制編碼S的反碼
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,步驟4)中,進行迭代運算之后還包括將迭代運算的結果進行修正的步驟。
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,將迭代運算的結果進行修正的具體方法為:將迭代運算的結果乘以一增益常數k進行修正,其中,
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,步驟4)中,Y0=0。
作為本發(fā)明的CORDIC算法的優(yōu)化方法的一種優(yōu)選方案,當步驟3)中需要將所述二進制編碼S進行重新編碼時,步驟4)之后還包括將步驟4)得到的結果進行調整的步驟,調整的具體方法為:記S0=111...11,與S0對應的輸入角度值記為θ0,依據公式將步驟4)得到的結果進行調整。
如上所述,本發(fā)明的CORDIC算法的優(yōu)化方法,具有以下有益效果:本發(fā)明的CORDIC算法的優(yōu)化方法可以減少一半的迭代運算,節(jié)省近一半的運算單元,極大提升了運算速度,節(jié)省所需計算資源,對于DSP及FPGA應用具有重大意義;同時,本發(fā)明的CORDIC算法的優(yōu)化方法優(yōu)化后的計算結果具有較高的精確度。
附圖說明
圖1顯示為現有技術中的CORDIC算法的操作模式圖。
圖2顯示為本發(fā)明提供的CORDIC算法的優(yōu)化方法的流程圖。
具體實施方式
以下通過特定的具體實例說明本發(fā)明的實施方式,本領域技術人員可由本說明書所揭露的內容輕易地了解本發(fā)明的其他優(yōu)點與功效。本發(fā)明還可以通過另外不同的具體實施方式加以實施或應用,本說明書中的各項細節(jié)也可以基于不同觀點與應用,在沒有背離本發(fā)明的精神下進行各種修飾或改變。
請參閱圖2。需要說明的是,本實施例中所提供的圖示僅以示意方式說明本發(fā)明的基本構想,雖圖示中僅顯示與本發(fā)明中有關的組件而非按照實際實施時的組件數目、形狀及尺寸繪制,其實際實施時各組件的形態(tài)、數量及比例可為一種隨意的改變,且其組件布局型態(tài)也可能更為復雜。
請參閱圖1,本發(fā)明提供一種CORDIC算法的優(yōu)化方法,所述CORDIC算法的優(yōu)化方法包括以下步驟:
1)對輸入角度值θ進行區(qū)間轉換,以將所述輸入角度值θ轉換到第一象限[0,45°]區(qū)間;
2)根據公式對所述輸入角度值θ進行編碼,得到系數sn的二進制編碼S=s0s1s2...sn;其中,系數sn為所述二進制編碼S中第n位上的0或1;Δθ表示誤差;
3)依據所述二進制編碼S中0的位數判斷是否將所述二進制編碼進行重新編碼,并在需要重新編碼時將所述二進制編碼S進行重新編碼;
4)依據公式進行迭代運算,其中,sn為所述二進制編碼S中第n位上的0或1,或為所述二進制編碼S重新編碼后第n位上的0或1。
作為示例,步驟1)包括以下步驟:
1-1)將輸入角度值θ轉換到第一象限;
1-2)依據公式將所述輸入角度值θ轉換到第一象限[0,45°]區(qū)間。
作為示例,步驟2)中,在對輸入角度值θ進行迭代之前,用一組基和二進制編碼S=s0s1s2...sn表示所述輸入角度值θ;這里需要使用一個m位的ROM表存儲這組基其中,表示不小于的最小整數。在所述二進制編碼S中0的位數越多,輸入角度值θ用越少的基表示,CORDIC算法后續(xù)所需迭代步驟減少的越多??紤]到最壞的情況此時迭代操作并沒有減少,因此需要對所述二進制編碼S進行優(yōu)化以達到所述二進制編碼S中“多0少1”。
作為示例,步驟3)中,依據所述二進制編碼S中0的位數判斷是否將所述二進制編碼進行重新編碼具體方法為:將所述二進制編碼S中0的位數記為t,當時不需要將所述二進制編碼S進行重新編碼,當時將所述二進制編碼S進行重新編碼;即當所述二進制編碼S中0的位數大于或等于總位數的一半時,則不需要將所述二進制編碼S進行重新編碼,當所述二進制編碼S中的位數小于總位數的一半時,則需要將所述二進制編碼S進行重新編碼。
作為示例,將所述二進制編碼S進行重新編碼的方式為取所述二進制編碼S的反碼具體為:
其中,“=”表示賦值。由上式可推導出S中只要有[n/2]中個“0”([n/2]表示不小于n/2的最小整數)。
作為示例,步驟4)中,進行迭代運算之后還包括將迭代運算的結果進行修正的步驟。具體的,將迭代運算的結果進行修正的具體方法為:將迭代運算的結果乘以一增益常數k進行修正,其中,
作為示例,CORDIC算法主要用于計算三角函數、指數等超越函數,可通過設置不同的初始值來求解具體的函數,在一示例中,初始值設置為:Y0=0,輸入所述輸入角度值θ,可以求出Xn=cosθ,Yn=sinθ。
作為示例,當步驟3)中需要將所述二進制編碼S進行重新編碼時,本實施例中,將所述二進制編碼S反碼得到Xn、Yn是計算輸入角度為的結果,因此,最后求出的步驟4)之后還包括將步驟4)得到的結果進行調整的步驟,調整的具體方法為:記S0=111...11,與S0對應的輸入角度值記為θ0,依據公式將步驟4)得到的結果進行調整。在實際過程中,一旦計算精度確定,迭代次數n即可確定,S0和θ0也隨之確定。依據CORDIC算法具體邱玨的函數和上述調整公式即可求出最后的精確值。以三角函數為例,有如下關系式:
式中cosθ0、sinθ0、exp(θ0)均可預先求出存入ROM表中,最后求解時直接調用即可。
本發(fā)明通過對輸入角度值的區(qū)間轉換、編碼和重新編碼以及最后的迭代運算,雖然增加了編碼操作、序列檢測以及存儲系數的ROM表,但節(jié)省了一半左右的迭代運算,相較于傳統(tǒng)的CORDIC采用流水線結構實現,每次迭代需要兩次移位運算、一次查找表、三次加法運算,而隨著計算精度提高和迭代次數增多,本發(fā)明的CORDIC算法的優(yōu)化方法將會節(jié)省一半迭代運算,所節(jié)省總的計算資源也能趨于50%。
綜上所述,本發(fā)明提供一種CORDIC算法的優(yōu)化方法,所述CORDIC算法的優(yōu)化方法包括以下步驟:1)對輸入角度值θ進行區(qū)間轉換,以將所述輸入角度值θ轉換到第一象限[0,45°]區(qū)間;2)根據公式對所述輸入角度值θ進行編碼,得到系數sn的二進制編碼S=s0s1s2...sn;其中,系數sn為所述二進制編碼S中第n位上的0或1;3)依據所述二進制編碼S中0的位數判斷是否將所述二進制編碼進行重新編碼,并在需要重新編碼時將所述二進制編碼S進行重新編碼;4)依據公式進行迭代運算,其中,sn為所述二進制編碼S中第n位上的0或1,或為所述二進制編碼S重新編碼后第n位上的0或1。本發(fā)明的CORDIC算法的優(yōu)化方法可以減少一半的迭代運算,節(jié)省近一半的運算單元,極大提升了運算速度,節(jié)省所需計算資源,對于DSP及FPGA應用具有重大意義;同時,本發(fā)明的CORDIC算法的優(yōu)化方法優(yōu)化后的計算結果具有較高的精確度。
上述實施例僅例示性說明本發(fā)明的原理及其功效,而非用于限制本發(fā)明。任何熟悉此技術的人士皆可在不違背本發(fā)明的精神及范疇下,對上述實施例進行修飾或改變。因此,舉凡所屬技術領域中具有通常知識者在未脫離本發(fā)明所揭示的精神與技術思想下所完成的一切等效修飾或改變,仍應由本發(fā)明的權利要求所涵蓋。