跟踪的主要目的是精确化频率和码相位值,并保持跟踪,然后从跟踪到的卫星中解调出导航数据

                                                                                 Fig1 跟踪流程图

1.初始化输出结构体参数

%%%%tracking.m
trackResults.status         = '-';      % 初始状态为无信号捕获
trackResults.absoluteSample = zeros(1, settings.msToProcess); %共msToProcess输出值,初始值为36000,确保遍历所有子帧%记录每ms的实时码频率
trackResults.codeFreq       = inf(1, settings.msToProcess);% Frequency of the tracked carrier wave:
%记录每ms的实时跟踪载波频率
trackResults.carrFreq       = inf(1, settings.msToProcess);% Outputs from the correlators (In-phase):
% 同相支路的相关器的输出值
trackResults.I_P            = zeros(1, settings.msToProcess);
trackResults.I_E            = zeros(1, settings.msToProcess);
trackResults.I_L            = zeros(1, settings.msToProcess);% Outputs from the correlators (Quadrature-phase):
%正交支路的相关器输出值
trackResults.Q_E            = zeros(1, settings.msToProcess);
trackResults.Q_P            = zeros(1, settings.msToProcess);
trackResults.Q_L            = zeros(1, settings.msToProcess);% Loop discriminators 定义为极大值
trackResults.dllDiscr       = inf(1, settings.msToProcess);
%跟踪环路延迟锁相环鉴相器的输出值
trackResults.dllDiscrFilt   = inf(1, settings.msToProcess);
%跟踪环路延迟锁相环滤波器的输出值
trackResults.pllDiscr       = inf(1, settings.msToProcess);
%跟踪环路载波锁相环鉴相器的输出值
trackResults.pllDiscrFilt   = inf(1, settings.msToProcess);
%跟踪环路载波锁相环滤波器的输出值trackResults = repmat(trackResults, 1, settings.numberOfChannels);
%生成numberOfChannels个结构体%% 初始化跟踪变量 ==========================================codePeriods = settings.msToProcess;     % 跟踪的C/A码周期数%--- DLL variables --------------------------------------------------------
% Define early-late offset (in chips)
%超前-滞后与及时码的间隔 单位为码片
earlyLateSpc = settings.dllCorrelatorSpacing;% Summation interval
% 码环累加间隔1msPDIcode = 0.001;% Calculate filter coefficient values
% 环路采用二阶环
[tau1code, tau2code] = calcLoopCoef(settings.dllNoiseBandwidth, ...settings.dllDampingRatio, ...1);%--- PLL variables --------------------------------------------------------
% Summation intervalPDIcarr = 0.001;
% 载波环环累加间隔1ms 即1个CA码周期
% Calculate filter coefficient values
[tau1carr, tau2carr] = calcLoopCoef(settings.pllNoiseBandwidth, ...settings.pllDampingRatio, ...0.25);
hwb = waitbar(0,'Tracking...');%显示当前跟踪进度,0-1之间取值

这里使用了calcLoopCoef函数,该函数的作用是计算滤波器的系数,calcLoopCoef函数代码如下

function [tau1, tau2] = calcLoopCoef(LBW, zeta, k)%
%   Inputs:
%       LBW           - Loop noise bandwidth
%       zeta          - Damping ratio
%       k             - Loop gain
%
%   Outputs:
%       tau1, tau2   - Loop filter coefficients %--------------------------------------------------------------------------Wn = LBW*8*zeta / (4*zeta.^2 + 1);% solve for t1 & t2
tau1 = k / (Wn * Wn);
tau2 = 2.0 * zeta / Wn;

出处见7.10

2. 初始化载波环参数

