GPS课程设计实验报告(2)学院姓名LSC班级学号指导教员一、试验名称:GPS信号捕获二、试验目的:1.熟悉GPS信号捕获基本概念;2.掌握串行搜索算法、并行频率搜索算法和并行码相位搜索捕获算法的基本思想、特点及算法流程;3.训练在实际当中分析问题、解决问题的能力。三、试验内容1.编写GPS信号捕获子程序,算法自选。2.将实验一最终生成的信号延迟时间,并加上大小为Df的多普勒频移,使用以上编写的信号捕获子程序对该信号进行捕获。3.画出三维捕获结果图(要求至少画出两幅,一幅对应信号成功捕获,一幅对应未捕获到信号)。四、试验原理4.1概述为了跟踪和解码GPS信号,首先要捕获到GPS信号。将捕获到的GPS信号的必要参数立刻传递给跟踪过程,再通过跟踪过程便可得到卫星的导航电文。GPS卫星处于高速运动中,因此,其频率会产生多普勒频移。为覆盖高速卫星预期中的所有多普勒频率范围,捕获方法覆盖的频率范围必须在±10kHz之内。针对某个特定的卫星信号,捕获过程就是要找到C/A码的起始点,并利用找到的起始点展开C/A码频谱,一旦复现了C/A码的频谱,输出信号将变成连续波(ContinuousWave,CW),于是便得到其载波频率。也就是说,捕获过程就是要获得输入信号的C/A码的起始点和载波频率,然后传递给跟踪过程。4.2卫星信号捕获的考虑4.2.1捕获时的最大电文长度C/A码长1ms,那么至少要用1ms的电文来捕获,甚至只用1ms的电文来捕获时,都可能发生导航电文相位偏移。因此,为了保证捕获电文中不含有数据偏移,需要用两组连续的电文来捕获,这个电文最大长度是10ms。如果使用两组连续的10ms电文来捕获,就保证了在某一组电文中不含相位偏移。限制电文长度的第二个因素是C/A码的多普勒效应。4.2.2捕获中的频率步长捕获时的另一个考虑因素是捕获中剥离载波所需的频率。步进频率的大小与捕获中的电文长度紧密相关。如果输入信号与本地混频信号相距1个周期,它们两者没有相关性;如果两者小于1个周期,则它们有部分相关性。解决信号周期和步进频率问题的一个简单方法是频率相离与电文长度成反向关系。可得出如下结论:捕获中的操作执行次数与总的数据点并不是成线性比例关系,当电文长度从1ms上升到10ms时,电文长度上升10倍,频率点数目也上升了10倍,捕获所需的操作次数上升了不止10倍。因此,实际捕获时,如果强调捕获的速度的话,电文长度需保持在最小值。执行次数的增加,取决于实际捕获所用的方法,下面将讨论具体的捕获方法。4.3GPS卫星信号的捕获方法4.3.1传统捕获方法捕获的基本思想就是展开输入信号,找到载波频率。如果相位正确的C/A码与输入信号相乘,输入信号将如图4-1中所示变成一个连续信号。图3-1中最上端是输入信号,这个信号是C/A码编码的射频信号相位。中间的图表示C/A码,其值在±1之间。最下端的图是连续信号,代表输入信号与C/A码的乘积,是一个连续信号,这个过程有时称做输入信号的C/A码剥离。图4-1C/A编码的输入信号与本地C/A码相乘3.3.2C/A码数值分析一旦输入变成连续信号,通过傅立叶变换可以知晓其频率。可以设置一个阈值,即一个门限来判断一个频率分量是否足够大。高于这个门限的最高频率分量就是我们要找的频率。由于输入信号中C/A码的起始点还未知,因此,必须先找到这个点。为了找到这个点,我们产生本地的一个C/A码,将其数字化为5000个点,且与输入信号点对点相乘,对此乘积的结果进行FFT或DFT,可以找到其频率。通过这种方法,可以用时间分辨率为200ns(1/5MHz)和1kHz的频率分辨率找出C/A码的起始点。如果使用10ms的电文,因为信号只需要卷积1ms,因此需要5000次操作。每次操作包含50000个点对点乘积和50000次FFT,总共有1.25×108(5000×25000)个输出结果。五、Matlab代码及实现5.1主程序代码:clc,clearall;%产生C/A码G1=[1,1,1,1,1,1,1,1,1,1];G2=[1,1,1,1,1,1,1,1,1,1];TapArray=[3,7];CACode=Create_CA_Code(G1,G2,TapArray);%saveCA码.matCACode%figure(1),plot(1:1023,CACode);%axis([1102301]);%title('C/A码');%step2:产生导航电文NavigationData=Create_NavigationData();%save导航电文.matNavigationDataFirstFrameNavigationData=NavigationData(1:300);%figure(2),plot(1:300,FirstFrameNavigationData);%axis([130001]);%title('导航电文第一子帧的数据');%用C/A码来调制导航电文的第一帧Baseband_Signal=SpreadSpectrum(FirstFrameNavigationData,CACode);%saveCA码基带信号.matBaseband_Signal;%figure(3),plot(Baseband_Signal);%title('CA码基带信号');%调制发射传输CA码基带信号SNR=-20;%信噪比IFSignal=IF_BasebandSignal(Baseband_Signal,SNR);save收到的射频信号.matIFSignal%捕获C/A码信号freq_doppler=5e3;Capture_CACode(IFSignal,CACode,freq_doppler);5.2子程序代码5.2.1C/A码产生(与实验一相同):functionCACode=Create_CA_Code(G1,G2,TapArray)%G1代表当前移位寄存器的状态%G2代表当前移位寄存器的状态%TapArray代表G2的抽头数G1=cast(G1,'logical');G2=cast(G2,'logical');tap1=TapArray(1);tap2=TapArray(2);code=zeros(1,1023);fori=1:1023temp=xor(G2(tap1),G2(tap1));%5号卫星,抽头1和9code(i)=xor(G1(10),temp);temp=xor(G1(3),G1(10));G1=[temp,G1(1:9)];temp=xor(G2(2),G2(3));temp=xor(temp,G2(6));temp=xor(temp,G2(8));temp=xor(temp,G2(9));temp=xor(temp,G2(10));G2=[temp,G2(1:9)];endcode=cast(code,'double');CACode=code;5.2.2多普勒频移functionIFSignal=IF_BasebandSignal(Baseband_Signal,SNR)F0=2e6;%中频频率为2MHzFs=5e6;%采样率为5MHzfreq_doppler=9e3;%多普勒频偏code_doppler=freq_doppler*1.023/1575.42;%相应的码偏Fc=1.023e6+code_doppler;%码率code_phase=1500;%初始码相位T=5;N=(Fs/1e3)*T;%数据长度code_data=Baseband_Signal(1:1023);code_data=2*code_data-1;index=(code_phase+(1:N))/Fs;index_code=floor(mod(index*Fc,1023))+1;sample_code=code_data(index_code);carrier_cos=cos(2*pi*(F0+freq_doppler)*index);signal_I=(carrier_cos.*sample_code)*sqrt(2*10^(0.1*SNR))+randn(1,N);IFSignal=signal_I;5.2.3产生导航电文functionNavigationData=Create_NavigationData()%功能:产生一个周期的导航电文数据,长度为1500*25=37500bit%一个周期包含25帧%一帧数据长度为1500bit%一帧包含5个子帧,每个子帧长度为300bitone_page=randn(1,1500);%一页one_page(find(one_page0))=1;one_page(find(one_page0))=0;week_number=[1010101010];%星期数,每页更新一次one_page(61:70)=week_number;tlm=ones(1,30);tow=ones(1,17);%TOW,每帧更新一次how=[tow,zeros(1,13)];fori=0:4%一页one_page(i*300+1:i*300+60)=[tlm,how];endforj=0:24%一个周期one_period(j*1500+1:j*1500+1500)=one_page;endNavigationData=one_period;5.2.4C/A码捕获:functionCACode=Capture_CACode(IFSignal,CACode,freq_doppler)N=length(IFSignal);F0=2e6;%中频频率为2MHzFs=5e6;%采样率FSN=Fs/1e3;NA=5;%累积次数%生成本地C码phase_shift=0;%本地码码偏index=(1:FSN*NA)/Fs;index_code=floor(mod(index*1.023e6+phase_shift,1023))+1;index_code(find(index_code==0))=1023;local_code=CACode;local_code=2*local_code-1;local_code=local_code(index_code);%捕获forfindex=1:40f=(findex-20)*500;signal_f=IFSignal(1:FSN*NA).*exp(j*2*pi*(F0-f)*(1:FSN*NA)/5e6);sat_mat=reshape(signal_f(1:FSN*NA),FSN,NA);lcode_mat=reshape(local_code(1:FSN*NA),FSN,NA);fs=fft(sat_mat);fl=fft(lcode_mat);mu=conj(fs).*fl;cr=(ifft(mu))';i=1:NA;accu(findex,:)=sum(abs(cr(i,:)));end%捕获结果[aa,bb]=max(accu);[cc,dd]=max(aa);a=cc;b=bb(dd);c=dd;phase_shift=c-1%码相位freq=-1*(b-20)*500%频偏CACode=accu;%figure(1)subplot(211);mesh(CACode);subplot(212);plot(CACode(b-1,:));5.3试验截图