解读Darius Plausinaitis, Dennis M. Akos所著的关于GPS信号捕获的代码

最新上传所有源码

链接:https://pan.baidu.com/s/1M2oiCWcm9e4DTbsn8g1Fuw 
提取码:ewxv

  1. 参数初始化设置
samplesPerCode = round(settings.samplingFreq / ...(settings.codeFreqBasis / settings.codeLength));
% 计算每个C/A码包含多少采样点,“...”表示续行signal1 = longSignal(1 : samplesPerCode);
signal2 = longSignal(samplesPerCode+1 : 2*samplesPerCode);
%取相邻的两个信号,信号长度为1ms,采样点数为samplesPerCodesignal0DC = longSignal - mean(longSignal);
%去直流ts = 1 / settings.samplingFreq;
%计算采样时间间隔phasePoints = (0 : (samplesPerCode-1)) * 2 * pi * ts;
%计算1ms信号内的载波相位点numberOfFrqBins = round(settings.acqSearchBand * 2) + 1;
%计算频率捕获的个数,500Hz步进 总共2kHz,共41个caCodesTable = makeCaTable(settings);
% makeCaTable函数根据采样频率产生32颗指定卫星的CA码 ,此时为32*samplesPerCode矩阵%--- 初始化捕获结果矩阵 -------------------------------results     = zeros(numberOfFrqBins, samplesPerCode);
%一颗卫星的包含搜索频率个数与一个C/A码采样个数的零向量% Carrier frequencies of the frequency bins
%
frqBins     = zeros(1, numberOfFrqBins);
%产生一颗卫星的载波偏移初始向量%--- Initialize acqResults ------------------------------------------------
acqResults.carrFreq     = zeros(1, 32);
%初始化32颗卫星的载波频率acqResults.codePhase    = zeros(1, 32);
% C/A code phases of detected signalsacqResults.peakMetric   = zeros(1, 32);
% Correlation peak ratios of the detected signalsfprintf('(');

2. 并行码搜索的方式捕获码相位和载波频率

2.1.求信号与本地c/a码的相关值

for PRN = settings.acqSatelliteList
%settings.acqSatelliteList=1:32caCodeFreqDom = conj(fft(caCodesTable(PRN, :)));%某颗PRN卫星的CA码采样值的FFT区共轭 for frqBinIndex = 1:numberOfFrqBins%带宽为500Hz的频率遍历frqBins(frqBinIndex) = settings.IF - ...(settings.acqSearchBand/2) * 1000 + ...0.5e3 * (frqBinIndex - 1);%载波偏移--10kHz—+10kHz 产生numberOfFrqBins个500Hz间隔的中频载波频率 sinCarr = sin(frqBins(frqBinIndex) * phasePoints);cosCarr = cos(frqBins(frqBinIndex) * phasePoints);%----产生一个信号周期完整(1ms)的中频载波正弦和余弦信号-------------------------%---------- "Remove carrier" from the signal-----------------------%-----------------连续的两个1ms中频数据载波剥离----------------------I1      = sinCarr .* signal1;Q1      = cosCarr .* signal1;I2      = sinCarr .* signal2;Q2      = cosCarr .* signal2;%--- Convert the baseband signal to frequency domain ------%--------载波剥离后的1ms数据做FFT---------------------------IQfreqDom1 = fft(I1 + j*Q1);IQfreqDom2 = fft(I2 + j*Q2);convCodeIQ1 = IQfreqDom1 .* caCodeFreqDom;%改为转置convCodeIQ2 = IQfreqDom2 .* caCodeFreqDom;%改为转置%频域共轭相乘,时域卷积判断最大值acqRes1 = abs(ifft(convCodeIQ1)) .^ 2;acqRes2 = abs(ifft(convCodeIQ2)) .^ 2;%傅里叶反变化获得C/A码的相关值%--- Check which msec had the greater power and save that, will%"blend" 1st and 2nd msec but will correct data bit issues%寻找卷积相关最大值,复现码的相位值 完成每个频率域的最大值搜索 %连续的两个1ms数据为了防止数据位的翻转对于相关值的影响%形成frqBinIndex*samplesPerCode的矩阵if (max(acqRes1) > max(acqRes2))results(frqBinIndex, :) = acqRes1; %将获得的相关值赋给results矩阵的第elseresults(frqBinIndex, :) = acqRes2;endend 

并行码相位的捕获原理为:

2.2.确定当前卫星的信号是否捕获成功

1.判断依据为最大相关值与次最大相关值的比值是否大于设定的阈值(也可以直接判断最大相关值是否大于设定的阈值)

