GPS软件接收机matlab程序学习笔记(一)
clear all;clc;cla;close all;
format longg; %%15位有效数
%% 一、 设定GPS数据文件参数 %%%%%%%%%%%%%%
gps_bd = 0; % 0:gps, 1:bd
n_mean_count = 200; %bias count
if gps_bd == 0% 这个中频数据是 bit8filename = '.\data\GPS_sim_5mfs_if1.42m.txt';% 相对路径 当前工程文件夹下的data文件夹下的GPS_sim_5mfs_if1.42m.txt文件fs = 5e6; % 采样率★书本260页实际采样在5E6fc = 1.42e6;% 采样数据中频★sv = 1:32;% 要捕获跟踪的卫星号 若不知道有哪些星可以设置为 sv=1:32 但这样处理速度会比较慢★Readtype = 'bit8';%数据读取位宽,要注意 不同的中频信号采样位是否一致,有符号采样时,高位为符号位,低位为幅值位% filename = 'D:\9.WorkInTheLab\0.Project\0.GNSS_SignalQualityMonitor\1.data\2771\data\GPSL1_8bit_fs16.369M_fc3.996M.bin';
% fc = 3.996e6;
% fs = 16.369e6;
% sv = 28;
% Readtype = 'bit8';% filename = 'C:\MATLAB7\work\BDSB1-8bit-PwrSpectAbnorm-202006172224.bin';
% fc = 3.996e6;
% fs = 16.369e6;
% sv = 1:32;
% Readtype = 'bit8';disp 'gps acq'
elsefilename = 'C:\MATLAB7\work\usbdata.bin';fc = 3.999875e6;fs = 16.369e6;sv = 1:32;Readtype = 'bit8';disp 'bd acq'
end
%% 二、 任务配置 %%%%%%%%%%%%%%
task_AcqOnly= 0 ; %捕获标志,为1时只进行捕获,为0时则进行捕获跟踪
task_Acq_Track=1; %捕获跟踪标志,为1 - 则进行捕获、跟踪;为 0 则调用以前结果进行NAV定位
track_acqresultsName='capture_test.mat';%%捕获跟踪后生成的数据保存名字,task_Acq_Track = 0 时则直接调用此数据进行定位解算。注意每次用不同的中频数据时取不同的名字,以免覆盖。
task_frameFindChk= 1 ; %找子帧标志, 1则找子帧,其他则不进行 0
task_nav = 1 ; %定位解算标志 1则参与定位解算,其他则不进行 0
plotAcq_AND_Channel= 1 ; %捕获通道画图标志,1则画图,其他则不进行
plot_Acq_ACF= 1 ; %捕获三维图和相关累加画图标志,1则画图,其他则不进行
if task_Acq_Track==1 %捕获跟踪标志,为1 - 则进行捕获、跟踪;为 0 则调用以前结果进行NAVtask_load_results= 0 ;
elsetask_load_results= 0 ;
end
%% 三、 捕获、跟踪参数设置 %%%%%%%%%%%%%%
% file_sec=0.400; %跟踪时间★,单位为秒,理论上大于30秒后方可能定位解算,一般取33来验证,也可长时间跑看定位效果 %%!!!!!!注意如果有时数据长度不够的话,会报错。如此时的数据GPS_sim_5mfs_if1.42m.txt用36s就会报错,用33则不会。
file_sec=33; %跟踪时间要这么长?★
channels=8; %通道数设置★8-12书上,但后面真正用到的不一定是8,可能<8
acq_th=2.5; %捕获门限★
K=1; %非相干累加次数★
fc_lo=fc-5000;fc_hi=fc+5000;step=100;%doppler bin★
nav_interval=0.001; %导航定位解算时间间隔,单位为秒★
ts=1/fs; %采样时间★
n=fs/1000; n_mli=n; %1ms的采样点数 ★
nn=0:n-1; %采样点范围 ★
num_sec=0.011; %读取文件中的长度设置,★
n_samples=fs*num_sec; %读取文件中的采样点个数,如当前设置为10ms采样数据
plot_acq_bar_par = []; %捕获柱状画图卫星SNR计数%% 四、 读取 真实采集数据或调用以前的处理结果%%%%%%%%%%%%%%%%%%%%%
if task_Acq_Track==1 fid = fopen(filename,'rb'); %打开filename路径读取文件 skipNumberOfBytes = fs * 3; %为什么是3?fseek(fid,skipNumberOfBytes, 'bof');data_sum=fread(fid,n_samples,Readtype); %以Readtype为文件格式,以n_samples为 数据长度已读取文件保存到data中fclose(fid); %关闭文件 data_sum=data_sum';%%%对读取数据进行处理,目的是把数据的值缩小一半缩小计算量,也可不处理拿来直接用n=4;data=data_sum;[data_bias,mean_data] = bias_control(data,n_mean_count);data = data_bias;plotPSD(data,fs);grid on; %功率画图xlabel('频率/MHz'); ylabel('功率谱密度/dB·Hz');title ('信号功率谱密度');
end
%%%%%%%%*********.load 以前的结果进行定位解算. .**********%%%%%%%%
if task_load_results==1load(track_acqresultsName); %导入捕获跟踪存储的数据直接用来导航定位解算
end%% 五、 ★捕获%%%%%%%%%%%%%%%%%%%%
if task_Acq_Track==1disp '1..Acqisiting.!----'acq=[]; %acq初始化j=1; %捕获卫星个数变量,用于保存捕获通道参数指向路径fprintf('(');for i=1:length(sv) %捕获设定的卫星编号svnum=sv(i); %当前捕获的卫星编号 if gps_bd == 0% 输入参数:中频数据,卫星编号,采样频率,频率搜索起点,频率搜索步长,频率搜索截止点,非相干累加次数,捕获门限% 输出参数:捕获成功标志,捕获的载波频率,捕获的码相位,非相干累加值,非相干累加值峰均比
% [acqOK,f,ph,acf,PAR]=GPSacquisition(data,svnum,fs,fc_lo,step,fc_hi,K,acq_th);[acqOK,f,ph,acf,PAR] = GPSacquisition_s(data,svnum,fs,fc_lo,step,fc_hi,K,acq_th);else[acqOK,f,ph,acf,PAR]=BDacquisition(data,svnum,fs,fc_lo,step,fc_hi,K,acq_th);endplot_acq_bar_par(i)=PAR;% ★捕获成功时,缓存捕获信息:非相干累加值,卫星编号,牵引载波频率,码相位% 画捕获三维图和非相干累加值图if acqOK figure;acfhandler=mesh(acf);set(acfhandler,'EdgeColor','none','Facecolor','interp');text=sprintf('SV %i',svnum);title(text); xlabel('码相位');ylabel('载波多普勒');[m fbin]=max(max(acf'));% 行号即是载波多普勒 [m ccn]=max(max(acf));% 列号即是码相位
% figure; plot(abs(acf(:,ccn)),'-o');
% xlabel('多普勒');ylabel('非相干积分值');
% figure; plot(abs(acf(fbin,:)),'-o');
% xlabel('码相位');ylabel('非相干积分值');
% [f_pull,dfreq]=gps_pvt_fpullin(data,svnum,f,fs,ph); % 5hz 高分辨率acq(j,1)=PAR; acq(j,2)=sv(i); %卫星编号acq(j,3)=f; acq(j,4)=ph; %码相位j=j+1; %每捕获一颗星,通道号+1fprintf('%d,', sv(i)); %捕获成功是则输出卫星号 elsefprintf('.'); %未捕获成功时则输出"."end endfprintf(')\n'); if isempty(acq)disp '---acq is failed---';return;elseplot_acq_bar(plot_acq_bar_par,acq_th); %捕获柱状画图 disp '2..Configure channels for track: 'disp ' _______________________________________________________'disp '| CH | PRN | Frequency | Doppler | CodePhase | PAR |';channel_num=min(channels,size(acq,1)); %取决于初始通道数和捕获卫星数if plotAcq_AND_Channel==1for i=1 : channel_numfprintf('| %2d | %2d | %6.2f | %6.0f | % 6d | %2.2f | \n',...i, ... %显示通道号 acq((i),2), ... %显示卫星编号acq((i),3), ... %载波频率acq((i),3) - fc, ... %多普勒频移 acq((i),4),... %码相位acq((i),1)); %非相干累加幅值endenddisp ' --end of Acqisition!AND Sort acqresults by PAR-----';[acq_SNRdescend]=gps_SoftReceiver_sort_acqdescending(acq);%把捕获的结果按SNR的顺序由大到小重新排列acq=acq_SNRdescend; end
end
%% 六、★跟踪并处理、保存结果
if task_AcqOnly==0 %到本脚本的结束位置 if (task_Acq_Track==1&&task_AcqOnly==0)%%6.1---跟踪初始化 % %disp '3..Tracking.!----'length_ms=file_sec*1000; %跟踪时间长度Ips=zeros(channel_num,length_ms); %I路信号初始化Qps=zeros(channel_num,length_ms); %Q路信号初始化code_shifts=zeros(channel_num,length_ms); %码相位偏移初始化navidatas=zeros(channel_num,length_ms/20+2); %电文数据比特长度初始化navdata_indexs=zeros(channel_num,length_ms/20+2); %电文数据比特长度深度初始化 carr_Freqs=zeros(channel_num,length_ms); %载波频率初始化carr_remPhases=zeros(channel_num,length_ms); %载波角频率初始化code_Freqs=zeros(channel_num,length_ms); %码频率初始化code_remPhases=zeros(channel_num,length_ms); %码角频率初始化%%6.2******跟踪-输出导航电文 + 数据解调+1-1 并主意这里的跟踪相位*%%%%%%%%%Bit_sync_OK =0;Bit_sync =zeros(channel_num,length_ms); for i=1:channel_numfprintf(' %d ',i) %输出当前跟踪通道phase=acq((i),4); %码相位%函数:gps_pvt_track_beijingNCO 跟踪环% 输入:[路径文件名,卫星号,采样频率,捕获载波频率,捕获码相位,跟踪时间,读取数据位宽,捕获通道总数,当前通道号]% 输出:[I路数据,Q路数据,码相位偏移地址,EPL功率值,包含多普勒频移载波频率,载波角相位,码频率,码角相位] [Ip,Qp,code_ph_shift,acf_EPL,carr_Freq,carr_remPhase,code_Freq,code_remPhase]=gpsTracking(filename,acq((i),2),fs,acq((i),3),phase,file_sec,Readtype,skipNumberOfBytes,channel_num,i);% Ips(i,1:length(Ip))=Ip; %Ip路数据
% Qps(i,1:length(Qp))=Qp; %Qp路数据
% code_shifts(i,1:length(code_ph_shift))=code_ph_shift; %码相位偏移地址
% carr_Freqs(i,1:length(carr_Freq))=carr_Freq; %包含多普勒频移的载波频率
% carr_remPhases(i,1:length(carr_remPhase))=carr_remPhase; %载波角相位
% code_Freqs(i,1:length(code_Freq))=code_Freq; %码NCO
% code_remPhases(i,1:length(code_remPhase))=code_remPhase; %码角相位end
% save (track_acqresultsName, 'channel_num', 'navidatas','code_shifts', 'Qps', 'Ips', ...
% 'navdata_indexs','Bit_sync','acf_EPL' ,'acq','fs','carr_Freqs','carr_remPhases','code_Freqs','code_remPhases','fc');%注意每次保存后更改data的名字 以免覆盖
% fprintf('\n');disp '..End of Track AND track_acqresults saved!----'elsedisp 'task_track=0'endfigure; subplot(2,1,1),plot(Ips,'-o');subplot(2,1,2), plot(Qps,'-*');
end
%
GPS软件接收机matlab程序学习笔记(一)相关推荐
- MATLAB接收机位置解算,GPS-receiver GPS软件接收机代码 完整的捕获 解算定位 (可 8个通道) matlab 240万源代码下载- www.pudn.com...
文件名称: GPS-receiver下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 148 KB 上传时间: 2015-07-02 下载次数: 0 提 供 ...
- 微信小程序学习笔记一 + 小程序介绍 前置知识
微信小程序学习笔记一 1. 什么是小程序? 2017年度百度百科十大热词之一 微信小程序, 简称小程序, 英文名 Mini Program, 是一种不需要下载安装即可使用的应用 ( 张小龙对其的定义是 ...
- 小程序 pagescrollto_微信小程序学习笔记(三)-- 首页及详情页开发
一.常用组件 在上一个章节中讲解了封装请求数据的模块,在此处请求轮播图的数据 1.首页轮播图数据的请求以及渲染 1.1 轮播图数据的请求 pages/home/home.js import 2 使用组 ...
- 微信小程序学习笔记(1)
微信小程序学习笔记 1.小程序代码结构 2.逻辑层和视图层 3. 小程序的宿主环境(通信模型.运行机制.组件.API) 4. 数据绑定和事件绑定 1.小程序代码结构 当开发者新建一个工程时,项目文件包 ...
- 系统辨识理论及MATLAB仿真——学习笔记(1)
系统辨识理论及MATLAB仿真学习笔记(1) 前言 目录 第1章 绪论 1.1 建立数学模型的基本方法 1.2 系统辨识的定义 1.3 系统辨识的研究目的 1.4 数学模型的分类 1.5 几种常见的数 ...
- matlab bwmorph spur,matlab图像处理学习笔记-数学形态与二值图像操作
matlab图像处理学习笔记-数学形态与二值图像操作 数学形态学主要处理的是二值图像,因为二值图像的处理操作比较简单. 9.1 数学形态学图像处理 基本思想:利用一个称作结构元素(structurin ...
- Linux0.12引导启动程序学习笔记(i386)
// 主题:Linux0.12引导启动程序学习笔记(i386) // 作者:kevinjz2010@gmail.com // 版权:kevinjz原创 // 平台:80386 // 发布日期:2011 ...
- 微信小程序学习笔记(七)----简单文章推荐列表和分类图标的实现
想要实现一个顶部是几篇纯文字的推荐文章,推荐文章下面是四个分类图标,具体实现出来是这个样子的,比较简单: 首先先来找一下素材,这几个图标是我在阿里巴巴图标库下载的,这里是下载地址: http://ww ...
- 小程序学习笔记(1)
小程序学习笔记(1) 以下是学习期间记录的笔记: 10-18号晚上学习笔记: 小程序实际上是需要下载安装的,只是很小,用户基本上觉察不到 组件是具有一定的功能的代码的集合 移动端适配: 物理像素:是图 ...
最新文章
- iMeta | 中科院生态中心邓晔组发布微生物组网络分析平台iNAP(图文/视频教程)
- 极大似然估计_计量经济学 | 极大似然估计
- Eclipse项目部署到Tomcat中路径
- Qt中的QDialog
- [数据结构]快速排序
- nginx大量TIME_WAIT的解决办法 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'...
- 使用opencv读取图片错误([ WARN:0@13.701] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\..)
- android 使用String.format(%.2f,67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号...
- 【在线报表设计】提升报表外观的15个技巧
- java inputstream字节流_Java输入输出流ByteArrayInputStream和ByteArrayOutPutStream
- java空类型方法无参_类的无参方法
- struts2 防止重复提交 与 进入等待画面
- CDQZ_Training 2012-05-24 聪明的打字员
- awk if 不包含_linux高级运维必会命令——AWK命令详解及实例分享
- python 列表操作详解,Python列表解析操作实例总结
- 遍历图像方法以及注意事项
- 基于JavaWeb的幼儿园信息管理
- 调试技巧(Debugging)
- 小白的编程经验(vim编辑器的使用)
- 中企故事汇:铁匠之乡借东风出海
热门文章
- 季节性时间序列分析-SARIMAX模型的python实现
- 周期性时间序列的预测
- 计算公式 - 四则运算实现
- literal_eval不能执行函数及其本质
- 2017全国计算机教育大会,GCCCE 2017 全球华人计算机教育应用大会
- oneinstack_OneinStack常用命令
- android studio 中无法安装或打开sdk管理,或者是异常android studio Illegal char 《:》 at index 40
- HBuildX的下载与安装
- c语言整形实数除法四舍五入吗,如何确保整数除法总是四舍五入?
- python 大整数的精确计算——除法(/)、整数除法(//)