GPS信号捕获

更新时间:2024-01-17 17:22:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

GPS课程设计 实验报告(2)

学院 姓名LSC 班级 学号 指导教员

一、试验名称:GPS信号捕获 二、试验目的:

1. 熟悉GPS信号捕获基本概念;

2. 掌握串行搜索算法、并行频率搜索算法和并行码相位搜索捕获算法的基本思想、特点及算法流程;

3. 训练在实际当中分析问题、解决问题的能力。

三、试验内容

1. 编写GPS信号捕获子程序,算法自选。

2. 将实验一最终生成的信号延迟?时间,并加上大小为fD的多普勒频移,使用以上编写的信号捕获子程序对该信号进行捕获。

3. 画出三维捕获结果图(要求至少画出两幅,一幅对应信号成功捕获,一幅对应未捕获到信号)。

四、试验原理

4.1 概述

为了跟踪和解码GPS信号, 首先要捕获到GPS信号。将捕获到的GPS信号的必要参数立刻传递给跟踪过程,再通过跟踪过程便可得到卫星的导航电文。GPS

卫星处于高速运动中,因此,其频率会产生多普勒频移。为覆盖高速卫星预期中的所有多普勒频率范围,捕获方法覆盖的频率范围必须在±10 kHz之内。针对某个特定的卫星信号,捕获过程就是要找到C/A码的起始点,并利用找到的起始点展开C/A码频谱,一旦复现了C/A码的频谱,输出信号将变成连续波(Continuous Wave,CW),于是便得到其载波频率。也就是说,捕获过程就是要获得输入信号的C/A码的起始点和载波频率,然后传递给跟踪过程。

4.2 卫星信号捕获的考虑 4.2.1 捕获时的最大电文长度

C/A码长1 ms,那么至少要用1ms的电文来捕获,甚至只用1 ms的电文来捕获时,都可能发生导航电文相位偏移。因此,为了保证捕获电文中不含有数据偏移,需要用两组连续的电文来捕获,这个电文最大长度是10ms。如果使用两组连续的10 ms电文来捕获,就保证了在某一组电文中不含相位偏移。

限制电文长度的第二个因素是C/A码的多普勒效应。 4.2.2 捕获中的频率步长

捕获时的另一个考虑因素是捕获中剥离载波所需的频率。步进频率的大小与捕获中的电文长度紧密相关。如果输入信号与本地混频信号相距1个周期,它们两者没有相关性;如果两者小于1个周期,则它们有部分相关性。解决信号周期和步进频率问题的一个简单方法是频率相离与电文长度成反向关系。

可得出如下结论:捕获中的操作执行次数与总的数据点并不是成线性比例关系,当电文长度从1 ms上升到10 ms时,电文长度上升10倍,频率点数目也上升了10倍,捕获所需的操作次数上升了不止10倍。因此,实际捕获时,如果强调捕获的速度的话,电文长度需保持在最小值。执行次数的增加,取决于实际捕获所用的方法,下面将讨论具体的捕获方法。

4.3 GPS卫星信号的捕获方法 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.2 C/A码数值分析

一旦输入变成连续信号,通过傅立叶变换可以知晓其频率。可以设置一个阈值,即一个门限来判断一个频率分量是否足够大。高于这个门限的最高频率分量就是我们要找的频率。

由于输入信号中C/A码的起始点还未知,因此,必须先找到这个点。为了找到这个点,我们产生本地的一个C/A码,将其数字化为5000个点,且与输入信号点对点相乘,对此乘积的结果进行FFT或DFT,可以找到其频率。通过这种方法,可以用时间分辨率为200 ns(1/5 MHz)和1 kHz的频率分辨率找出C/A码的起始点。如果使用10 ms的电文,因为信号只需要卷积1 ms,因此需要5000次操作。每次操作包含50 000个点对点乘积和50 000次FFT,总共有1.25×108(5000×25 000)个输出结果。

五、Matlab代码及实现

5.1 主程序代码:

clc,clear all; % 产生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); % save CA码.matCACode

% figure(1) , plot(1:1023,CACode); % axis([1 1023 0 1]); % title('C/A码');

% step2:产生导航电文

NavigationData = Create_NavigationData(); % save 导航电文.matNavigationData

FirstFrameNavigationData = NavigationData(1:300); % figure(2),plot(1:300,FirstFrameNavigationData); % axis([1 300 0 1]);

% title('导航电文第一子帧的数据'); % 用C/A码来调制导航电文的第一帧

Baseband_Signal = SpreadSpectrum(FirstFrameNavigationData,CACode); % save CA码基带信号.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.1 C/A码产生(与实验一相同):

function CACode = 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:1023

temp = xor(G2(tap1), G2(tap1)); %5号卫星,抽头1和9 code(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)]; end

code=cast(code,'double');

CACode=code;

5.2.2多普勒频移

function IFSignal = IF_BasebandSignal(Baseband_Signal,SNR) F0=2e6; %中频频率为2MHz Fs=5e6; %采样率为5MHz freq_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个子帧,每个子帧长度为300bit one_page=randn(1,1500); %一页 one_page(find(one_page>0))=1; one_page(find(one_page<0))=0;

week_number=[1 0 1 0 1 0 1 0 1 0]; %星期数,每页更新一次 one_page(61:70)=week_number; tlm=ones(1,30);

tow=ones(1,17); %TOW,每帧更新一次 how=[tow,zeros(1,13)];

for i=0:4 %一页 one_page(i*300+1:i*300+60)=[tlm,how]; end

for j=0:24 %一个周期 one_period(j*1500+1:j*1500+1500)=one_page; end

NavigationData=one_period; 5.2.4 C/A码捕获:

function CACode = Capture_CACode(IFSignal,CACode,freq_doppler)

N = length(IFSignal);

F0=2e6; %中频频率为2MHz Fs = 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:40

f = (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试验截图

本文来源:https://www.bwwdw.com/article/mivo.html

Top