目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

全球定位系统(gps)是一种全天候、全球覆盖、高精度、自动化的卫星导航定位系统,该系统向有适当接收设备的全球范围用户提供精确、连续的三维位置和速度信息。gps自投入运行以来,已经发展成为一个涵盖各领域的服务系统。

卫星信号的捕获算法是卫星定位接收机的关键,传统的捕获算法通常采用基于fft的相干积分和非相干积分相结合的方法,例如在使用gps信号进行定位和导航前首先需要对卫星信号进行捕获,gps卫星信号的传统捕获算法一般为频域并行捕获算法,频域并行捕获算法的原理框图如图3所示,频域并行捕获算法是一种基于fft的捕获算法,搜索覆盖全部搜索频点和全部伪码序列,对于正常功率的gps信号,通常只需要处理lms的导航数据,就能够完成gps信号的捕获,但是对于gps弱信号而言,通常处理lms的导航数据所获得的判决量并不可靠,难以实现捕获,此时就需要通过增加捕获算法所用的数据长度,采用相关积分和非相关积分相结合的方法,来提高捕获灵敏度,但同时导致fft相关运算的计算量将成倍增长,从而造成捕获速度降低。

为了跟踪和解码GPS信号,首先要捕获到GPS信号。将捕获到的GPS信号的必要参数立刻传递给跟踪过程,再通过跟踪过程便可得到卫星的导航电文。GPS卫星处于高速运动中,因此,其频率会产生多普勒频移。载波频率与C/A码的多普勒频移将在下面详细讲述。

GPS卫星发送的信号一般由3个分量组成:载波、伪码和导航电文,其中伪码和导航电文采用BPSK技术去调制载波。

为了跟踪和解码GPS信号,首先要捕获到GPS信号。将捕获到的GPS信号的数据传递给跟踪过程,再通过跟踪过程便可得到卫星的导航电文。传统的GPS捕获方法有:串行搜索捕获、滑动相关法、循环相关法、PMF算法。

GPS卫星信号是发生在两个L波段频率的载波信号L1和L2,两个载波频率分别是L1的主频率fL1和L2的次频率fL2。在L波段进行调制可以避免拥挤,因为L波段的频率占据使用比率和其他波段相比要低一些,有助于全球性观测;L波段上更容易进行扩频(将低比特率的电文转换成高比特率的组合码,有利于卫星信号的保密性),发送宽带信号;L波段大气偏差和电离偏差小,接收设备可以更简单、更经济地接收和测量。每一颗卫星均有唯一的扩频码或伪随机序列,由此调制出载波频率。

2.仿真效果预览

matlab2022a仿真结果如下:

3.MATLAB核心程序

