侯武威,袁安民,趙穎輝
(空軍工程大學 電訊工程學院,陜西 西安710077)
傳統的數字下變頻器(DDC)是將本地數控振蕩器(NCO)產生的信號與輸入信號相乘實現數字下變頻。NCO產生離散正弦信號最簡單、最直接的方法就是查表法(LUT),即事先根據各個NCO正弦波相位計算好相應的正弦值,并按相位角度作為地址存儲該相位的正弦值數據[1]。
圖1為用查表法實現的NCO結構,DDC工作時,每向DDC輸入一個待下變頻的信號采樣樣本,NCO就增加一個相位增量,然后按照相位累加角度作為地址,檢查該地址上的數值并輸出到數字混頻器,與信號樣本相乘,完成數字下變頻。其中,初始相位控制字用來設置本振信號的初相,相位步進控制字用來設置本振信號的頻率。

圖1 查表法NCO基本結構Fig.1 Basic diagram of look-up table method NCO
CORDIC算法是由J.Volder等人在1959年首先提出的[2],該算法通過迭代方式僅用加法和移位2種運算進行矢量旋轉,不僅可以用來計算正余弦、極坐標和直角坐標變換與反變換、反正切、矢量求模,而且還可以實現反正弦和反余弦函數的計算,擺脫了用查表法產生離散正弦信號需要占用大量ROM資源的弊端。CORDIC算法由于只采用加法和移位運算,很適合在FPGA中實現,可以用來實現數字下變頻功能。
設一向量(x′1,y′1),旋轉 θ角后得新向量(x′2,y′2),如圖 2所示,根據坐標變換規則,兩者有如下關系:

圖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可以看做一個常數。
這樣,向量旋轉式(1)的計算問題轉換為式(7)的計算以及如下迭代運算。

式(8)中僅含移位、加減法算法,特別適合硬件實現,為硬件快速計算三角函數提供了一種新的算法,這就是提出CORDIC算法的初衷。迭代計算時,為了跟蹤已經旋轉的角度,還需引入一個新變量,定義為:

表示第i次旋轉后剩余未旋轉角度。上式中arctan(2-i)可以預先求出,保存在寄存器中。式(8)與式(9)構成了CORDIC算法的基本迭代關系。
為了能計算更多的基本函數,1971年,J.S.Walther提出了統一的CORDIC算法,引入參數m表示工作模式:m=1為圓周系統、m=0為線性系統、m=-1為雙曲系統,將3種系統統一到同一個CORDIC迭代方程中,表示為:

為了提高數控振蕩器的頻率分辨率,往往需要擴大存儲器的容量,造成存儲資源的大量消耗。因此,當設計高速、高精度的數控振蕩器時,查表法就不合適采用。因此,可以考慮利用算法實時產生正余弦樣本,基于矢量旋轉的CORDIC算法正好滿足這一需求,該算法有線性的收斂域和序列特性,只要迭代次數足夠,即可保證結果有足夠的精度[3]。
本文應用CORDIC算法圓周旋轉模式產生正余弦信號,令 m=1,則 θi=arctan2-i,旋轉方向由 zi決定,若 zi>0,則 δi=-1,若zi<0,則δi=+1,經過n次迭代最終使zi趨于0。迭代的最終結果為:


給定相位值,利用CORDIC算法就可以實時產生相對應的正余弦值,在本設計中,NCO產生的正余弦樣本要與接收信號 x(n)相乘,通過觀察式(9),本文給定初值 x0=x(n),y0=0,z0=φ,則式(9)可化為:

從式(13)可以看出,利用CORDIC算法同時實現了NCO和混頻器,既節省了資源,又提高了效率[4]。圖3給出了NCO和混頻器的實現框圖,在時鐘的控制下,頻率偏移控制字不斷調整本地頻率控制字,對調整后的頻率控制字進行累加,截取輸出值的高位與相位偏移控制字相加,每來一個時鐘,得到一個相位φ,利用CORDIC算法計算相位φ的正余弦值并與接收信號 x(n)相乘,得到 I(n)和 Q(n),同時實現了 NCO 及混頻器。

圖3 基于CORDIC算法的NCO和混頻器實現框圖Fig.3 Block diagram of NCO and frequency mixer based on CORDIC algorithm
CORDIC迭代算法的一種直接實現方式是反饋結構[5],此結構只設計一級CORDIC運算迭代單元,然后在系統時鐘的驅動下,將本級的輸出作為本級的輸入,通過同一級迭代完成運算。這種方法硬件開銷很小,但控制比較復雜,而且完成一次CORDIC運算需要多個時鐘周期,運算速度較慢不利于數據的高速實時處理。
CORDIC迭代算法的另一種實現方式是流水線結構,每一級CORDIC迭代運算都使用單獨的一套運算單元,它的處理速度非常快,為數據實現高速實時處理提供了前提[6]。每一級實現的功能是根據式(8)和式(9)進行一次迭代,移位的位數等于當前的迭代級數,加減法選擇由該級中z的最高位(符號位)決定,得到下一級的x、y和z的值。經過N級流水線運算后,z的值變為0,x和y的值則為初始值z的余弦和正弦值。可以看出,在迭代過程每一級電路結構中只有移位和加減運算,級與級之間直接相連,不需要額外的寄存器,特別適合于FPGA實現,其結構如圖4所示。


圖4 CORDIC算法流水線結構圖Fig.4 Structure diagram of CORDIC pipeline implementation


圖5 NCO及混頻器仿真結果Fig.5 Simulation result of NCO and frequency mixer

圖6 I路信號和Q路信號的頻譜Fig.6 Frequency spectrum of I and Q
本文提出了一種基于CORDIC算法的數字下變頻方法,克服了傳統數字下變頻器查詢表大的缺點,而且該算法將NCO和混頻器合在一起完成,占用資源少,效率高、速度快、精度高,采用流水線結構,只有加法和移位單元,易于FPGA實現,具有較高的工程應用價值。
[1]楊小牛,樓才義.軟件無線電原理與應用[M].北京:電子工業出版社,2005.
[2]Volder J E.The CORDIC trigonometric computing technique[J].IRETransactionsonElectronicComputers,1959,8(3):330-334.
[3]趙林軍.基于CORDIC算法的DDC實現[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].現代雷達,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實現[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算法結構[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中的應用[M].北京:國防工業出版社,2006.