GPS CA码的捕获仿真研究 下载本文

400kHz,一个比k值高400kHz,对这两个分量进行DFT。三个输出??X?k?1,?X?k?,X?k?1???中的最高输出将被指定为新的X?k?,并用这个新的X?k?作为DFT分量来求解精频。

(3)从C/A码起始点出开始选择连续几个毫秒的数据,随意选择5ms的数据,将这些数据与5组连续C/A码相乘,结果为一个连续5ms的连续信号。但在任意1ms数据中,都可能含有一个?的相位偏移。

(4)在所有的输入数据中找出Xn?k?,其中n=1,2,3,4,5,然后再通过式(3-18)计算相位角,相位角差值??为:

????n?1??n

(3-21)

(5)角度差的绝对值必须小于门限值?2.3?5?,如果不行,就要在??上加上或减去2?。如果任然大于门限值,就要调整?相位偏移,在??上加上或减去?,得到的值还要与门限值2.3?5进行比较,来决定是否要再次加减调整。经过如上调整后,最终的角度值就是期望值。

(6)最后用式3-20计算求得精频。

23

4 C/A码捕获的仿真实现

4.1 MATLAB简介

自美国的MathWorks公司开发并发行了MATLAB这一大型软件[9]。它是一个复杂的计算环境,主要关注科学仿真、人性化和交互式编程。数值分析、矩阵运算、科学数据可视化和许多强大的功能模拟的非线性动态系统组成了整个程序。在Windows这种简易的交互系统中,可以通过MATLAB软件进行科学研究,工程设计和在许多科学领域提供全面解决方案的数值计算。MATLAB相比于一般的非交互式程序设计语言,它的编辑模式较为先进,也因此成为了如今全球科学计算编程仿真软件的领头羊。MATLAB可以认为是在数值计算中首先在仿真软件中的科学运用。MATLAB在各大领域都有重要作用,如:工程测量、控制仿真研究、信号分析和处理、图像分析、信号监测、数学建模与研究等。

MATLAB程序语言有以下几个重要特征[10]:

(1)有效的数值计算和符号计算可以使用户从复杂的数学分析中解脱出来。 (2)有一个完整的图形处理函数来实现计算结果和编程的可视化; (3)UI友好、自然化语言与数学表达式相似,使用者容易上手并掌握; (4)应用工具箱功能齐全,许多便捷好用的处理工具向用户提供。

MATLAB语句具有可视化,功能容易理解,数据结构较为简易,有清晰的输入输出边界,面向对象编程特点。用户可以直接将编程语言输入软件,然后在命令窗口中执行命令,而且能够编写子程序函数,并能使其与主程序同步操作。MATLAB具有的可移植和可扩展这两个特性,成为了MATLAB在科学计算和工程领域中大量运用的重要因素。

4.2 传统捕获及循环相关捕获方法仿真

整个仿真程序包括了3个.m文件和1个数据文件,具体介绍如下:gps1.m文件是主程序,主要实现了C/A码捕获的完整过程,即寻找起始点和载波频率;codegen.m子函数主要实现了生成单个采样C/A码的功能;digitizg.m子函数主要实现了数字化C/A码的功能。 4.2.1 单个采样C/A码的产生

由上述理论知识可知,首先需要得到32个C/A中的单个采样码才可以进行下一步动作,数字化。运用函数codegen.m来实现单个采样码的产生。

函数codegen.m的输入量分别是:

? g2s:向量存放g2码的偏移(例如对于卫星编号是19,使用G2为g2s(19)=471的偏移) ? svnum:卫星编号

函数codegen.m的输出量分别是:

24

? g1:G1移位寄存器的输出 ? g2:G2移位寄存器的输出 ? caused:生成的单个采样码

(1)首先,输入卫星编号svnum得到正确的G2寄存器的偏移: g2move=g2s(svnum,1);

(2)分别下载两个10位的移位寄存器分别是G1、G2。g1码是码长为1023的m序列,是G1寄存器的最后一个存储器单元10号寄存器的输出,并将10号与3号寄存器模二相加后的反馈结果赋给1号寄存器,G1寄存器逐位移动,代码如下:

reg=-1*ones(1,10); %将移位寄存器中10位数的全部置1,乘以-1 for k=1:1023,

g1(k)=reg(10); %G1寄存器的末位值赋给g1码 back1=reg(3)*reg(10); %反馈

reg(1)=back1; %反馈值赋给G1寄存器第一位

同样的,G2寄存器产生过程类似,其中反馈值是2,3,6,8,9,10号寄存器的模二相加值。不同的是g2码是其中两个存储单元模二相加后的结果,代码如下:

g21(1,1:g2move)=g2(1,1023-g2move+1:1023); %移动g2码% g21(1,g2move+1:1023)=g2(1,1:1023-g2move);

g2=g21; %产生g2码 (3)由式2-5可知,将g1码和g2码相乘即可得到单个采样C/A码: single_ca=g1.*g2; caused=-single_ca; 4.2.2 生成C/A码并数字化

函数digitizg.m的输入量分别是: ? code:戈德码 ? n:采样点 ? fs:采样频率 ? delay:延迟时间 ? svnum:卫星编号

函数digitizg.m的输出量分别是: ? code_16:数字化所用的16个C/A码

25

? code2:数字化后的C/A码

(1)首先调用子函数将得到的单个C/A码来形成数字化所用的16个C/A码: ca=codegen(svnum); %调用子函数codegen.m,产生C/A码 ca1=ca;

code16=[cal cal cal cal]; %形成16个C/A码,4*2*2 code_16=[code_16 code_16]; code_16=[code_16 code_16];

(2)将输入信号数字化成5000个点,形成连续信号,以便之后与本地码点对点相乘,找到C/A码的起始点,具体代码如下:

s=[1:n];

t=ceil((t1*s+delay)/t2); code =code_16(t);

code2=[code(1) code(1:n-1)]; %延迟时间为0,主程序中会给出 4.2.3 执行捕获

主函数gps1.m的输入量分别为: ? svnum:卫星编号

? intodat:输入读取数据起始点 ? fs:采样频率 ? t1:采样时间

? n:1ms的数据点5000个 ? n2:所有数据点

? fd:未考虑多普勒效应的中心频率

主函数gps1.m的输出量分别为: ? initial_point:起始点 ? fr3:精频

(1)首先调用子函数数字化C/A码,根据式3-6产生21个本地码,将产生21个本地码;将输入信号进行快速傅里叶变换(FFT),将本地产生信号也进行FFT,然后将这两个信号点对点相乘;把相乘的结果进行反傅里叶变换,得到时域中的值,找到峰值点,则这个峰值点就是C/A码的起始点,产生该峰值的频率分量就是载波频率(粗频)。具体代码如下:

code_ca=digitizg(n,fs,0,svnum); %调用digitizg.m, 执行数字化

26