for channelNr = 1:settings.numberOfChannelsif (channel(channelNr).PRN ~= 0)%只处理选择出来的通道fseek(fid, ...settings.skipNumberOfBytes + channel(channelNr).codePhase-1, ...'bof');
%将数据句柄移到C/A码相位开始处caCode = generateCAcode(channel(channelNr).PRN);% 生成相应卫星的C/A码caCode = [caCode(1023) caCode caCode(1)];%生成1025个C/A码,便于做超前、滞后处理%--- 载波环初始化s ------------------------------% define initial code frequency basis of NCOcodeFreq      = settings.codeFreqBasis;% define residual code phase (in chips)remCodePhase  = 0.0;% define carrier frequency which is used over whole tracking periodcarrFreq      = channel(channelNr).acquiredFreq;carrFreqBasis = channel(channelNr).acquiredFreq;% define residual carrier phaseremCarrPhase  = 0.0;%code tracking loop parametersoldCodeNco   = 0.0;oldCodeError = 0.0;%carrier/Costas loop parametersoldCarrNco   = 0.0;oldCarrError = 0.0;

3.载波环、码环迭代

     for loopCnt =  1:codePeriods %codePeriods为迭代的总次数,每次迭代积分时间为1ms%% GUI update -------------------------------------------------------------% 每50ms更新一次跟踪进度if (rem(loopCnt, 50) == 0)trywaitbar(loopCnt/codePeriods, ...hwb, ...['Tracking: Ch ', int2str(channelNr), ...' of ', int2str(settings.numberOfChannels), ...'; PRN#', int2str(channel(channelNr).PRN), ...'; Completed ',int2str(loopCnt), ...' of ', int2str(codePeriods), ' msec']);                       catchdisp('Progress bar closed, exiting...');returnendend%确定1ms数据块大小codePhaseStep = codeFreq / settings.samplingFreq;%确定相邻采样点之间的码相位大小%读取的块的大小 若码相位有残余值,则读取残余值剩下的CA码数据 blksize = ceil((settings.codeLength-remCodePhase) / codePhaseStep);
