黃海生, 李龍龍
( 西安郵電大學(xué) 電子工程學(xué)院, 陜西 西安 710121)
北斗信號捕獲相位相干算法的設(shè)計(jì)與實(shí)現(xiàn)
黃海生, 李龍龍
( 西安郵電大學(xué) 電子工程學(xué)院, 陜西 西安 710121)
針對北斗二號衛(wèi)星導(dǎo)航系統(tǒng)信號捕獲運(yùn)算量大的問題,提出一種利用相位相干算法搜索起始碼相位的方法,并給出基于現(xiàn)場可編程門陣列(FPGA)的相位相干算法的具體實(shí)現(xiàn)方案,算法中關(guān)于旋轉(zhuǎn)因子運(yùn)算的問題主要借助坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算方法和查找表方法得以解決。編譯綜合及仿真結(jié)果皆表明,與傳統(tǒng)快速傅里葉變化(FFT)算法相比,新方法只需用到復(fù)數(shù)加法,運(yùn)算量小,且能正確捕獲信號。
相位相干算法;旋轉(zhuǎn)因子;現(xiàn)場可編程門陣列(FPGA);坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算方法(CORDIC)
北斗衛(wèi)星導(dǎo)航系統(tǒng)是我國正在實(shí)施自主研發(fā)和獨(dú)立運(yùn)行的全球衛(wèi)星導(dǎo)航系統(tǒng),它在亞太地區(qū)已經(jīng)初步形成了導(dǎo)航、授時(shí)和精密定位能力,應(yīng)用服務(wù)已經(jīng)擴(kuò)展到交通運(yùn)輸、測繪、氣象等相關(guān)領(lǐng)域。 傳統(tǒng)的北斗信號捕獲廣泛采用快速傅里葉變化(Fast Fourier Transform,F(xiàn)FT)獲得信號的初始碼相位,但隨著科技技術(shù)的快速發(fā)展,對于北斗信號的快速捕獲提出了更高標(biāo)準(zhǔn)的要求,傳統(tǒng)捕獲方法運(yùn)算量相對較大, 而且捕獲時(shí)間受限制, 為了適應(yīng)工作在高動(dòng)態(tài)環(huán)境下的要求, 有人提出了相位相干捕獲算法[1]。該算法在搜索偽隨機(jī)碼的相關(guān)峰值上比傳統(tǒng)的FFT算法運(yùn)算量更少,當(dāng)序列長度變大時(shí),其優(yōu)越性更加明顯。
本文擬基于現(xiàn)場可編程門陣列(Field-Programmable Gate Array,F(xiàn)PGA)芯片,利用硬件描述語言實(shí)現(xiàn)相位相干算法的設(shè)計(jì),根據(jù)算法的設(shè)計(jì)流程,對定點(diǎn)數(shù)位數(shù)調(diào)整來更好地達(dá)到設(shè)計(jì)精度要求。利用存儲(chǔ)器對數(shù)據(jù)中間值的存儲(chǔ),最終獲得碼起始相位值。
1.1 相位相干算法
相位相干算法的設(shè)計(jì)流程主要包括序列分割、相位相干和多層相位相干3部分。序列分割是將長度均為N=RC的本地序列L和接收序列R,皆分割成長度為C的R個(gè)子序列。相位相干將R個(gè)子序列轉(zhuǎn)換成R個(gè)幅度值和R個(gè)角度值的過程,其值用于序列所在行和列的計(jì)算。多層相位相干是根據(jù)運(yùn)算的需求以及子序列長度的滿足,對相位相干計(jì)算中得到的行值m所對應(yīng)長度為C的子序列再次進(jìn)行序列分割和相位相干的計(jì)算,最終根據(jù)行和列的值得到接收序列的起始相位值。
1.2 實(shí)現(xiàn)方式及運(yùn)算精度
采用定點(diǎn)數(shù)實(shí)現(xiàn)算法的運(yùn)算[2]。
由于考慮到運(yùn)算過程中誤差值的累積和中間值的變化,為達(dá)到設(shè)計(jì)中運(yùn)算精度的要求,所以將數(shù)值保留到小數(shù)點(diǎn)后4位。在設(shè)計(jì)中將相位角比特位設(shè)置為27位,其中1位符號位,9位整數(shù)位,17位小數(shù)位。幅度比特位設(shè)置為22位,其中1位符號位,6位整數(shù)位,15位小數(shù)位。借助Matlab內(nèi)部自帶的函數(shù)fi對數(shù)據(jù)進(jìn)行量化并編碼。fi函數(shù)表達(dá)式為fi(a,b,c,d),其中a代表需要量化的數(shù)據(jù),b代表符號位位數(shù)(默認(rèn)取值為1),c代表數(shù)據(jù)的總位數(shù),d代表小數(shù)位數(shù)。
根據(jù)偽隨機(jī)碼的產(chǎn)生原理[3],利用FPGA生成北斗衛(wèi)星B1頻點(diǎn)的普通測距碼(C碼)作為本地序列L,并將序列L進(jìn)行相應(yīng)的移位作為輸入序列S,然后通過相位相干算法對兩組輸入的序列進(jìn)行相應(yīng)處理,對于過程中的指數(shù)運(yùn)算均采用坐標(biāo)旋轉(zhuǎn)數(shù)字算法(Coordinate Rotation Digital Computer,CORDIC)來實(shí)現(xiàn)[4],運(yùn)算過程中的中間結(jié)果利用隨機(jī)存取存儲(chǔ)器(Random Access Memory, RAM)來存儲(chǔ)[5],通過各模塊的層層運(yùn)算,最終得出輸入序列的碼起始相位值??傮w設(shè)計(jì)如圖1所示。
圖1 基于FPGA的算法總體設(shè)計(jì)
2.1 北斗衛(wèi)星C碼產(chǎn)生器
B1頻點(diǎn)C碼產(chǎn)生器是由兩個(gè)長度為11位的反饋移位寄存器G1和G2構(gòu)成的,經(jīng)模2產(chǎn)生平衡Gold碼,再截?cái)?碼片,生成碼長為2046 chips,速率為2.046 MHz,周期為1 ms的普通測距碼。反饋電路由模2加法器實(shí)現(xiàn),G1對應(yīng)于特征多項(xiàng)式
1+x+x7+x8+x9+x10+x11,
G2對應(yīng)于特征多項(xiàng)式
1+x+x2+x3+x4+x5+x8+x9+x11。
兩者皆在同一個(gè)時(shí)鐘頻率2.046 MHz下工作,兩個(gè)移位寄存器的初值均為“01010101010”,且被預(yù)先置入寄存器。
通過對產(chǎn)生G2序列的移位寄存器不同抽頭的模2和可以實(shí)現(xiàn)G2序列相位的不同偏移,同G1序列模2后生成不同衛(wèi)星的測距碼。衛(wèi)星ID的確定是通過G2寄存器的兩個(gè)輸出位置來決定的。
B1頻點(diǎn)C碼產(chǎn)生器原理圖如圖2所示。
圖2 B1頻點(diǎn)C碼產(chǎn)生器原理
2.2 序列分割模塊
根據(jù)輸入序列進(jìn)行相應(yīng)分割??紤]到B1頻點(diǎn)中C碼的序列長度N=2046,故取R=33和C=62對序列進(jìn)行分割。
在系統(tǒng)時(shí)鐘的節(jié)拍下,先進(jìn)行列輸入,當(dāng)計(jì)數(shù)器值為32時(shí),進(jìn)行清零,并進(jìn)入下一列,直到將2046個(gè)碼片分割完。最終產(chǎn)生兩組存儲(chǔ)深度均為33的62位本地存儲(chǔ)器L和接收存儲(chǔ)器R。
2.3 初始化只讀內(nèi)存模塊
WC=exp( 2jπ/C),
而旋轉(zhuǎn)因子指數(shù)p的取值范圍為0~C-1。
由于C已知,所以利用Matlab生成旋轉(zhuǎn)因子的實(shí)部real和虛部imag的浮點(diǎn)值[7],利用函數(shù)fi(a,1,22,15)(其中a取實(shí)部或虛部的浮點(diǎn)值)進(jìn)行量化并編碼為22 bits的定點(diǎn)數(shù),最終初始化為相應(yīng)的ROM表,模塊輸出寬度均為22位的re[n]和im[n](n=0,1,…,33)。
2.4 判決及疊加模塊
由于C碼產(chǎn)生器輸出的有一定周期取值是0和1的離散碼序列,通過判決L和R中每個(gè)數(shù)據(jù)比特位的值對相應(yīng)的re[n]和im[n]值進(jìn)行加減。部分Verilog相關(guān)代碼如下。
if(L[m][n]==1)
begin
L_re[m]<=L_re[m]+re[n];
L_im[m]<=L_im[m]+im[n];
end
else
begin
L_re[m]<=L_re[m]-re[n];
L_im[m]<=L_im[m]-im[n];
end
2.5 CORDIC算法向量模式
CORDIC算法向量模式流水線結(jié)構(gòu)主要由寄存器、移位器和加減法器構(gòu)成[2],結(jié)構(gòu)如圖3所示。
圖3 CORDIC算法向量模式流水線結(jié)構(gòu)
將所輸入的實(shí)部和虛部數(shù)據(jù)從直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo),即可得到相應(yīng)的相位幅度和相位角。部分Verilog實(shí)現(xiàn)代碼如下。
if(y_in[21]~^x_in[21]==0)
begin
x_out<=x_in-(y_in>>>N);
y_out<=y_in+(x_in>>>N);
z_out<=z_in-SITA;
end
else
begin
x_out<=x_in+(y_in>>>N);
y_out<=y_in-(x_in>>>N);
z_out<=z_in+SITA;
end
最終所得到的z_out為相位解真值, 而x_out是將相位幅度真值放大Kn(畸變因子)倍后的值。在計(jì)算中,取迭代次數(shù)N=16可得畸變因子
如果計(jì)算中需要真實(shí)相位幅度,就需對x_out進(jìn)行除Kn校正。最后,根據(jù)輸入的實(shí)部和虛部的符號位,對相位角進(jìn)行相應(yīng)的處理,將角度范圍調(diào)整為[-π,π]。圖4是在x_in和y_in的輸入值均為-0.707 1的情況下,輸出結(jié)果的仿真圖。
圖4 相位和幅度輸出結(jié)果仿真
2.6 復(fù)數(shù)相位計(jì)算模塊
復(fù)數(shù)相位計(jì)算模塊實(shí)際上就是一個(gè)減法器,根據(jù)所在行值y∈(0,32)的不同,當(dāng)0≤i≤32-y時(shí),計(jì)算
L_phase[i]-R_phase[i+y],
當(dāng)33-y≤i≤32時(shí),計(jì)算
L_phase[i]-R_phase[i+y]-(360/62),
最終可以得到33×33=1 089個(gè)相位角值。
2.7 CORDIC算法旋轉(zhuǎn)模式
CORDIC算法旋轉(zhuǎn)模式結(jié)構(gòu)與向量模式一樣。不同點(diǎn)在于將所輸入的相位角度轉(zhuǎn)化為角度正弦和角度余弦。首先,對所輸入的相位角進(jìn)行象限標(biāo)記;其次將其修正在[0,π/2]范圍之內(nèi)。最后,根據(jù)象限標(biāo)記對正弦值和余弦值進(jìn)行相應(yīng)的修正。圖5是相位角為225°時(shí)輸出結(jié)果仿真圖。
圖5 正弦和余弦的輸出結(jié)果仿真
2.8 累加模塊
累加模塊的主要功能是將產(chǎn)生的1 089對C_real和C_imag,經(jīng)過累加產(chǎn)生33對sum_real和sum_imag。
2.9 判決及C碼起始相位計(jì)算模塊
該模塊首先對所得到的R個(gè)相位幅度進(jìn)行判決,如果存在其值等于R,從而得到該值所在的行d,那么說明搜索成功,反之亦然。當(dāng)搜索成功時(shí),C/A碼起始相位計(jì)算模塊根據(jù)該相位幅度所對應(yīng)的相位角計(jì)算出所在的列c。最后,根據(jù)
out=C×R+d
計(jì)算出C/A碼的起始相位值。
2.10 設(shè)計(jì)結(jié)果仿真與結(jié)果分析
根據(jù)N=2 046,故而R和C分別取值為33和62。產(chǎn)生一個(gè)本地序列L,將本地序列進(jìn)行隨機(jī)循環(huán)移位后作為輸入序列S,利用Modelsim進(jìn)行相關(guān)仿真。移位0位和左移1 022位后搜索到最大幅度值max_mag及其所對應(yīng)的相位值max_mag_phase的仿真結(jié)果分別如圖6和圖7所示。由結(jié)果可知,設(shè)計(jì)模塊搜索到正確峰值(由于設(shè)計(jì)中d值是從0開始的,所以對結(jié)果進(jìn)行了加1修正)。
圖6 零移位Modelsim仿真結(jié)果
圖7 左移1 022位Modelsim仿真結(jié)果
通過選用Altera公司生產(chǎn)的cyclone II系列的 EP2C35F672C6芯片,在Quartus II 9.0的開發(fā)環(huán)境下對代碼進(jìn)行編譯綜合,使用資源情況報(bào)告如圖8所示。
圖8 資源使用報(bào)告
實(shí)現(xiàn)了對碼相位相干算法的FPGA設(shè)計(jì),采用CORDIC算法,并應(yīng)用定點(diǎn)數(shù)以滿足算法的設(shè)計(jì)要求。仿真驗(yàn)證結(jié)果表明,設(shè)計(jì)達(dá)到預(yù)期目的,此設(shè)計(jì)可用于北斗衛(wèi)星信號偽隨機(jī)碼的捕獲。
[1] Chang Chieh-Fu, Hsieh Wan-Hsin, Kao Ming-Seng. A Novel Computationally Efficient Code Phase Acquisition Method[C]//Proceedings of the 24th International Technical Meeting of the Satellite Division of the Institute of navigation. Portland,Oregon, USA: ION GNSS 2011, 2011:2114-2116.
[2] 田耘,許文波,張延偉.無線通信FPGA設(shè)計(jì)[M].北京:電子工業(yè)出版社,2007:81-137.
[3] 崔保延. GPS軟件接收機(jī)基礎(chǔ)[M]. 2版. 陳軍,潘高峰,譯.北京:電子工業(yè)出版社,2007:63-87.
[4] 楊宏,李國輝,劉立新.基于FPGA的CORDIC算法的實(shí)現(xiàn)[J].西安郵電學(xué)院學(xué)報(bào),2008,13(1):75-77.
[5] 夏雨聞.Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M].2版.北京:北京航天大學(xué)出版社,2008:27-115.
[6] 高西全,丁玉美.數(shù)字信號處理[M].3版.西安:西安電子科技大學(xué)出版社,2008:110-120.
[7] 劉衛(wèi)國.MATLAB程序設(shè)計(jì)與應(yīng)用[M].2版.北京:高等教育出版社,2006:17-80.
[責(zé)任編輯:王輝]
Design and implement of Beidou signal acquisition phase coherence algorithm
HUANG Haisheng, LI Longlong
(School of Electronic Engineering, Xi’an University of Posts and Telecommunications, Xi’an 710121, China)
A method using Phase Coherence Algorithm to search initial code phase is proposed for the large signal acquisition and computation on BeiDou II Navigation Satellite System. A specific implementation scheme based on Field-Programmable Gate Array (FPGA) of Phase Coherence Algorithm is given accordingly. It mainly use Coordinate Rotation Digital Computer (CORDIC) algorithm and look-up table method to solve the twiddle factor operation problems in the algorithm. This method is validated on the cyclone II series FPGA of Altera. Simulation results show that compared to the traditional Fast Fourier Transform (FFT) algorithm, this method can greatly reduce computation and can correctly acquire signal by only using the complex addition.
phase coherence algorithms, twiddle factor, field-programmable gate array(FPGA), coordinate rotation digital computer(CORDIC)
10.13682/j.issn.2095-6533.2014.01.005
2013-09-27
陜西省科技統(tǒng)籌創(chuàng)新工程計(jì)劃戰(zhàn)略基金資助項(xiàng)目(2012KTCQ01-06);陜西省教育廳服務(wù)地方專項(xiàng)基金資助項(xiàng)目(2013JC10)
黃海生(1964-),男,教授,從事專用集成電路設(shè)計(jì)研究。E-mail: hhs@xupt.edu.cn 李龍龍(1988-),男,碩士研究生,研究方向?yàn)閷S眉呻娐吩O(shè)計(jì)。E-mail: 363732023@qq.com
TN492
A
2095-6533(2014)01-0026-05