侯武威,袁安民,趙穎輝
(空軍工程大學 電訊工程學院,陜西 西安710077)
傳統(tǒng)的數(shù)字下變頻器(DDC)是將本地數(shù)控振蕩器(NCO)產(chǎn)生的信號與輸入信號相乘實現(xiàn)數(shù)字下變頻。NCO產(chǎn)生離散正弦信號最簡單、最直接的方法就是查表法(LUT),即事先根據(jù)各個NCO正弦波相位計算好相應(yīng)的正弦值,并按相位角度作為地址存儲該相位的正弦值數(shù)據(jù)[1]。
圖1為用查表法實現(xiàn)的NCO結(jié)構(gòu),DDC工作時,每向DDC輸入一個待下變頻的信號采樣樣本,NCO就增加一個相位增量,然后按照相位累加角度作為地址,檢查該地址上的數(shù)值并輸出到數(shù)字混頻器,與信號樣本相乘,完成數(shù)字下變頻。其中,初始相位控制字用來設(shè)置本振信號的初相,相位步進控制字用來設(shè)置本振信號的頻率。
圖1 查表法NCO基本結(jié)構(gòu)Fig.1 Basic diagram of look-up table method NCO
CORDIC算法是由J.Volder等人在1959年首先提出的[2],該算法通過迭代方式僅用加法和移位2種運算進行矢量旋轉(zhuǎn),不僅可以用來計算正余弦、極坐標和直角坐標變換與反變換、反正切、矢量求模,而且還可以實現(xiàn)反正弦和反余弦函數(shù)的計算,擺脫了用查表法產(chǎn)生離散正弦信號需要占用大量ROM資源的弊端。CORDIC算法由于只采用加法和移位運算,很適合在FPGA中實現(xiàn),可以用來實現(xiàn)數(shù)字下變頻功能。
設(shè)一向量(x′1,y′1),旋轉(zhuǎn) θ角后得新向量(x′2,y′2),如圖 2所示,根據(jù)坐標變換規(guī)則,兩者有如下關(guān)系:
圖2 CORDIC算法原理圖Fig.2 Principle block diagram of CORDIC algorithm
式(2)可改寫為:
當 N→∞ 時,有 zi+1=zi-δiarctan(2-i),i=0,1,2,…,N-1,θ,故K可以看做一個常數(shù)。
這樣,向量旋轉(zhuǎn)式(1)的計算問題轉(zhuǎn)換為式(7)的計算以及如下迭代運算。
式(8)中僅含移位、加減法算法,特別適合硬件實現(xiàn),為硬件快速計算三角函數(shù)提供了一種新的算法,這就是提出CORDIC算法的初衷。迭代計算時,為了跟蹤已經(jīng)旋轉(zhuǎn)的角度,還需引入一個新變量,定義為:
表示第i次旋轉(zhuǎn)后剩余未旋轉(zhuǎn)角度。上式中arctan(2-i)可以預(yù)先求出,保存在寄存器中。式(8)與式(9)構(gòu)成了CORDIC算法的基本迭代關(guān)系。
為了能計算更多的基本函數(shù),1971年,J.S.Walther提出了統(tǒng)一的CORDIC算法,引入?yún)?shù)m表示工作模式:m=1為圓周系統(tǒng)、m=0為線性系統(tǒng)、m=-1為雙曲系統(tǒng),將3種系統(tǒng)統(tǒng)一到同一個CORDIC迭代方程中,表示為:
為了提高數(shù)控振蕩器的頻率分辨率,往往需要擴大存儲器的容量,造成存儲資源的大量消耗。因此,當設(shè)計高速、高精度的數(shù)控振蕩器時,查表法就不合適采用。因此,可以考慮利用算法實時產(chǎn)生正余弦樣本,基于矢量旋轉(zhuǎn)的CORDIC算法正好滿足這一需求,該算法有線性的收斂域和序列特性,只要迭代次數(shù)足夠,即可保證結(jié)果有足夠的精度[3]。
本文應(yīng)用CORDIC算法圓周旋轉(zhuǎn)模式產(chǎn)生正余弦信號,令 m=1,則 θi=arctan2-i,旋轉(zhuǎn)方向由 zi決定,若 zi>0,則 δi=-1,若zi<0,則δi=+1,經(jīng)過n次迭代最終使zi趨于0。迭代的最終結(jié)果為:
給定相位值,利用CORDIC算法就可以實時產(chǎn)生相對應(yīng)的正余弦值,在本設(shè)計中,NCO產(chǎn)生的正余弦樣本要與接收信號 x(n)相乘,通過觀察式(9),本文給定初值 x0=x(n),y0=0,z0=φ,則式(9)可化為:
從式(13)可以看出,利用CORDIC算法同時實現(xiàn)了NCO和混頻器,既節(jié)省了資源,又提高了效率[4]。圖3給出了NCO和混頻器的實現(xiàn)框圖,在時鐘的控制下,頻率偏移控制字不斷調(diào)整本地頻率控制字,對調(diào)整后的頻率控制字進行累加,截取輸出值的高位與相位偏移控制字相加,每來一個時鐘,得到一個相位φ,利用CORDIC算法計算相位φ的正余弦值并與接收信號 x(n)相乘,得到 I(n)和 Q(n),同時實現(xiàn)了 NCO 及混頻器。
圖3 基于CORDIC算法的NCO和混頻器實現(xiàn)框圖Fig.3 Block diagram of NCO and frequency mixer based on CORDIC algorithm
CORDIC迭代算法的一種直接實現(xiàn)方式是反饋結(jié)構(gòu)[5],此結(jié)構(gòu)只設(shè)計一級CORDIC運算迭代單元,然后在系統(tǒng)時鐘的驅(qū)動下,將本級的輸出作為本級的輸入,通過同一級迭代完成運算。這種方法硬件開銷很小,但控制比較復(fù)雜,而且完成一次CORDIC運算需要多個時鐘周期,運算速度較慢不利于數(shù)據(jù)的高速實時處理。
CORDIC迭代算法的另一種實現(xiàn)方式是流水線結(jié)構(gòu),每一級CORDIC迭代運算都使用單獨的一套運算單元,它的處理速度非常快,為數(shù)據(jù)實現(xiàn)高速實時處理提供了前提[6]。每一級實現(xiàn)的功能是根據(jù)式(8)和式(9)進行一次迭代,移位的位數(shù)等于當前的迭代級數(shù),加減法選擇由該級中z的最高位(符號位)決定,得到下一級的x、y和z的值。經(jīng)過N級流水線運算后,z的值變?yōu)?,x和y的值則為初始值z的余弦和正弦值??梢钥闯?,在迭代過程每一級電路結(jié)構(gòu)中只有移位和加減運算,級與級之間直接相連,不需要額外的寄存器,特別適合于FPGA實現(xiàn),其結(jié)構(gòu)如圖4所示。
圖4 CORDIC算法流水線結(jié)構(gòu)圖Fig.4 Structure diagram of CORDIC pipeline implementation
圖5 NCO及混頻器仿真結(jié)果Fig.5 Simulation result of NCO and frequency mixer
圖6 I路信號和Q路信號的頻譜Fig.6 Frequency spectrum of I and Q
本文提出了一種基于CORDIC算法的數(shù)字下變頻方法,克服了傳統(tǒng)數(shù)字下變頻器查詢表大的缺點,而且該算法將NCO和混頻器合在一起完成,占用資源少,效率高、速度快、精度高,采用流水線結(jié)構(gòu),只有加法和移位單元,易于FPGA實現(xiàn),具有較高的工程應(yīng)用價值。
[1]楊小牛,樓才義.軟件無線電原理與應(yīng)用[M].北京:電子工業(yè)出版社,2005.
[2]Volder J E.The CORDIC trigonometric computing technique[J].IRETransactionsonElectronicComputers,1959,8(3):330-334.
[3]趙林軍.基于CORDIC算法的DDC實現(xiàn)[J].微計算機信息,2008,24(10):274-275.
ZHAO Lin-jun.Theimplementation ofDDC based on CORDIC algorithm[J].Microcomputer Information,2008,24(10):274-275.
[4]張科峰,彭帥,蔡夢.基于CORDIC算法的NCO[J].現(xiàn)代雷達,2008,30(6):91-94.
ZHANG Ke-feng,PENG Shuai,CAI Meng.The NCO based on CORDIC algorithm[J].Modern Radar,2008,30(6):91-94.
[5]駱艷卜,張會生,張斌.一種CORDIC算法的FPGA實現(xiàn)[J].計算機仿真,2009,26(9):305-307.
LUO Yan-bo,ZHANG Hui-sheng,ZHANG Bin.FPGA implementationofaCORDIC algorithm [J].Computer Simulation,2009,26(9):305-307.
[6]楊宇,毛志剛,來逢昌.一種改進的流水線CORDIC算法結(jié)構(gòu)[J].微處理機,2006(4):10-13.
YANG Yu,MAO Zhi-gang,LAI Feng-chang.An improved pipeline structure for CORDIC algorithm[J].Microprocessors,2006(4):10-13.
[7]王旭東,潘廣楨.MATLAB及其在FPGA中的應(yīng)用[M].北京:國防工業(yè)出版社,2006.