%剩余C/A码采样数值个数% Read in the appropriate number of samples to process this% interation [rawSignal, samplesRead] = fread(fid, ...blksize, settings.dataType);rawSignal = rawSignal';  %转置% 如果没有读取足够多得数据,说明超出数据长度if (samplesRead ~= blksize)disp('Not able to read the specified number of samples  for tracking, exiting!')fclose(fid);returnend
%设置码相位跟踪信息% Define index into early code vector 产生超前码tcode       = (remCodePhase-earlyLateSpc) : ...codePhaseStep : ...((blksize-1)*codePhaseStep+remCodePhase-earlyLateSpc);tcode2      = ceil(tcode) + 1;earlyCode   = caCode(tcode2);%转换到对应的1025个码上% Define index into late code vector 产生滞后码tcode       = (remCodePhase+earlyLateSpc) : ...codePhaseStep : ...((blksize-1)*codePhaseStep+remCodePhase+earlyLateSpc);tcode2      = ceil(tcode) + 1;lateCode    = caCode(tcode2);% Define index into prompt code vector 产生即时码tcode       = remCodePhase : ...codePhaseStep : ...((blksize-1)*codePhaseStep+remCodePhase);tcode2      = ceil(tcode) + 1;promptCode  = caCode(tcode2);%下一个码的初始相位remCodePhase = (tcode(blksize) + codePhaseStep) - 1023.0;%%生成本地正弦余弦信号-----------time    = (0:blksize) ./ settings.samplingFreq;%产生初始相位是remCarrPhase的载波相位序列向量trigarg = ((carrFreq * 2.0 * pi) .* time) + remCarrPhase;remCarrPhase = rem(trigarg(blksize+1), (2 * pi));     %下一个载波初始相位% 生成本地正弦余弦信号carrCos = cos(trigarg(1:blksize));carrSin = sin(trigarg(1:blksize));%%本地正弦余弦信号与接收信号做乘法运算,下变频到基带---------------------------% I&Q支路下变频到基带qBasebandSignal = carrCos .* rawSignal;iBasebandSignal = carrSin .* rawSignal;% I&Q支路基带解扩 即码剥离I_E = sum(earlyCode  .* iBasebandSignal);Q_E = sum(earlyCode  .* qBasebandSignal);I_P = sum(promptCode .* iBasebandSignal);Q_P = sum(promptCode .* qBasebandSignal);I_L = sum(lateCode   .* iBasebandSignal);Q_L = sum(lateCode   .* qBasebandSignal);%% 寻找锁相环偏差与更新本地载波发生器 -----------1ms------------------% 鉴相器的输出 输出为频率值( 单位Hz)carrError = atan(Q_P / I_P) / (2.0 * pi);%实现载波环路滤波器并生成NCO命令 carrNco = oldCarrNco + (tau2carr/tau1carr) * ...(carrError - oldCarrError) + carrError * (PDIcarr/tau1carr);%载波环路滤波器oldCarrNco   = carrNco;%更新本地载波频率误差oldCarrError = carrError;%更新载波相位误差carrFreq = carrFreqBasis + carrNco;%更新NCO载波发生器频率trackResults(channelNr).carrFreq(loopCnt) = carrFreq;%保存第loopCnt载波频率值%% 寻找码跟踪环偏差与更新本地码发生器 -------20ms---------------% 码环鉴相器 超前-滞后 非相干codeError = 0.5*(sqrt(I_E * I_E + Q_E * Q_E) - sqrt(I_L * I_L + Q_L * Q_L)) / ...(sqrt(I_E * I_E + Q_E * Q_E) + sqrt(I_L * I_L + Q_L * Q_L));% 实现码环滤波器并生成NCO命令codeNco = oldCodeNco + (tau2code/tau1code) * ...(codeError - oldCodeError) + codeError * (PDIcode/tau1code);%码环滤波器oldCodeNco   = codeNco;%更新码环频率误差oldCodeError = codeError;%更新码环相位误差% 用NCO控制器更新码频率codeFreq = settings.codeFreqBasis - codeNco;trackResults(channelNr).codeFreq(loopCnt) = codeFreq;%更新码环频率%记录后处理所需要的各种测量值trackResults(channelNr).absoluteSample(loopCnt) = ftell(fid);%记录每一次处理的数据在文件中的具体位置(以字节计算)trackResults(channelNr).dllDiscr(loopCnt)       = codeError;%码环鉴别器的输出trackResults(channelNr).dllDiscrFilt(loopCnt)   = codeFreq;%码环滤波器的NCO输出 codeNcotrackResults(channelNr).pllDiscr(loopCnt)       = carrError;%载波环鉴别器的输出trackResults(channelNr).pllDiscrFilt(loopCnt)   = carrFreq;%载波环滤波器的NCO输出 carrNco% 积分累加器的输出值trackResults(channelNr).I_E(loopCnt) = I_E;trackResults(channelNr).I_P(loopCnt) = I_P;trackResults(channelNr).I_L(loopCnt) = I_L;trackResults(channelNr).Q_E(loopCnt) = Q_E;trackResults(channelNr).Q_P(loopCnt) = Q_P;trackResults(channelNr).Q_L(loopCnt) = Q_L;end % for loopCnt% If we got so far, this means that the tracking was successful% Now we only copy status, but it can be update by a lock detector% if implementedtrackResults(channelNr).status  = channel(channelNr).status;%更新跟踪状态        end % if a PRN is assigned
end % for channelNr % Close the waitbar
close(hwb)