%% Look for correlation peaks in the results ==============================% Find the highest peak and compare it to the second highest peak% The second peak is chosen not closer than 1 chip to the highest peak%将第一主峰与第二主峰进行比较,当第二主峰远离最高主峰超过一个码片的话,则作为第二主峰    %--- 选择最大相关值与载波频率 --------------[peakSize frequencyBinIndex] = max(max(results, [], 2));% 获取最大相关值与最大相关值所对应的频率搜索序号%--- Find code phase of the same correlation peak ---------------------[peakSize codePhase] = max(max(results));%获取最大相关值与最大相关值所对应的码相位序号%--- 获取与最大峰超过一个码片的次最大峰 ----samplesPerCodeChip   = round(settings.samplingFreq / settings.codeFreqBasis);%每个码片的采样值个数excludeRangeIndex1 = codePhase - samplesPerCodeChip;excludeRangeIndex2 = codePhase + samplesPerCodeChip;% 求与最大峰距离为一个码片的区域边界%--- Correct C/A code phase exclude range if the range includes array%boundaries   如果范围包括边沿的时候调整码相位if excludeRangeIndex1 < 2codePhaseRange = excludeRangeIndex2 : ...(samplesPerCode + excludeRangeIndex1);elseif excludeRangeIndex2 >= samplesPerCodecodePhaseRange = (excludeRangeIndex2 - samplesPerCode) : ...excludeRangeIndex1;elsecodePhaseRange = [1:excludeRangeIndex1, ...excludeRangeIndex2 : samplesPerCode];end
%确定寻找次最大峰的搜索区域secondPeakSize = max(results(frequencyBinIndex, codePhaseRange));%在当前已经搜索到的多普勒频率下的codePhaseRange范围内寻找次大值%--- Store result -----------------------------------------------------acqResults.peakMetric(PRN) = peakSize/secondPeakSize;%存储相关值最大值与次大值的比值 每一颗卫星均做记录if (peakSize/secondPeakSize) > settings.acqThreshold% 如果该结果大于设定的阈值,则确认捕获到信号fprintf('%02d ', PRN);%输出捕获到的卫星编号caCode = generateCAcode(PRN);%确定已经捕获到的CA码%生成10ms长的捕获C/A码序列,并用10ms的C/A码对载波信号进行剥离codeValueIndex = floor((ts * (1:10*samplesPerCode)) / ...(1/settings.codeFreqBasis));%10ms内可采样的码片数量longCaCode = caCode((rem(codeValueIndex, 1023) + 1));%模拟信号采样,使得本地C/A数据格式与捕获信号保持一致xCarrier = ...signal0DC(codePhase:(codePhase + 10*samplesPerCode-1)) ....* longCaCode;%用10ms的码相位对捕获信号进行码剥离%--- Find the next highest power of two and increase by 8x --------fftNumPts = 8*(2^(nextpow2(length(xCarrier))));%将点数转化为2的幂次整数以便使用fft(否则为DFT,运算时间增加),且将FFT的频率分辨率提高8倍fftxc = abs(fft(xCarrier, fftNumPts));
%fftNumPts超过xCarrier长度,补0会提高频率分辨率,见解释:https://blog.csdn.net/dujiahei/article/details/80083054uniqFftPts = ceil((fftNumPts + 1) / 2);
%由于频率谱的对称性,选择一半频谱即可估计载波频率值[fftMax, fftMaxIndex] = max(fftxc(5 : uniqFftPts-5)); %返回最大频率值与相对应的序列值,5的含义不太明确fftFreqBins = (0 : uniqFftPts-1) * settings.samplingFreq/fftNumPts;
%采样频率各个点所对应的频率%--- Save properties of the detected satellite signal -------------acqResults.carrFreq(PRN)  = fftFreqBins(fftMaxIndex);%捕获阶段估计到的载波频率acqResults.codePhase(PRN) = codePhase;%捕获阶段估计到码相位else%--- No signal with this PRN --------------------------------------fprintf('. ');end   % if (peakSize/secondPeakSize) > settings.acqThresholdend    % for PRN = satelliteList%=== Acquisition is over ==================================================
fprintf(')\n');
save( 'acqResults');

2.3 精细捕获载波频率