clc;
clear;
close all;
warning off;
addpath(genpath(pwd));rng('default')
%%
%11111111111111111111111111111111111111111111111111111111111
isnoise         = 0;%1:add noise;0 good signal
%nosie awgn
SNR             = -19;%Q1
satellite       = [1,12,14,22];
satellitenumber = length(satellite);
fs              = 16.368e6; %sampling freq
IF              = 4.092e6;%centered
fIFD            = IF + 5e3 - 10e3*rand(1,satellitenumber);%no more than 5 KHz in absolute value
Fai             = 2*pi*rand(1,satellitenumber);%random values
Ai              = 0.7+0.3*rand(1,satellitenumber);%random between 1 and 0.7 for different satellites
taoi            = floor(4e5*rand(1,satellitenumber)) + 2e5; %random between 1 and
Dur             = 20;%bit duration,20ms
Len             = 50;%data bit length,1s
%
CHIP_TIME       = 977.5e-9;    % chip time in seconds
ts              = 1/fs;
n               = fs/1000;
nn              = [0:n-1];
millisecond     = 1000;x_bound         = (ts/2)/CHIP_TIME;  % Maximum offset
d_samp          = 6; % sample offset between correlators
d               = (d_samp*ts)/CHIP_TIME;
msSamp          = 16368;for i = 1:satellitenumberi%C%1ms with 16 samplescode0   = digitizg(fs/1000,fs,0,satellite(i));%20mscode1   = [code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0,code0];%lenCA      = [];for j = 1:LenCA = [CA,code1];end%DDi0       = 2*double(rand(1,Len)>=0.5)-1;%output the datafor j = 1:LenDout2{i}(Dur*(j-1)+1:Dur*j) = Di0(j);endfor j = 1:length(Dout2{i})Di2(length(code0)*(j-1)+1:length(code0)*j) = Dout2{i}(j);end%Ssignal0 = Ai(i).*CA.*Di2;%16times%delay taoi/61delays  = floor(taoi(i)/61);signal3 = [zeros(1,delays),signal0(1:end-delays)];%carriert       = 0:1/fs:(length(signal3)-1)/fs;carrier{i} = cos(2*pi*fIFD(i)*t+Fai(i));Si0{i}     = signal3.*carrier{i};
end
%noise awgn
if isnoise==0Si_ = Si0;
elsefor i = 1:satellitenumberSi_{i} = awgn(Si0{i},SNR,'measured');end
end%combine
Si= Si_{1};
for i = 1:satellitenumber-1Si = Si + Si_{i+1};
endfigure;
subplot(221);
stem(Dout2{1});
title('data bits of satelite 1');
axis([0,1000,-2,2]);
subplot(222);
stem(Dout2{2});
title('data bits of satelite 12');
axis([0,1000,-2,2]);
subplot(223);
stem(Dout2{3});
title('data bits of satelite 14');
axis([0,1000,-2,2]);
subplot(224);
stem(Dout2{4});
title('data bits of satelite 22');
axis([0,1000,-2,2]);ttt = 0:1000/(length(Si)-1):1000;
figure;
plot(ttt,Si);
title('Combined Si');figure;
plot(ttt(10000:10200),Si(10000:10200));
title('Combined Si local');%%
%22222222222222222222222222222222222222222222222222
%fine frequency estimation
segment=5;
for a=1:satellitenumberfor b=1:segmentoutput               = acquisition(Si',satellite(a),b);correlation(:,a,b)   = output{1};correlationpeak(:,a) = output{2};frequency(:,a,b)     = output{3};finefrequency(a,b)   = output{4};                endfinefrequencyaverage(a)  = mean(finefrequency(a,:));
end
finefrequencyaverage
fIFD
err = finefrequencyaverage-fIFD
X=[fIFD;finefrequencyaverage]';
figure;
bar(X);
axis([0,5,4.0e6,4.2e6]);
legend('Blue:real frequency','Red:fine frequency estimation');
xlabel('4 different satellite');
ylabel('frequency est');%code phase
segment=5;
for a=1:satellitenumberData = [Si]';for b=1:segmentoutput               = acquisition(Data,satellite(a),b);correlation(:,a,b)   = output{1};correlationpeak(:,a) = output{2};frequency(:,a,b)     = output{3};finefrequency(a,b)   = output{4};                endfinefrequencyaverage(a)  = mean(finefrequency(a,:));
endfigure;
codephases = [];
for a=1:satellitenumberPdata = correlation(:,a,1);subplot(4,1,a);plot(Pdata);[V,I] = max(Pdata);hold onplot(I,V,'r*');xlabel('times');ylabel('correlation');title(['satellite',num2str(satellite(a))]);codephases = [codephases,I];
end
%code phase of 4
codephases
taois=codephases*61
taoi
%%
%3
for a=1:satellitenumberaData = [Si]';for c=1:millisecond%BASS method.%use the same C/A code from BASS to correlate all 1 ms segments one at a timecacode(:,a)           = digitizg(n,fs,0,satellite(a)); %fine frequencylc(:,a)               = exp(sqrt(-1)*2*pi*finefrequencyaverage(a)*ts*nn);lsi(:,a)              = cacode(:,a).*lc(:,a);lcf(:,a)              = fft(lsi(:,a));xf                    = fft(Data((c-1)*n+1:c*n));f(:,a)                = ifft(exp(-sqrt(-1)*2*pi*finefrequencyaverage(a)*ts*(c-1))*xf.* conj(lcf(:,a))); [amp(c,a),ccn(c,a)]   = max(abs(f(:,a)));        codephase(c,a)        = angle((f(ccn(c,a),a)));correlationphase(c,a) = angle((lsi(ccn(c,a),a)));endccnmax(a)   = max(ccn(:,a));tmps        = find(ccn(:,a)==ccnmax(a));location(a) = tmps(1);
endfigure
for a=1:satellitenumbersubplot(4,1,a);stem(codephase(:,a));title('Correlation result');
end
figure
for a=1:satellitenumbersubplot(4,1,a);stem(correlationphase(:,a));title('Correlation Phase');
end
figure
for a=1:satellitenumbersubplot(4,1,a);stem(amp(:,a));title('Correlation Magnitude');
end%Fine time estimate
for a=1:satellitenumberfor tt = 1:millisecondcacode(:,a)      = digitizg(n,fs,0,satellite(a)); ffreq            = finefrequencyaverage(a);code_phase       = ccn(c,a);local_carrier    = exp(1i*2*pi*ffreq*ts*nn); Data_carrier_off = [Data((tt-1)*n+1:tt*n)]'.*local_carrier; input_ms_tt      = Data_carrier_off;    corrs            = ifft(fft(input_ms_tt).* [conj(fft(cacode(:,a)))]'); early            = corrs(code_phase - d_samp);late             = corrs(code_phase + d_samp); r(tt,a)            = abs(late)/abs(early); x(tt,a)            = ((1-r(tt,a))*(1-d))/(1+r(tt,a));  if mod(tt,10) == 0 xx(tt/10,a) = mean(x(tt-9:tt,a));  % Average the past 10 fine time estimates end  end
endfigure;
for i=1:satellitenumber
subplot(4,1,i);
stem(xx(:,i)*CHIP_TIME);
title('Averaged Fine Time Estimates for 10ms segments of data');
xlabel('10ms');
ylabel('Fine time Est (s)');
endfigure;
for i=1:satellitenumber
subplot(4,1,i);
stem(x(:,i)*CHIP_TIME);
title('Fine Time Estimates for 1 ms segments of data');
xlabel('1ms ');
%xlim([0,13]);
ylabel('Fine time Est (s)');
end
%%
%456together
%phase transitions
for sj=1:satellitenumbertmps = find(amp(:,sj)>0);start(sj) = tmps(1);fprintf(['The initial data bits boundary from satellite ',num2str(satellite(sj)),' is : ',num2str(start(sj)),'ms\n\n']);Recive_bits(:,sj) = Dout2{sj}(1)*ones(Len*Dur,1);
end
for sj=1:satellitenumber%enhance the special pointcorrd = [amp(:,sj)].*[amp(:,sj)].*[amp(:,sj)].*[amp(:,sj)];corrd = corrd-min(corrd);%find the transitions positionCount1=0;Count2=0;for j = 3:length(corrd)-2if corrd(j)>2*corrd(j-1) & corrd(j)>2*corrd(j+1) & corrd(j)>2*corrd(j-2) & corrd(j)>2*corrd(j+2) Count1=Count1+1; endif corrd(j)<0.4*corrd(j-1) & corrd(j)<0.4*corrd(j+1) & corrd(j)<0.4*corrd(j-2) & corrd(j)<0.4*corrd(j+2) Count2=Count2+1; end        endif Count1 < Count2threshold = 0.4*mean(corrd);Pos      = find(corrd<=threshold);elsethreshold = 1.5*mean(corrd);Pos      = find(corrd>=threshold);endif isempty(Pos)==1if sj == 1 ;disp('satellite 1  failed.....'); endif sj == 12;disp('satellite 12 failed.....'); endif sj == 14;disp('satellite 14 failed.....'); endif sj == 22;disp('satellite 22 failed.....'); endelseif Pos(1)==1for j = 3:length(Pos);Recive_bits(Pos(j-1)+1:Pos(j),sj) = -1*Recive_bits(Pos(j-1),sj);%transitionsendelsefor j = 2:length(Pos);Recive_bits(Pos(j-1)+1:Pos(j),sj) = -1*Recive_bits(Pos(j-1),sj);%transitionsendendRecive_bits(Pos(end)+1:end,sj) = -1*Recive_bits(Pos(end),sj);end
endfigure;
subplot(221);
stem(Recive_bits(:,1));title('The data bits of satellite 1');
axis([0,1000,-2,2]);
subplot(222);
stem(Recive_bits(:,2));title('The data bits of satellite 12');
axis([0,1000,-2,2]);
subplot(223);
stem(Recive_bits(:,3));title('The data bits of satellite 14');
axis([0,1000,-2,2]);
subplot(224);
stem(Recive_bits(:,4));title('The data bits of satellite 22');
axis([0,1000,-2,2]);
01-155m

