劉立業(yè),伍小保
(中國(guó)電子科技集團(tuán)公司第三十八研究所,安徽 合肥 230088)
CORDIC是用于計(jì)算廣義矢量旋轉(zhuǎn)的一種迭代方法,為這類(lèi)基礎(chǔ)運(yùn)算提供了一種有效、簡(jiǎn)單的硬件實(shí)現(xiàn)方法。該算法是由J.D.Volder于 1959 年提出的[1],可以將多種難以用硬件電路直接實(shí)現(xiàn)的復(fù)雜運(yùn)算分解為統(tǒng)一的簡(jiǎn)單移位、加迭代運(yùn)算[2]。
設(shè)變量(Xi-1,Yi-1)旋轉(zhuǎn)角度kiαi,ki=±1,之后得到新的變量(Xi,Yi)為:
(1)
選擇αi=arctan(2-(i-1)),即tanαi=2-(i-1),則:
(2)
(3)
基帶數(shù)字處理中,常用CORDIC算法產(chǎn)生基帶I/Q信號(hào),由式(3)可知,在二進(jìn)制表示下,可以用移位操作得到目標(biāo)角度Z0的余弦值XN和正弦值YN。
如果最后一級(jí)發(fā)生了溢出,計(jì)算結(jié)果從7f fff變成了80 000(假設(shè)處理位數(shù)20位),會(huì)導(dǎo)致輸出1~-1的極大錯(cuò)誤;如果該溢出發(fā)生在中間第i級(jí)運(yùn)算,在CORDIC算法的特色操作——右移i-1位過(guò)程中,本應(yīng)該左補(bǔ)i-1個(gè)0,現(xiàn)在變成了左補(bǔ)i-1個(gè)1,帶來(lái)了1/2i-2的誤差,該誤差將會(huì)往后傳遞影響輸出精度。
分析產(chǎn)生溢出的2種情況可以發(fā)現(xiàn),發(fā)生溢出后,錯(cuò)誤值的絕對(duì)值和準(zhǔn)確值差別很小,因此可以根據(jù)理論余弦(正弦)值的正負(fù)符號(hào)對(duì)輸出結(jié)果進(jìn)行修正——如果輸出和理論值不同符號(hào),強(qiáng)制改變輸出的符號(hào)(不改變絕對(duì)值)。本文中,非最后一級(jí)的結(jié)果由構(gòu)建的當(dāng)前角度來(lái)修正,最后一級(jí)由初始相位來(lái)修正(賦值)。糾正誤差過(guò)程如圖1所示。
圖1 誤差糾正框圖
本文采用的方案里,4個(gè)象限的映射依據(jù)分別為:
(4)
由正余弦函數(shù)的性質(zhì)可知,本方案象限映射過(guò)程只改變了正余弦值的符號(hào),不改變絕對(duì)值。
為了得到每級(jí)算法的理論值,本文構(gòu)建當(dāng)前角度θi,對(duì)每一級(jí)的輸出相位理論值做跟蹤:
(5)
(6)
(7)
(8)
(9)
(10)
(11)
本文方法消除溢出的仿真效果如圖2~4所示。
圖2為修正前的仿真效果圖。從中可以看到,在零相位(左下圈圈)處發(fā)生溢出,輸出cos值本應(yīng)該是+1,現(xiàn)在變成了-1。
圖3為只做賦值模塊的修正(上述第4步)時(shí)的仿真效果圖??梢钥吹剑阆辔?左下圈圈)處的溢出已經(jīng)被糾正,但是π/2相位(右上圈圈)處中間某級(jí)CORDIC迭代過(guò)程發(fā)生溢出,導(dǎo)致最終輸出誤差較大。
圖3 只做賦值模塊修正時(shí)仿真效果示意圖
圖4為做完完整修正步驟后的仿真效果圖??梢钥吹?處的溢出均已被消除。同時(shí)還可以看到,輸出覆蓋2000(14位補(bǔ)碼表示的-1)至1fff(14位補(bǔ)碼表示的1),因此輸出是滿(mǎn)刻度的。
圖4 完整修正后仿真效果示意圖
綜上所述,本發(fā)明解決了圓周旋轉(zhuǎn)CORDIC算法溢出問(wèn)題,嚴(yán)格控制了算法的輸出誤差,精確、滿(mǎn)刻度地產(chǎn)生了任意相位的正余弦值,同時(shí)該算法簡(jiǎn)單,占用資源少,在實(shí)際的DA電路中具有較大的應(yīng)用意義。