GPS软件接收机(3)——跟踪相关推荐

  1. MATLAB接收机位置解算,GPS-receiver GPS软件接收机代码 完整的捕获 解算定位 (可 8个通道) matlab 240万源代码下载- www.pudn.com...

    文件名称: GPS-receiver下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 148 KB 上传时间: 2015-07-02 下载次数: 0 提 供 ...

  2. GPS软件接收机(2)——选星

    在完成对GPS信号的捕获获得卫星PRN编号.载波频率.码相位之后,为了使用信号更加优质的GPS信号,需剔除信号质量较差的信号,以达到节省软件资源(硬件资源同理)的效果,在进行跟踪之前需要选星.初始化跟 ...

  3. GPS软件接收机matlab程序学习笔记(一)

    clear all;clc;cla;close all; format longg; %%15位有效数 %% 一. 设定GPS数据文件参数 %%%%%%%%%%%%%% gps_bd = 0; % 0 ...

  4. GPS软件接收机(1)——GPS信号捕获

    解读Darius Plausinaitis, Dennis M. Akos所著的关于GPS信号捕获的代码 最新上传所有源码 链接:https://pan.baidu.com/s/1M2oiCWcm9e ...

  5. 软件接收机射频信号源matlab程序,gps数字中频信号仿真

    [总页数]6 页(38-43) [关键词]GPS 软件接收机;中频信号源;仿真 [作者]于鉴桐;李刚 [作者单位]湖南邮电职业技术学院,湖南长沙 410015;湖南电信长沙分...... 在对中频GP ...

  6. 那些年追过的开源GNSS软件接收机(二)

    4. SoftGNSS 时间:2006 网址:GNSS @ CCAR, CU Boulder 简介:Darius Plausinaitis和Dennis M. Akos主导,用matlab代码编写的开 ...

  7. GPS L5软件接收机的编写

    小米8手机的上市,让大家认识了一个新的名词:GPS L5,那么到底什么是L5?如何编写L5软件接收机呢? (1)GPS L5信号模型 和传统的GPS L1信号相比,L5信号的特点就是码长更长,带宽更宽 ...

  8. GPS跟踪载波环matlab代码,GPS接收机载波跟踪环路解决方案

    0 引 言 随着GPS 卫星应用产业化进程的逐步发展,对导航接收机关键技术的攻关必将缩短卫星导航终端产品的研发周期,推进卫星导航应用产业化的进程.在GPS 接收机中利用何种技术来快速跟踪卫星多普勒频偏 ...

  9. matlab仿真卫星导航接收机信号干扰,卫星导航软件接收机多采样率信号处理技术...

    卫星导航软件接收机是当代卫星导航接收机领域发展的方向,其基本思想是:将A/D和D/A尽可能靠近RF端,在数字化的通用硬件平台上,用软件尽可能多地实现对卫星导航信号的处理.软件接收机具有灵活性.标准化. ...

最新文章

  1. 【动态规划专题】数字三角形模型
  2. Java类的连接与初始化 (及2013阿里初始化笔试题解析)
  3. python3文件下载-python3获取文件中url内容并下载代码实例
  4. Index of Unix
  5. mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法
  6. Ubuntu下构建gstreamer开发环境
  7. mysql—数据库优化——如何选择合适的索引
  8. oppor15android10怎么降级,OPPO R9S7.1系统怎么降回6.0版本 OPPO R9S7.1系统降级教程
  9. UnityShader14:透明效果实现(上)
  10. C语言算法碎碎记录之“一圈人,数到几的人就出去,最后一个是几号”
  11. 我国光伏行业开始向东走
  12. ArcGISServer 10.2发布地理处理服务:以CAD数据至地理数据库为例(2)发布地理处理服务
  13. Ubuntu添加开机自动运行程序
  14. ASP.NET Core 引用其他程序集项目里面的 Controller 控制器
  15. 如何录制游戏视频中的音频
  16. quantization 顶会文章简介 2017
  17. Photoshop CC2017软件安装教程
  18. Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backflash to be included
  19. 神经网络处理表格数据,神经网络如何识别图像
  20. ANSYS附加动水质量(westergarrd公式)

热门文章

  1. 什么是安全性测试(security testing)?
  2. 2019软考总结-UML
  3. OpenStack创建实例提示失败的具体原因如下: created even after we waited 191 seconds or 61 attempts
  4. 家居3d网上展示_三维模型可视化展示
  5. t3插密码狗不显示服务器,登陆T3时,用户名和账套都不显示,显示没有检测到合法的LISENCE,需要重新注册密码狗,在注册社区后,搜索.cjt的文件,搜不到...
  6. 【论文精读1】CSDI: Conditional Score-based Diffusion Models for Probabilistic Time Series Imputation
  7. 做项目与做产品的区别详解
  8. 电力行业DC-DC电源模块的选型
  9. 工业机器人的应用有哪些
  10. 2021年9月国产数据库排行榜:达梦奋起直追紧逼OceanBase,openGauss反超PolarDB再升一位...