close all clear clc disp('***** 基于EKF的位置速度观测组合导航程序 *****'); disp('Step1:加载数据;'); load IMU_data200.mat %惯导原始数据 load Reference_data.mat %GPS测量数据 disp('Step2:初始化参数;'); %% 一些导航参数常数项 WIE = 7.292115e-5; % 地球自转角速度 r0 = 6378137.0; % 地球半径 EE = 0.0818191908426; % 偏心率 d2r = pi/180; % degree to radian r2d = 180/pi; % radian to degree dh2rs = d2r/3600; % deg/h to rad/s %% 导航坐标系下初始化姿态,速度,位置 yaw = (0)*pi/180;%航向角 pitch = 0*pi/180;%俯仰角 roll = 0*pi/180;%滚动角 cbn=eul2dcm(roll,pitch,yaw); cnb=cbn'; q=dcm2quat(cbn)'; Vn=0;%北向速度 Ve=0;%东向速度 Vd=0;%地向速度 V_last=[Vn Ve Vd]'; Lati = 31.4913627505302*pi/180;%纬度 Longi= 120.849577188492*pi/180;%经度 Alti = 6.6356;%高度 sampt0=1/200;%惯导系统更新时间 Rn = r0*(1-EE^2)/(1-EE^2*(sin(Lati))^2)^1.5; %子午圈曲率半径 Re = r0/(1-EE^2*(sin(Lati))^2)^0.5; %卯酉圈曲率半径 g_u = -9.7803267711905*(1+0.00193185138639*sin(Lati)^2)... /((1-0.00669437999013*sin(Lati)^2)^0.5 *(1.0 + Alti/r0)^2); g = [0 0 -g_u]';%重力 g0=9.80665; %% 卡尔曼滤波P、Q、R设置 % P的设置 std_roll = (5)*d2r; std_pitch = (5)*d2r; std_yaw = (60)*d2r; std_vel = 0.1; std_pos = 5; std_gyro = 3*0.5*dh2rs; % 陀螺随机漂移0.5度/小时 std_acc = 3*0.15e-3*g0; % 加表零偏0.15mg Pfilter = diag([std_roll^2 std_pitch^2 std_yaw^2 std_vel^2 std_vel^2 std_vel^2 (std_pos/3600/30/57.3)^2 (std_pos/3600/30/57.3)^2 std_pos^2 std_gyro^2 std_gyro^2 std_gyro^2 std_acc^2 std_acc^2 std_acc^2]); % Q的设置 std_Wg = 0.15*(2.909*1e-4); % 陀螺漂移噪声,度/根号小时转化成rad/根号秒 std_Wa = 0.21/60/3; % 加表漂移噪声 Qkf = diag([std_Wg^2 std_Wg^2 std_Wg^2 std_Wa^2 std_Wa^2 std_Wa^2]); G = zeros(15, 6); F = zeros(15); F_i=zeros(9,9); F_s=zeros(9,6); H = zeros(6,15); H(1:3,4:6) = eye(3); H(4:6,7:9) = eye(3); % R的设置 R = diag([std_vel^2 std_vel^2 std_vel^2 (std_pos/3600/30/57.3)^2 (std_pos/3600/30/57.3)^2 (std_pos)^2]);
时间: 2024-02-07 14:02:01 浏览: 23
这段代码是一个基于扩展卡尔曼滤波(EKF)的位置速度观测组合导航程序的初始化部分,主要是对一些导航参数常数项进行初始化,并设置卡尔曼滤波的P、Q、R参数。具体内容如下:
1. 初始化一些导航参数常数项,如地球自转角速度、地球半径、偏心率等。
2. 初始化导航坐标系下的姿态、速度和位置,其中姿态使用欧拉角(yaw、pitch、roll)表示,速度和位置初始值设为0。
3. 初始化卡尔曼滤波的P、Q、R参数。其中P是状态协方差矩阵,表示状态量的不确定度,Q是系统噪声协方差矩阵,表示状态量的随机漂移噪声,R是观测噪声协方差矩阵,表示观测量的噪声。
4. 定义状态转移矩阵F、测量矩阵H和增益矩阵G等变量。
需要注意的是,这段代码的正确性还依赖于之前加载的IMU数据和GPS测量数据,以及之前定义的一些函数,比如eul2dcm和dcm2quat等。
相关问题
clear,clc syms x fun=cos(2*x); fourier(fun)
在MATLAB中,您可以使用 `syms` 命令定义符号变量,然后使用 `fourier` 函数计算傅里叶变换。
下面是您提供的代码示例:
```
clear, clc
syms x
fun = cos(2*x);
fourier(fun)
```
输出结果为:
```
ans =
(2^(1/2)*pi*dirac(ksi - 2))/2 - (2^(1/2)*pi*dirac(ksi + 2))/2
```
其中,`dirac` 函数表示狄拉克函数,`ksi` 表示频率变量。因此,这个结果表示 `cos(2x)` 的傅里叶变换为 `(2^(1/2)*pi*dirac(ksi - 2))/2 - (2^(1/2)*pi*dirac(ksi + 2))/2`。
基于频率选择性瑞利信道实现4*4MIMO信道仿真的代码
该问题需要涉及到很多基础知识,包括瑞利信道、频率选择性瑞利信道、4*4MIMO等,因此在回答该问题之前需要确认你对这些概念是否有一定的了解。如果你还不了解这些概念,建议先学习相关的基础知识。
以下是一个简单的基于频率选择性瑞利信道实现4*4MIMO信道仿真的MATLAB代码,仅供参考:
```matlab
clc;
clear all;
close all;
Nt = 4; % 发送天线数
Nr = 4; % 接收天线数
fc = 2.4e9; % 载波频率
lambda = physconst('LightSpeed')/fc; % 波长
d = lambda/2; % 天线间距
% 构造发送信号
s = randi([0,1],Nt,1000); % 随机生成发送二进制数据
modType = 'QPSK'; % 调制方式
modObj = comm.QPSKModulator; % 调制器对象
modSig = modObj(s(:)); % 调制
x = reshape(modSig,Nt,[]); % 转换为发送符号矩阵
% 构造信道矩阵
L = 5; % 瑞利衰落参数
fd = 10; % 最大多普勒频移
Fs = 100e6; % 采样率
t = 0:1/Fs:999/Fs; % 时间序列
h = zeros(Nr,Nt,length(t)); % 信道矩阵
for ii = 1:length(t)
H = sqrt(1/2)*(randn(Nr,Nt)+1i*randn(Nr,Nt)); % 高斯随机信道矩阵
fD = fd*cos(2*pi*fc*t(ii)); % 多普勒频移
alpha = sqrt(1/(L+1)*[1 2*rand(1,L-1) 1]); % 瑞利衰落系数
phi = 2*pi*rand(1,L); % 瑞利衰落相位
h(:,:,ii) = zeros(Nr,Nt);
for jj = 1:L
h(:,:,ii) = h(:,:,ii) + alpha(jj)*H*exp(1i*(2*pi*fD*t(ii)+phi(jj)));
end
end
% 信号传输
y = zeros(Nr,size(x,2)); % 接收符号矩阵
for ii = 1:size(x,2)
y(:,ii) = h(:,:,ii)*x(:,ii);
end
% 解调
demodObj = comm.QPSKDemodulator; % 解调器对象
demodSig = reshape(demodObj(y(:)),Nt,[]); % 解调
rx = demodSig;
% BER计算
[~,ber] = biterr(s(:),rx(:));
disp(['BER = ' num2str(ber)]);
```
该代码实现了一个基于频率选择性瑞利信道的4*4MIMO信道仿真,包括发送信号构造、信道矩阵构造、信号传输、解调和BER计算等步骤。其中,信道矩阵采用高斯随机矩阵和瑞利衰落模型组合得到,并且考虑了多普勒频移的影响。最后,通过比较发送数据和接收数据的误码率,计算出了BER值。