用加长的10ms的本地C/A码序列剥离信号的C/A码,对剥离后的信号进行傅里叶变化,输出的频谱最大值点所对应的频率即为该新号的频率

       caCode = generateCAcode(PRN);%确定已经捕获到的CA码%生成10ms长的捕获C/A码序列,并用10ms的C/A码对载波信号进行剥离codeValueIndex = floor((ts * (1:10*samplesPerCode)) / ...(1/settings.codeFreqBasis));%10ms内可采样的码片数量longCaCode = caCode((rem(codeValueIndex, 1023) + 1));%模拟信号采样,使得本地C/A数据格式与捕获信号保持一致xCarrier = ...signal0DC(codePhase:(codePhase + 10*samplesPerCode-1)) ....* longCaCode;%用10ms的码相位对捕获信号进行码剥离%--- Find the next highest power of two and increase by 8x --------fftNumPts = 8*(2^(nextpow2(length(xCarrier))));%将点数转化为2的幂次整数以便使用fft(否则为DFT,运算时间增加),且将FFT的频率分辨率提高8倍fftxc = abs(fft(xCarrier, fftNumPts));
%fftNumPts超过xCarrier长度,补0会提高频率分辨率,见解释:https://blog.csdn.net/dujiahei/article/details/80083054uniqFftPts = ceil((fftNumPts + 1) / 2);
%由于频率谱的对称性,选择一半频谱即可估计载波频率值[fftMax, fftMaxIndex] = max(fftxc(5 : uniqFftPts-5)); %返回最大频率值与相对应的序列值,5的含义不太明确fftFreqBins = (0 : uniqFftPts-1) * settings.samplingFreq/fftNumPts;
%采样频率各个点所对应的频率%--- Save properties of the detected satellite signal -------------acqResults.carrFreq(PRN)  = fftFreqBins(fftMaxIndex);%捕获阶段估计到的载波频率acqResults.codePhase(PRN) = codePhase;%捕获阶段估计到码相位else%--- No signal with this PRN --------------------------------------fprintf('. ');end   % if (peakSize/secondPeakSize) > settings.acqThresholdend    % for PRN = satelliteList%=== Acquisition is over ==================================================
fprintf(')\n');
save( 'acqResults');

GPS软件接收机(1)——GPS信号捕获相关推荐

  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软件接收机(3)——跟踪

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

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

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

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

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

  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接收机连载——6、捕获模块设计与验证

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 从零开始研发GPS接收机连载--6.捕获模块设计与验证 前言 数据位宽 捕获算法选择 捕获参数设计 FPGA实现的一些组成模块 上板测 ...

  9. 【GPS仿真】基于matlab GPS信号捕获跟踪定位仿真【含Matlab源码 1960期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[GPS仿真]基于matlab GPS信号捕获跟踪定位仿真[含Matlab源码 1960期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

最新文章

  1. python123期末测验答案程序题_python期末题库(2)带答案
  2. Visual Studio Xamarin中找不到iOS模拟器
  3. springmvc十二:@PathVariable
  4. 基于pxe+dhcp+ks实现自动安装系统
  5. ThreadPoolExecutor源码解析(一)
  6. BigData之matplotlib:爬虫2018年福布斯中国富豪榜进行数据统计分析,大数据告诉你一些不可思议的事情
  7. Zookeeper01_必看
  8. 编程之美 set 8 区间重合判断
  9. EXCEL数据有效性—单元格筛选的改进
  10. 详细分析谷歌紧急修复的 Chrome 0day(CVE-2021-21224)
  11. python xlrd模块_Python中xlrd模块解析
  12. 耶鲁大学教授:给研究生的11条军规
  13. DIY强大的虚拟化环境-组装于测试部分-2.L5420主机
  14. Java语言的技术平台:JavaSE、JavaEE和JavaME
  15. CorelDRAW2022下载附带序列号安装教程
  16. c++学习笔记-------《c++自学通》第六章 基本类
  17. 微信小程序引入外部icon(阿里巴巴矢量图标)
  18. simpread-PCB 基本布线规范与设计原则
  19. LiteMes系统中对于文件系统的文件删除使用
  20. spring security logout(spring security登出示例)

热门文章

  1. GaitSet: Cross-view Gait Recognition through Utilizing Gait as a Deep Set 阅读笔记
  2. SpringBoot整合MyBatis遇到的问题(一)
  3. open3d学习教程2--点云1
  4. win10升级工具_Win7进入死亡倒计时!最后一次机会免费升级至win10,你抓住了吗?...
  5. Ubuntu 肉鸡 记
  6. 2019年就业前景最好的7大编程语言(内附python教程分享)
  7. Exception: Please add mujoco library to your PATH:set PATH=C:\User\*\ .mujoco\mujoco200\bin;%PAT
  8. matlab一阶电路瞬态响应,MATLAB在一阶动态电路特性分析的应用
  9. 已知法向量 求投影_求点在平面上的投影点坐标
  10. 中国姓氏大全,百家姓