北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB 程序)北斗卫星导航信号串行捕获算法MATLAB仿真报告一、原理卫星导航信号的串行捕获算法如图1所示。
××∑∫( )2本地PRN发生器∫( )2本地载波发生器GPS中频信号×判决检波器≥VT?Yes 转跟踪NO 继续搜索图1 卫星导航信号的串行捕获算法接收机始终在本地不停地产生对应某特定卫星的本地伪码,并且接收机知道产生的伪码的相位,这个伪码按一定速率抽样后与接收的GPS中频信号相乘,然后再与同样知晓频率的本地产生的载波相乘。
GPS中频信号由接收机的射频前端将接收到的高频信号下边频得到。
实际产生对应相位相互正交的两个本地载波,分别称为同相载波和正交载波,信号与本地载波相乘后的信号分别成为,产生同相I支路信号和正交的Q 支路信号。
两支路信号分别经过一个码周期时间的积分后,平方相加。
分成两路是因为C/A码调制和P码支路正交的支路上,假设是I支路。
当然由于信号传输过程中引入了相位差,解调时的I支路不一定是调制时的I支路,Q支路也一样,二者不一定一一对应,因此为了确定是否检测到接收信号,需要同时对两支路信号进行研究。
相关后的积分是为了获取所有相关数据长度的值的相加结果,平方则是为了获得信号的功率。
最后将两个支路的功率相加,只有当本地伪码和本地载波的频率相位都与中频信号相同时,最后得到的功率才很大,否则结果近似为零。
根据这个结论考虑到噪声的干扰,在实际设计时应该设定一个判定门限,当两路信号功率和大于设定的门限时则判定为捕获成功,转入跟踪过程,否则继续扫描其它的频率或相位。
二、 MATLAB 仿真过程及结果仿真条件设置:抽样频率16MHz ,中频5MHz ,采样时间1ms ,频率搜索步进1khz ,相位搜索步进1chip ,信号功率-200dBW ,载噪比55dB(1) 中频信号产生卫星导航信号采用数字nco 的方式产生,如图2所示。
载波nco 控制字为:carrier_nco_word=round(f_carrier*2^N/fs); 伪码nco 控制字为:code_nco_word=round(f_code*2^N/fs);32位Adder12位载波rom模2046计数器伪码rom32位Adder Divide by 2^20溢出时输出脉冲carrier_nco_wordcode_nco_wordfsample××+幅度加性噪声图 2其中载波rom 存储的是正弦信号的2^12个采样点,伪码rom 存储长度为2046的卫星伪码。
这样伪码采用2psk 的方式调制到射频,加性噪声很小是理想接收中频信号如图3所示。
-10图3 理想中频信号(2)噪声功率估计实际接收机接收到的导航信号淹没在噪声中,本程序对接收到的信号进行了噪声估计并进行了放大。
采用滑动平均估计法估计噪声功率,滑动平均估计法原理如图4所示。
图4 噪声功率滑动平均估计法原理迭代滤波器因子取0.8.功率估计结果是-191.48dBW 。
仿真中将接收中频信号放大到了signal_power_dB=-4.94dBW 。
这个功率与后面的判决门限有关系。
(2) 检测门限的确定常见的检测方法有幅度检波、平方检波和平方律检波。
幅度检波器的输出为在H0假设下,z(k) 服从瑞利分布,其概率密度函数为:幅度检波器NQ ∑=iN n niQ N 121迭代低通滤波器标度因子比较器+-σTV 比较结果XI psQ )()()(22k Q k I k Z +=2在H(1)假设下,z(k)服从莱斯分布,其概率密度函数为式中,为零阶修正的贝塞尔函数。
平方律检波输出为:在H0假设下,z(k)服从自由度为 2M 的 伽马分布,其概率密度函数为在H1假设下,z(k)服从自由度为 2M 的 卡方分布,其概率密度函数为当 M=1时,平方检波累积器就变成平方律检波器 ,可以计算出当归一化门限为Vt 时其虚警概率为:其中 采用恒虚警率检测,设虚警率为pfa ,本仿真取0.1 ,采用平方律检波,归一化判决门限为Vt=(-2*log2(pfa))^0.5,实际判决门限为VT=Vt*signal_power (3) 判决算法常见判决算法有单次判决、M/N 判决、(M/N+1)判决和Tong 判决,采用单次判决,虚警率为pfa=0.1 . 归一化检测门限为Vt=2.5776,判决门限为VT=0.8248; (5)仿真结果2210222000(/)exp[]() 02kk k k kk k Z Z D D Z f Z H I Z σσσ+=-⋅≥)(0⋅I ∑=+=Mi i Q i I k Z 122)]()([)(0)2exp()()2(1)/(21200≥-⋅Γ=-k kM k M k Z Z Z M H Z f σσ11/22112220001()(/)()exp()() 022M k k k k M k Z Z Z f Z H I Z λλσλσσ--+=⋅-⋅≥02201(/)exp[]221exp 2TTkfa k k k V V t Z P f Z H dZ dZ V σσ+∞+∞==-⎧⎫=-⎨⎬⎩⎭⎰⎰2t T V V σ=搜索21个多普勒频点和40和相位点,仿真设置接收中频为4.991MHz ,相位为2,结果如图5所示。
4.99555.0055.01x 1061020304050100150dopplercodephase图中最大处的相关结果是144,其他非峰值最大的约为1.约21dB。
部分相关值如下表:可以看出绝大部分数值都在门限之下,但也存在若干个在门限之上的数值,这些点可能造成虚警。
附:仿真主程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%´®Ðв¶»ñËã·¨·ÂÕæ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%clear all;clc;% f_doppe=5000;fsample=21e6;f_m=5e6;t_sim=1e-3/1;df=1/t_sim;cnt_det=1; %Åоö´ÎÊýf_carrier=f_m-9*df; %½ÓÊÕÔØ²¨ÆµÂÊf_code=2.046e6; %αÂëËÙÂÊcode_phase_init=2; %Ê×´ÎËÑË÷ʱ½ÓÊÕÂëÏàλcode_phase_init_cmp=code_phase_init;f_local_init=f_m-10*df; %±¾µØÔز¨nco³õʼƵÂÊlocal_code_phase=3; %%%%±¾µØÎ±ÂëÏàλcnt_doppler=21;cnt_phase=40;dot_num=t_sim*fsample; %·ÂÕæÒ»¸öαÂëÖÜÆÚµÄµãÊýdBW_signal_pow=-200;dB_C_I=60;Am=10^(dBW_signal_pow/20)*2^0.5;pre_noise_power=dBW_signal_pow-dB_C_I+(10*log10(f_carrier));corr_result1=zeros(cnt_doppler,cnt_phase);for dect_num=1:cnt_det %Åоö´ÎÊýfor num_phase=1:cnt_phase %²éÕÒÏàλµãµãfor num_doppeler=1:cnt_doppler %µ¥´Î²éÕÒ¶àÆÕÀÕµãif num_doppeler==1f_local=f_local_init;elsef_local=f_local+df;endsignal_r=signal_gen(fsample,f_carrier,f_code,code_phase_init,dBW_sign al_pow,dB_C_I,dot_num); %%%%%ÕâÀïÔØ²¨Ö¸ÏÂ±ßÆµºóµÄÖÐÆµ,ÊÕµ½ºó´¦Àí·¢Ë͵Ϭ¶¯±êÖ¾£¬ËÑË÷ÏÂÒ»¸öÏàλ%%%%Ê×´ÎËÑË÷¹À¼ÆÐźŹ¦ÂÊif num_doppeler==1 & num_phase==1Ni=10;signal_r1=zeros(1,length(signal_r)+Ni);Qn1=zeros(1,length(signal_r)+Ni);Qn2=zeros(1,length(signal_r)+Ni);Qn3=zeros(1,length(signal_r)+Ni);pow_noise=zeros(1,10);for bbb=1:10for aaa=1:length(signal_r)/10signal_r1(aaa)= signal_r(aaa)*signal_r(aaa) ;a=0.8; %µü´úÂ˲¨Æ÷ϵÊý% Qn2(aaa+1)= signal_r1(aaa)*signal_r1(aaa);Qn1(aaa+Ni)=sum(signal_r1( (aaa):(aaa+Ni)))/Ni;%»¬¶¯Æ½¾ùQn(aaa)= Qn1(aaa+1)^0.5;Qn3(aaa+1)= a*Qn1(aaa)+(1-a)*Qn1(aaa+1);pow_noise1=Qn3(aaa+1);endpow_noise2(bbb)=pow_noise1;endpow_noise=sum(pow_noise2(1:10))/10;pow_noise_dB=10*log10(pow_noise);AD_min_volt=0.8;AD_R=1;AD_power=0.5*AD_min_volt*AD_min_volt/AD_R;AD_power_dB=10*log10(AD_power);Am1=AD_power_dB-pow_noise_dB;Am1=10^(Am1/20);endsignal_r=signal_r*Am1; %ÖÐÆµ·Å´óAm_local=0.9;local_carrier=local_carrier_gen(fsample,dot_num,f_local,Am_local);%%%flocal°üº¬Á˶àÆÕÀÕlocal_code=local_code_gen(f_code,fsample,dot_num,local_code_phase)*Am _local;corr_result(num_phase,num_doppeler)=deal_local(signal_r,local_carrier ,local_code);% corr_result1(num_doppeler,cnt_phase)=corr_result;end% pulse_next_phase=1;code_phase_init=mod(code_phase_init+1,2046);% local_code_phase=local_code_phase+1;end%%%%²éÕÒµ¥´Î²¶»ñ×î´óÖµ¼«Î»ÖÃ[phase_max(dect_num)doppler_max(dect_num)]=find(corr_result==max(max(corr_result)));mod_max(dect_num)=max(max(corr_result));det_phase=local_code_phase-phase_max+1;det_doppler=(doppler_max-1)*df+f_m-10*df;disp(det_phase); disp(det_doppler);%%%%%%% %%%%%%% %%%%%%% %%%%%%% ÇóÅоöÃÅÏÞ ºãÐ龯ÂÊ%±ê¶ÈÒò×ÓÊÇÅоöÃÅÏÞÓëÔëÉù¹¦ÂʵıÈÖµfa=0.1;Vt=(-2*log2(fa))^0.5; %¹éÒ»»¯ÅоöÃÅÏÞ% Vt=0;%¾-¹ý·Å´óºó¹¦ÂÊΪAD_power% VT=( Vt*pow_noise );VT=Vt*AD_power ;if mod_max(dect_num)> VT %ƽ·½Âɼ첨flag_det=1;elseflag_det=0;end%Tong¼ì²âK=1;B=2;if flag_det==1K=K+1;elseK=K-1;endif K>=Bdisp('success!');elseif dect_num==cnt_detdisp('failed!');endendendcorr_result_dB=10*log10(corr_result/mod_max);cnt_doppler1=f_m-10*df:df:f_m+10*df;mesh(1:cnt_doppler,1:cnt_phase,corr_result);xlabel('doppler');ylabel( 'code_phase');11。