if (x2(i)==x2(i-1)) y2(m)=x2(i); t2(m)=t(i); m=m+1; else
y2(m)=x2(i-1); y2(m+1)=x2(i); t2(m)=t(i);
t2(m+1)=t(i)+0.01; m=m+2; end
if (x3(i)==x3(i-1)) y3(n)=x3(i); t3(n)=t(i); n=n+1; else
y3(n)=x3(i-1); y3(n+1)=x3(i); t3(n)=t(i);
t3(n+1)=t(i)+0.01; n=n+2; end end
%%%%%%画图说明产生的三组伪随机码%%%%% subplot(3,1,1); plot(t1,y1,′y′); grid on; 
subplot(3,1,2); plot(t2,y2,′y′); grid on; 
subplot(3,1,3); plot(t3,y3,′y′); grid on;
whitebg(′black′); 
%将三组伪随机值存放到新矩阵并传送到Workspace中, 方便以后调用数据% simin1=[t1;y1]′; simin2=[t2;y2]′; simin3=[t3;y3]′;
输入上面的文本后,运行得到如图5-29所示的伪随机码。 其结果还可以通过Workspace查看,之所以要传送到Workspace中, 是因为我们在后面的仿真中还要用到这些伪随机码。
图 3.8 模拟三组伪随机码的仿真示意图
3.5.2 获取导航信息的仿真
在这个仿真中,我们要得到卫星的导航信息,其中忽略了频率偏移,且卫星信号的数据是基于前面章节中得到的卫星数据,存放在GPSsignal.mat文件中。在运行程序之前, 我们必须将GPSsignal.mat中的数据传送到Workspace中。
clear; %清除所有的变量 clc; %关闭所有指令窗
close all; %关闭所有未隐藏的窗口
load GPSsignal.mat %从GPSsignal.mat中获得所有变量到Workspace中 %n=length(GPSsignal); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SvNum=12;
%调用fGenerateCAcode3.m文件, 获得卫星编号为12的CA码 Temp=fGenerateCAcode3(SvNum);
index1=find(Temp==0); %找出CA码中的低电平, 形成列向量存放在index1中 Temp(index1)=-ones(1,length(index1)); %返回一个与index1相同长 度的一维数组
SinWave=sin([0:2*pi8:2*pi*78]); %产生一个步进2*pi8的正弦波
SinWave=single(SinWave); %将SinWave矩阵转换成单精度矩阵 GpsMatch=zeros(1,1); %生成一个1*1的零矩阵 SinWave=[SinWave SinWave SinWave SinWave SinWave]; 
GPSsignal.mat %生成一个5 ms的连续信号 for i=1:length(Temp)
GpsMatch=[GpsMatch Temp(1,i)*SinWave]; end
GpsMatch=GpsMatch(2:length(GpsMatch)); %生成本地匹配信号并去掉第一个元素 n=length(GpsMatch); m=50000; for i=1:m
Res(i)=GpsMatch*GPSsignal(1,i:i+n-1)′; 
%将本地生成匹配信号GpsMatch与GPSsignal循环卷积 end
plot(1:m,Res); %图示卷积的幅值 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Res2=abs(Res);
for i=1:100 %该循环目的是找出Res中的最大值 [C I]=max(Res2); Res2(1,I)=0; Index(1,i)=I; end; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %下面是要找到GPS signal中的导航电文%
%方法是检验GPS signal(已被CA code调制过)的每个最大值处是否具有相位偏移% w=length(GpsMatch); m=1;
for i=Index(1,1):w:(length(GPSsignal)-w+1)
NavigationBit(m)=(GPSsignal(i:i+w-1)*GpsMatch′)w; m=m+1; end
NavigationCode=zeros(1,1);
NavigationCode(1,1)=NavigationBit(1,1); m=2;Count=0;
for i=2:length(NavigationBit)
if(NavigationBit(1,i)~=NavigationBit(1,i-1)) NavigationCode(1,m)=NavigationBit(1,i); m=m+1;
Count=0; else
Count=Count+1; if(Count>=5)
NavigationCode(1,m)=NavigationBit(1,i); m=m+1; Count=0; end end end
%%%%%我们已得到导航码NavigationCode,下面将它转化成数字%%%% NavigationCode=NavigationCode.abs(NavigationCode); index1=find(NavigationCode<0);
NavigationCode(index1)=zeros(1,length(index1)); Table1=[0 0 0 0; 0 0 0 1; 0 0 1 0; 0 0 1 1; 0 1 0 0; 0 1 0 1; 0 1 1 0; 0 1 1 1; 1 0 0 0; 1 0 0 1; 1 0 1 0; 1 0 1 1; 1 1 0 0; 1 1 0 1;
1 1 1 0;
1 1 1 1;];  Result=″; 
for i=1:4:length(NavigationCode)  TT=NavigationCode(i:i+3);
MatchTable=Table1(:,1:4)-[TT; TT; TT; TT; TT; TT;TT; TT; TT;TT; TT; TT;TT; TT; TT;TT]; MatchTable=sum(abs(MatchTable)′); TempChar=′0′;
BestMatch=find(MatchTable==min(MatchTable)); %用查表的方式将导航码NavigationCode转换成十六进制数 switch (BestMatch) case 1 
TempChar=′0′;  case 2 
TempChar=′1′; case 3 
TempChar=′2′; case 4 
TempChar=′3′; case 5 
TempChar=′4′; case 6
TempChar=′5′; case 7 
TempChar=′6′; case 8
TempChar=′7′; case 9
TempChar=′8′; case 10
TempChar=′9′; case 11
TempChar=′a′; case 12
TempChar=′b′; case 13
TempChar=′c′; case 14
TempChar=′d′; case 15
TempChar=′e′; case 16
TempChar=′f′;
相关推荐: