3.3.1 传统捕获方法
捕获的基本思想就是展开输入信号,找到载波频率。如果相位正确的CA码与输入信号相乘,输入信号将如图4-1中所示变成一个连续信号。图3-1中最上端是输入信号,这个信号是CA码编码的射频信号相位。中间的图表示CA码,其值在±1之间。 最下端的图是连续信号,代表输入信号与CA码的乘积,是一个连续信号,这个过程有时称做输入信号的CA码剥离。
图3-1CA编码的输入信号与本地CA码相乘
3.3.2 CA码数值分析
一旦输入变成连续信号,通过傅立叶变换可以知晓其频率。可以设置一个阈值,即一个门限来判断一个频率分量是否足够大。高于这个门限的最高频率分量就是我们要找的频率。
由于输入信号中CA码的起始点还未知,因此,必须先找到这个点。为了找到这个点,我们产生本地的一个CA码,将其数字化为5000个点,且与输入信号点对点相乘,对此乘积的结果进行FFT或DFT,可以找到其频率。通过这种方法,可以用时间分辨率为?200 ns(15 MHz)和1 kHz的频率分辨率找出CA码的起始点。 如果使用10 ms的电文,因为信号只需要卷积1 ms,因此需要5000次操作。每次操作包含50 000个点对点乘积和50 000次FFT,
8
总共有1.25×10(5000×25 000)个输出结果。
3.4 GPS卫星信号捕获的例子
程序中所用到的输入电文在时域内的情形如图3-2所示。 输入信号看起来像噪声,其频率描绘可通过FFT求得,如图3-3所示。正如预料的,FFT变换后带宽是2.5 MHz,其频谱形状与射频链的滤波器形状相似,通过循环相关后如图3-4所示, 其中给出了6号卫星的CA码起始点,其起始点在2884。图3-5给出了相距1 kHz的21个频率分量,最高值发生在k=7处。从图3-6和3-7我们可以轻易地看出CA码的起始点和频率。由于输入电文是实际收集到的数据,精频的精确度就难以测定, 因为其多普勒频率未知。精频还取决于在下变频中用到的本地振荡器的频率精确性和采样频率的精确性。
图3-2 5000个输入数据点
图3-3 输入信号的快速傅立叶变换
图 3-4 6号卫星的CA码起始点
图3-5卫星6的展开的各个频率分量
对弱信号(24号卫星)执行捕获,如图4-6和图4-7所示。从图中我们很难判断CA 码的起始点和频率是否为正确值,需要通过另外的相关运算才能找出它们
图3-6 24号卫星的CA码起始点
图3-7 24号卫星的展开信号的频率分量
3.5 关于捕获的一些子程序 3.5.1 随机编码过程仿真?
打开Matlab,新建一个M?File,输入以下的文本,保存为GenerateCode.m,并调试运行。可以单步或多步运行M文件。
11 %该程序仿真产生三组伪随机数, 模拟随机编码过程? close all;? clear;? clc;?
t=0:5:1000;
%时间变量为1 s, 步长5 ms? ?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1=rand(1,length(t)); %生成一组1*length(t)维的伪随机数?
x1=round(x1); %将x1数组中的元素转换到与其最近的整数? index1=find(x1==0); %找出x1数组中为0的元素
x1(index1)=-ones(1,length(index1)); %返回一个index1长度的一维数组? ?
x2=rand(1,length(t));? x2=round(x2);?
index1=find(x2==0);?
x2(index1)=-ones(1,length(index1)); x3=rand(1,length(t));? x3=round(x3);?
index1=find(x3==0);?
x3(index1)=-ones(1,length(index1));
y1=zeros(1,1); y2=zeros(1,1); y3=zeros(1,1); %生成三个1*1的零矩阵,存放伪随机值?
t1=zeros(1,1); t2=zeros(1,1); t3=zeros(1,1); %生成三个1*1的零矩阵,存放时间值?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?
%%%%%将生成的伪随机值存放到对应的矩阵中%%%%%%?
y1(1)=x1(1); y2(1)=x2(1); y3(1)=x3(1);? t1(1)=t(1);t2(1)=t(1);t3(1)=t(1);? k=2;m=2;n=2;? ?
for i=2: length(t)?
if (x1(i)==x1(i-1))? y1(k)=x1(i);? t1(k)=t(i);? k=k+1; else?
y1(k)=x1(i-1);? y1(k+1)=x1(i);? t1(k)=t(i);?
t1(k+1)=t(i)+0.01; %如果该时刻阶跃变化, 则右移0.01来记录 k=k+2;? end?
12 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中, 是因为我们在后面的仿真中还要用到这些伪随机码。
13
图 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;? ?
14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %下面是要找到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;?
15