m基于VDLL的矢量型GPS信号跟踪算法matlab仿真
目录
1.算法概述
2.仿真效果预览
3.MATLAB部分代码预览
4.完整MATLAB程序
1.算法概述
载波跟踪环是传统独立式GPS接收机最脆弱的环节,针对弱信号环境下其比伪码跟踪环路更容易失锁的问题,给出一种基于矢量频率锁定环(vector-frequency lock loop,VFLL)的载波跟踪方法。给出VFLL理论推导及实现过程,并以最小二乘估计方法证明VFLL在载波跟踪性能上优于频率锁定环(frequency lock loop,FLL)。静止场景时9颗卫星实验结果显示,本文给出的方法能够实现14 dB/Hz微弱GPS信号的载波跟踪。 矢量型GPS信号跟踪算法(矢量延迟锁定环VDLL)
而在VDLL中,仅仅在DLL中对码跟踪进行改进,使其通过中心滤波器,而载波跟踪和传统的算法相同。所以,下面将重点对延迟锁定环进行改进,也就是你的课题的VDLL延迟锁定环。而VDFLL则是对码和载波分别进行改进。其基本结构如下所示:
即使用卡尔曼替代PLL,使用EKF替代DLL。这个是VDFLL,而VDLL则使用扩展卡尔曼滤波替代原DLL即可。
提出的VDLL(vector delay lock loop)方法直接估计用户位置信息,由于用户物理动态有限,与传统的独立通道码环相比,跟踪的维度和带宽都更小,所以该方法具有更强的鲁棒性.阐述了VDLL与传统独立通道码跟踪环的本质区别,建立了VDLL的非线性系统模型,推导了系统观测量与传输延迟估计误差的具体线性化关系,确立了观测误差方差矩阵的计算公式;然后对非线性系统模型进行线性化,给出了多卫星联合跟踪下用户位置更新的EKF(extended Kalman filte-ring)滤波算法.
EKF
扩展卡尔曼滤波(Extended Kalman Filter,EKF)是标准卡尔曼滤波在非线性情形下的一种扩展形式,它是一种高效率的递归滤波器(自回归滤波器)。EKF的基本思想是利用泰勒级数展开将非线性系统线性化,然后采用卡尔曼滤波框架对信号进行滤波,因此它是一种次优滤波。
标准卡尔曼滤波KF的状态转移方程和观测方程为
扩展卡尔曼滤波EKF的状态转移方程和观测方程为
(1)
(2)
利用泰勒展开式对(1)式在上一次的估计值处展开得
(3)
再利用泰勒展开式对(2)式在本轮的状态预测值处展开得
(4)
其中,和分别表示函数和在和处的雅克比矩阵。
(注:这里对泰勒展开式只保留到一阶导,二阶导数以上的都舍去,噪声假设均为加性高斯噪声)
基于以上的公式,给出EKF的预测(Predict)和更新(Update)两个步骤:
Propagation:
Update:
其中的雅克比矩阵和分别为
,
雅可比矩阵的计算,在MATLAB中可以利用对自变量加上一个eps(极小数),然后用因变量的变化量去除以eps即可得到雅可比矩阵的每一个元素值。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB部分代码预览
...............................................................
%参数初始化
time = 1000*(10^(-3)); % 数据发送时间
time_unit = 20*(10^(-3)); % 数据跳变时间单位
time_cyc = 1*(10^(-3)); % 一个完整扩频码周期
fs = 5*(10^6);
nn = time_cyc*fs;
kk = (time/time_cyc)*nn;% 数据总采样点
F_if = 1.25*(10^6); % 载波中频
F_Carrier = 1575.42*(10^6); % L1波段载波频率
CA_freq = 1.023*(10^6); % CA码速率%%
%%
%生成C/A码
PN = func_CAcodegen(svnum);
CA = [];
k = 5;
for n = 1:length(PN)CA((1+k*(n-1)):k*n) = PN(n)*ones(1,k);%CA码扩展
end
tc = 1/(k*CA_freq);
loop_time = time/time_cyc;%%
%%
%模拟产生测试信号源
[Signal_Source,Phase_signal,buffer_bit_data]=func_CreateSource(iniphcode,inifd,iniph,snr); %%
%%
%在模拟之前,首先需要进行捕获
[fd_ac,f_ac_code,Corr_value] = func_acquire(Signal_Source);
figure
mesh(Corr_value);title('捕获结果');%信号中断起始时间
break_start = 400;
break_end = 800;P0 = [0 00 1];
P = [P0 zeros(2,2*(loop_time-1))];
T = 0.1;
LL = loop_time;
Y0 = [0;1];
data_out(:,1) = Y0; %Y的第一列等于Y0
A = [1 T0 1];
B = [1/2*(T)^2 T]';
H = [1 0];
Q = (0.25)^2;
R = (0.25)^2;
X = zeros(1,loop_time);%%
%%
%跟踪参数设置
tracking_parameter();
%进行跟踪
for i = 1:1:loop_time i%开始循环,每次循环去除一段数据%开始循环,每次循环去除一段数据%模拟信号突然中断if i > break_start & i < break_endSignal = 0.0001*rand(1,nn);%中断的时候,该段数据为随机的噪声干扰elseSignal = Signal_Source((i-1)*nn+1:i*nn);end%产生本地载波t = [0:nn-1]*ts;track_dopplar = fd_ac + track_freq_pll;Track_Freq_Buffer = [Track_Freq_Buffer track_dopplar];track_dopplar2 = [track_dopplar2 track_freq_pll];Local_I = cos(2*pi*(F_if+track_dopplar)*t + Last_Phase);Local_Q = sin(2*pi*(F_if+track_dopplar)*t + Last_Phase);Iph = 2*pi*(F_if+track_dopplar)*t + Last_Phase;Local_Ph_Buffer = [Local_Ph_Buffer Iph];Last_Phase = Last_Phase + 2*pi*(F_if+track_dopplar)*time_cyc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Carrier_I = Local_I;%产生本地的载波Carrier_Q = Local_Q;%产生本地的载波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%产生本地相位码%利用DLL的思路%当前ph_code_p = offside;fd_code_p = track_dopplar;CA_Code_p = func_CA(ph_code_p,fd_code_p,i);lc_p = CA_Code_p.*Signal;%早ph_code_e = offside+diffoffside;fd_code_e = track_dopplar;CA_Code_e = func_CA(ph_code_e,fd_code_e,i);lc_e = CA_Code_e.*Signal; %迟ph_code_l = offside-diffoffside;fd_code_l = track_dopplar;CA_Code_l = func_CA(ph_code_l,fd_code_l,i);lc_l = CA_Code_l.*Signal;%下变频Local_P_I = lc_p.*Carrier_I;Local_P_Q = lc_p.*Carrier_Q;Local_E_I = lc_e.*Carrier_I;Local_E_Q = lc_e.*Carrier_Q;Local_L_I = lc_l.*Carrier_I;Local_L_Q = lc_l.*Carrier_Q;%积分运算IPSum = sum(Local_P_I);QPSum = sum(Local_P_Q);IESum = sum(Local_E_I);QESum = sum(Local_E_Q);ILSum = sum(Local_L_I);QLSum = sum(Local_L_Q);%码相位环路控制%鉴想器 theta_code = ((IESum.^2+QESum.^2)-(ILSum.^2+QLSum.^2))/((IESum.^2+QESum.^2)+(ILSum.^2+QLSum.^2));I2_Q2(i) = IESum.^2 + QESum .^2;%kalmandata(:,i) = theta_code;j = (i-1)*2+1;K = P(:,j:j+1)*H'*inv(H*P(:,j:j+1)*H'+R);%滤波增益data_out(:,i) = data_out(:,i)+K*(data(1,1)-H*data_out(:,i)); %估计data_out(:,i+1) = A*data_out(:,i); %预测P(:,j:j+1) = (eye(2,2)-K*H)*P(:,j:j+1); %误差P(:,j+2:j+3) = A*P(:,j:j+1)*A'+B*Q*B'; %kalman滤波CodeErr = data_out(1,i)/20;%码环NCOoffside = offside_old+k1*CodeErr; %码NCO的输出theta_code_old = theta_code; %将当前结果保存,用于下一个循环的码跟踪CodeErr_old = CodeErr; %将当前结果保存,用于下一个循环的码跟踪offside_old = offside; %将当前结果保存,用于下一个循环的码跟踪Bk_DLL = [Bk_DLL theta_code]; %记录跟踪过程中的码环鉴想器的输出Track_Code_Buffer = [Track_Code_Buffer offside]; %记录跟踪过程中的码环NCO的数出%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%载波跟踪%载波跟踪%载波跟踪theta_pll = atan(QPSum/IPSum);PLLinput = theta_pll/(2*pi*time_cyc);Bk_PLL = [Bk_PLL theta_pll];%LoopFilter PLLoutput = func_CarLoopFilter(carrierw,carrierpllb/2,PLLinput,PLLinput_old,PLLoutput_old); track_freq_pll = -PLLoutput;PLLinput_old = PLLinput; PLLoutput_old = PLLoutput; adj_flag = track_dopplar - track_dopplar_old; track_dopplar_old = track_dopplar; adj_buffer = [adj_buffer adj_flag];outdata = sign(real(IPSum)); ALL_Buffer_Data = [ALL_Buffer_Data outdata];if adj_flag < 1 add = add+1;elseadd = 0;endif add >= 2 dem_flag = 1;endif dem_flag == 1count_time = i;count_buffer = [count_buffer count_time];Buffer_Data = [Buffer_Data outdata];end
end%%
%%
%位同步与数据解调
Buffer_Data_out = func_bitssync(Buffer_Data,count_buffer);
l_i_d = time/time_unit;
l_o_d = length(Buffer_Data_out);
l_zeros = l_i_d - l_o_d;
Buffer_Data_out = [zeros(1,l_zeros) Buffer_Data_out]; %跟踪误差
l_dll = length(Track_Code_Buffer);
l_fll = length(Track_Freq_Buffer);
diata_dll = (Track_Code_Buffer(40:l_dll)-iniphcode); break_start = 400;
break_end = 800;
%多普勒频率跟踪
figure;
plot(Track_Freq_Buffer);
xlabel('时间(ms)');
ylabel('多普勒频率跟踪结果(Hz)')
title('多普勒频率跟踪结果');
grid on
hold onplot(break_start,min(Track_Freq_Buffer):0.01:max(Track_Freq_Buffer),'r-*','LineWidth',3);hold on
plot(break_end,min(Track_Freq_Buffer):0.01:max(Track_Freq_Buffer),'r-*','LineWidth',3);hold offfigure;
plot(I2_Q2(1:end),'LineWidth',3);
xlabel('时间(ms)');
ylabel('I^2+Q^2(Hz)')
title('I^2+Q^2');
grid on
hold onplot(break_start,min(I2_Q2(1:end)):100000:max(I2_Q2(1:end)),'r-*','LineWidth',3);hold on
plot(break_end,min(I2_Q2(1:end)):100000:max(I2_Q2(1:end)),'r-*','LineWidth',3);hold off%码相位跟踪
figure;
subplot(211);
plot(Track_Code_Buffer);
xlabel('时间(ms)');
ylabel('码相位跟踪结果');
title('码相位跟踪结果');
grid on
axis([0,length(Track_Code_Buffer),0.8*iniphcode,1.2*iniphcode]);
subplot(212);
plot(diata_dll);
xlabel('时间(ms)');
ylabel('码相位跟踪误差');
title('码相位跟踪误差');
grid on
axis([0,length(diata_dll),-10,10]);
hold onplot(break_start,-10:0.1:10,'r-*','LineWidth',3);hold on
plot(break_end,-10:0.1:10,'r-*','LineWidth',3);hold off
01_048_m
4.完整MATLAB程序
matlab源码说明_我爱C编程的博客-CSDN博客
V
m基于VDLL的矢量型GPS信号跟踪算法matlab仿真相关推荐
- 【GPS识别】低信噪比环境下GPS信号识别的MATLAB仿真
1.软件版本 MATLAB2021a 2.本算法理论知识 如图GPS系统的星座部分是由21颗工作卫星和3颗在轨备用卫星组成,其高度为20183km,这24颗卫星均匀分布在6个等间隔的.相对轨道面倾角为 ...
- 【调制识别】基于高阶累积量的调制方式识别算法matlab仿真,课题识别BPSK, QPSK, 16QAM, 64QAM
目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 由于数字调制信号越来越多地应用于通信信号处理领域,因此对数字信号调制识别的研究也越来越多.传统的调制识别的判决方法有:决策判决法.高阶 ...
- 一个简单的基于形态学处理的报纸图像版面分割算法matlab仿真
目录 一.理论基础 二.部分MATLAB仿真 三.仿真结论分析 一.理论基础 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤.现 ...
- 【随机共振】基于随机共振的高灵敏度GPS信号捕获算法
算法结构图 首先input输入到SR 这个语句意思就是每次输入一段数据进行处理,因为这个系统是实时反馈的系统,所以在处理的时候,必须是一段段处理,而不能和原来一样一次性进行处理,所以我们每次处理的数据 ...
- 基于平均不同分辨率的共振峰跟踪算法matlab仿真
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 共振峰轨迹的自动跟踪算法,其特点是不借助于其它的信息来源,仅仅是基于语谱图信息,来确定语谱图上前四个 ...
- m基于随机接入代价的异构网络速率分配算法matlab仿真
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 无线接入技术发展迅速,异构网络并存的现象普遍存在:同时,随着终端用户数量的剧增.业务类型的多样化和高 ...
- m基于贝叶斯理论的超分辨率重构算法matlab仿真,对比Tikhonov重构算法
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 超分辨率(Super-Resolution)通过硬件或软件的方法提高原有图像的分辨率,通过一系列低分 ...
- 基于混合高斯模型与帧差法结合的目标跟踪算法matlab仿真
目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 目标检测:混合高斯模型与帧差法结合的算法,与单独的混合高斯模型算法作对比,体现前者的优越性 3.要求和结果:对比改进前后的算法,可以非 ...
- 基于GA优化BP神经网络的传感器故障诊断算法matlab仿真
目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 1.做优化要先明白优化的结果是什么? 使得网络参数配置最优,测试集预测误差最小--适应度函数 2.可以通过改变什么来使得网络结果不同? ...
最新文章
- python详细安装教程环境配置-python环境配置详细步骤
- python 全局_全局关键字,带Python示例
- 10个管理工作时间的小技巧
- java list filter 性能,java的List中使用filter過濾出符合特定條件的元素List
- 富士康给员工分红 平均每人33万元
- python绘制3d动态模型_给大家介绍一个python三维动画制作库,数学作图,数据可视化建模...
- 快速搭建自己的人脸识别系统
- 机场三字代码和四字代码的资料汇编
- 关于MPU6050姿态解算的一阶互补滤波方法(从原理到代码实现)
- 《转》微商48种加人方法
- 如何设计一个优惠券系统
- 【光模块、光接口及光纤知识】
- CC00024.CloudOpenStack——|OpenStack组件.V02|——|OpenStack-Cinder块存储|配置block.V2|
- 弗雷塞斯 从生物学到生物信息学到机器学习 转录组入门(3):了解fastq测序数据...
- 面试了37位数据分析师,发现厉害的人都有这4个特质
- 《JavaScript高级编程》HTML中的JavaScript
- PHP实现生成推广海报的方法详解
- 计算机一些专业术语,计算机专业术语大全
- 人工智能数学课高等数学线性微积分数学教程笔记
- 16年蓝桥杯第九题-交换瓶子
热门文章
- 最长回文子串(C++)
- JCL中utilities的使用
- Visual Studio 的问题:unable to locate visual studio installer
- TP link driver - TL-WN823N linux驱动
- 第六讲 双指针、BFS与图论、单链表
- C++ unordered_map和unordered_set的使用
- java程序编译成exe文件_将java程序编译成独立运行的exe文件
- Go C编程 第1课 神奇的魔笔
- winform panel透明化,鼠标移动会闪烁
- Quartz自动任务