4.完整MATLAB

V

m基于matlab的GPS卫星信号捕获和数据解析仿真相关推荐

  1. 【天文】基于matlab实现GPS卫星运动仿真附matlab代码

    1 内容介绍 基于matlab实现GPS卫星运动仿真 2 部分代码 %time是个时间参数利用它可以画出一个看起来旋转的地球 function DrawEarth(time) r=6400; j1=[ ...

  2. 基于matlab的BOC调制信号捕获仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 随着全球导航卫星系统的高速发展,导航系统的数量也越来越多,比如使用最广泛的GPS导航系统,以 ...

  3. 基于matlab的GPS信号相关检测算法仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 全球定位系统(Global Positioning System,GPS),是一种以人造地球卫星为基 ...

  4. 基于matlab的gps信号仿真123,MATLABGPS信号仿真完整源代码.doc

    配套毕业设计论文见百度文库 请搜索 <基于MATLAB的GPS信号仿真123> 附录 仿真程序代码 数据码的产生 function datacode=data(x) y=rand(1,x) ...

  5. matlab gps 卫星导航信号,基于MATLAB的GPS信号仿真123.doc

    <基于MATLAB的GPS信号仿真完整源代码123> 摘 要 . 关键词::MATLAB: Abstract As the new generation of the satellite ...

  6. GPS研究---GPS卫星信号

    文章目录 1.GPS 卫星信号 2.C/A码与P码 1. C/A 码 2. P 码 3.GPS 卫星的导航电文 4.卫星位置计算 1.GPS 卫星信号 GPS 卫星信号是 GPS 卫星向广大用户发送的 ...

  7. GNSS原理与应用(五)——GPS卫星信号

    目录 1.前言 2.GPS卫星信号的组成 2.1关于GPS的三种信号 2.2GPS卫星信号结构 2.3GPS卫星信号频率 3.载波 3.1载波的作用 3.2载波的类型 3.3载波的特点 4.GPS的测 ...

  8. GPS卫星信号(一):测距码信号

    GPS卫星信号(一):测距码信号 一.伪随机码 1.码的基础概念 ①.码    表达不同信息的二进制数及其不同组合. ②.码元  一位二进制数叫一个码元(0 或 1). ③.编码  按某种标准用二进制 ...

  9. 基于matlab的GPS单点定位程序开发(初学者)

    基于matlab的GPS单点定位程序开发 开发初衷 本人是测绘专业的学生,在初学GPS时遇到了很多代码问题,因此希望这篇文章能够帮助广大的测绘和导航专业的学子 代码开始 开发的第一部分是:文件读取,文 ...

最新文章

  1. Python之父:Python 4.0可能不会来了
  2. Python批量将ppt转换为pdf
  3. VC++ 多文档模板(添加新文档模板)编程实例
  4. php k线 形态识别,趋势追踪,从设计交易系统开始(七)——形态识别,不只有K线...
  5. Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)
  6. 2007-11-7学习EXT第一天:EXT简介
  7. fopen如何保存西里尔文文件名_如何下载微信视频号的视频?
  8. iPhone 13外观四年以来首次改动:真的尽力了
  9. 如何进阶一名有竞争力的程序员?
  10. c语言api接口文档模板,apiDoc生成接口文档,不费吹灰之力
  11. itop4412的安卓驱动移植
  12. vue 动态引入组件
  13. 【史上最全】设计师必备的83个设计资源网站
  14. OSChina 周日乱弹 —— 跨界程序员
  15. 功能:编写函数long fun ( char *p),将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
  16. ClassOne 向 MicroLED 初创公司 Raxium 提供 Solstice 工具
  17. 闲鱼易用高可扩的文章发布工具建设
  18. python天勤金叉编程代码大全_天勤终端数据解决方案
  19. 使用tensorboard时踩的坑
  20. Almeida–Pineda algorithm

热门文章

  1. java excel 字体_Java 在Excel单元格中应用一种/多种字体样式(实例代码)
  2. 淮北最好吃的,不能错过的店
  3. 信息收集——善用搜索引擎
  4. 读研究生与蹲监狱的联系和区别
  5. 计算时间差C语言实现
  6. 丰润达S400来了!5.8G千兆无线网桥“横空出世”
  7. (完美)华为畅玩5 CUN-AL00的Usb调试模式在哪里开启的步骤
  8. 小白学做网云小程序(2)
  9. 老板忙、团队盲、员工茫
  10. PostgreSQL整数除法注意事项