1. GNSS多路径效应分析概述
全球导航卫星系统(GNSS)定位精度受多种误差源影响,其中多路径效应是城市环境中的主要误差来源之一。这种现象发生在卫星信号不仅通过直线路径到达接收机天线,还经过建筑物、地面等物体反射后到达天线,导致接收机观测到多个延迟的信号副本。
多路径效应会造成两种典型影响:
- 伪距测量误差:反射信号导致码相位测量出现偏差
- 载波相位误差:多径信号干扰导致载波相位观测值失真
在开阔环境中,多路径误差通常在1-3米范围内;而在城市峡谷等高反射环境中,误差可能高达10-15米,严重影响定位精度。因此,多路径效应分析对于高精度GNSS应用(如自动驾驶、精密农业等)至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多路径效应形成机理与数学模型
2.1 多路径信号传播模型
当卫星信号遇到反射面时,部分能量被反射形成多路径信号。设直达信号为:
code复制s_d(t) = A_d·D(t-τ_d)·cos(2πf_c(t-τ_d)+φ_d)
反射信号可表示为:
code复制s_r(t) = A_r·D(t-τ_r)·cos(2πf_c(t-τ_r)+φ_r)
其中:
- A_d, A_r:直达和反射信号幅度
- τ_d, τ_r:传播时延
- φ_d, φ_r:初始相位
- D(t):导航数据码
- f_c:载波频率
接收信号是直达与所有反射信号的叠加:
code复制s(t) = s_d(t) + Σs_ri(t)
2.2 多路径对伪距测量的影响
伪距测量基于码相关技术,多路径信号会扭曲相关函数峰值。典型影响包括:
- 码跟踪误差:相关峰偏移导致时延估计偏差
- 幅度衰减:信号干涉导致有效信号强度变化
对于BPSK调制的C/A码,多路径引起的伪距误差可近似为:
code复制Δρ ≈ (αλ_c/2π)·sin(θ)/(1+αcos(θ))
其中:
- α:反射信号与直达信号幅度比
- θ = 4πΔd/λ_c:相位差
- Δd:路径差
- λ_c:码波长(C/A码约300m)
2.3 多路径对载波相位的影响
载波相位多路径误差具有周期性特征,其最大误差为:
code复制ΔΦ_max = arctan(α/(1-α)) ≈ α (当α<<1时)
与伪距不同,载波相位多路径误差不随路径差增加而单调变化,而是呈现周期性波动。
3. 多路径效应分析方法与Matlab实现
3.1 多路径检测技术
3.1.1 信噪比(SNR)分析法
多路径会导致SNR周期性波动。Matlab实现示例:
matlab复制function [mp_indicator] = snr_based_mp_detection(snr_data, elevation, window_size)
% 输入:snr_data - SNR观测序列
% elevation - 卫星高度角序列(度)
% window_size - 移动平均窗口大小
% 输出:mp_indicator - 多路径指示器
% 高度角归一化
elev_norm = sind(elevation);
% SNR与高度角回归分析
X = [ones(size(elev_norm)) elev_norm];
coeff = X \ snr_data;
snr_model = X * coeff;
% 残差计算与平滑
residual = snr_data - snr_model;
residual_smooth = movmean(residual, window_size);
% 多路径指标计算
mp_indicator = residual - residual_smooth;
end
3.1.2 伪距-载波相位组合法
利用伪距和载波相位观测组合检测多路径:
matlab复制function [mp_estimate] = phase_code_mp_estimation(prange, phase, wavelength)
% 输入:prange - 伪距观测(m)
% phase - 载波相位观测(周)
% wavelength - 载波波长(m)
% 输出:mp_estimate - 多路径估计值
phase_meters = phase * wavelength;
mp_estimate = prange - phase_meters;
% 应用高通滤波去除低频趋势
[b,a] = butter(4, 0.05, 'high');
mp_estimate = filtfilt(b, a, mp_estimate);
end
3.2 多路径误差建模与仿真
3.2.1 静态多路径仿真模型
matlab复制function [corr_output] = multipath_correlator(delay, alpha, n_points)
% 输入:delay - 多路径延迟(chips)
% alpha - 反射信号幅度比
% n_points - 相关点数
% 输出:corr_output - 畸变后的相关函数
% 理想相关函数(三角形)
x = linspace(-1, 1, n_points);
ideal_corr = max(1 - abs(x), 0);
% 多路径相关函数
mp_corr = alpha * max(1 - abs(x - delay), 0);
% 合成输出
corr_output = ideal_corr + mp_corr;
% 可视化
figure;
plot(x, ideal_corr, 'b', 'LineWidth', 1.5);
hold on;
plot(x, corr_output, 'r--', 'LineWidth', 2);
legend('理想相关函数', '多路径影响后');
xlabel('码片延迟'); ylabel('相关值');
title(sprintf('多路径延迟=%.2f chips, α=%.2f', delay, alpha));
grid on;
end
3.2.2 动态多路径场景模拟
matlab复制function simulate_dynamic_multipath()
% 动态多路径仿真参数
t = 0:0.1:100; % 时间序列(s)
freq = 0.05; % 多路径变化频率(Hz)
% 生成动态多路径参数
delay_var = 0.2 + 0.1*sin(2*pi*freq*t); % 时延变化(0.1-0.3 chips)
alpha_var = 0.3 + 0.2*cos(2*pi*freq*t + pi/4); % 幅度比变化(0.1-0.5)
% 初始化存储数组
range_error = zeros(size(t));
% 计算每个时刻的伪距误差
for i = 1:length(t)
range_error(i) = calculate_mp_error(delay_var(i), alpha_var(i));
end
% 可视化结果
figure;
subplot(2,1,1);
plot(t, delay_var, 'b', t, alpha_var, 'r');
legend('时延变化(chips)', '幅度比变化');
xlabel('时间(s)'); ylabel('参数值');
title('动态多路径参数变化');
grid on;
subplot(2,1,2);
plot(t, range_error);
xlabel('时间(s)'); ylabel('伪距误差(m)');
title('动态多路径引起的伪距误差');
grid on;
end
function error = calculate_mp_error(delay, alpha)
% 简化的伪距误差模型
error = (alpha * delay) / (1 + alpha);
end
4. 多路径效应抑制技术实现
4.1 天线端抑制技术
4.1.1 扼流圈天线设计原理
扼流圈天线通过以下机制抑制多路径:
- 底部金属板形成电气短路,抑制地面反射
- 同心槽结构产生高阻抗表面,衰减低仰角信号
- 特殊辐射模式抑制来自侧面的反射
Matlab辐射模式仿真代码:
matlab复制function plot_choke_ring_pattern()
theta = -pi/2:0.01:pi/2; % 仰角范围
phi = 0; % 方位角固定
% 扼流圈天线增益模型
gain = cos(theta).^4; % 近似模型
gain(theta<0) = 0.01; % 地面方向极低增益
% 极坐标显示
figure;
polarplot(theta, gain, 'LineWidth', 2);
title('扼流圈天线辐射模式');
rlim([0 1]);
end
4.1.2 自适应调零天线实现
matlab复制function adaptive_null_steering()
% 参数设置
fs = 10e6; % 采样率
fc = 1.57542e9; % L1频率
t = 0:1/fs:1e-3; % 时间序列
f_if = 4.309e6; % 中频
% 生成信号
direct_signal = cos(2*pi*f_if*t);
mp_signal = 0.5*cos(2*pi*f_if*t + pi/3); % 多路径信号
% 阵列响应
array_pos = [0 0.5 1] * 0.19; % 天线阵元位置(波长单位)
doa_direct = 30; % 直达波到达角(度)
doa_mp = -20; % 多路径到达角(度)
% 计算阵列流形
A_direct = exp(-1j*2*pi*array_pos*sind(doa_direct));
A_mp = exp(-1j*2*pi*array_pos*sind(doa_mp));
% 接收信号模型
X = A_direct.' * direct_signal + A_mp.' * mp_signal;
% LMS自适应算法
mu = 0.01; % 步长
w = ones(3,1); % 初始权重
y = zeros(size(t));
e = zeros(size(t));
for n = 1:length(t)
y(n) = w' * X(:,n);
e(n) = direct_signal(n) - y(n);
w = w + mu * X(:,n) * conj(e(n));
end
% 结果可视化
figure;
subplot(2,1,1);
plot(t, abs(e).^2);
title('LMS算法收敛过程');
xlabel('时间'); ylabel('MSE');
subplot(2,1,2);
pattern = zeros(1,181);
angles = -90:90;
for i = 1:length(angles)
A = exp(-1j*2*pi*array_pos*sind(angles(i)));
pattern(i) = abs(w' * A.');
end
plot(angles, 20*log10(pattern/max(pattern)));
title('阵列方向图');
xlabel('角度(度)'); ylabel('增益(dB)');
grid on;
end
4.2 接收机端处理技术
4.2.1 窄相关间隔技术
传统相关器(1chip间隔)与窄相关(0.1chip间隔)对比:
matlab复制function compare_correlator_spacing()
% 多路径参数
delay = 0.15; % chips
alpha = 0.4;
% 相关器设置
chip_range = -1.5:0.01:1.5;
early_late = 1.0; % 传统间隔
narrow_spacing = 0.1; % 窄间隔
% 计算相关函数
ideal_corr = max(1 - abs(chip_range), 0);
mp_corr = alpha * max(1 - abs(chip_range - delay), 0);
total_corr = ideal_corr + mp_corr;
% 传统相关器
early_idx = find(chip_range >= -early_late/2, 1);
late_idx = find(chip_range >= early_late/2, 1);
slope_trad = (total_corr(late_idx) - total_corr(early_idx)) / ...
(chip_range(late_idx) - chip_range(early_idx));
% 窄相关器
early_narrow = find(chip_range >= -narrow_spacing/2, 1);
late_narrow = find(chip_range >= narrow_spacing/2, 1);
slope_narrow = (total_corr(late_narrow) - total_corr(early_narrow)) / ...
(chip_range(late_narrow) - chip_range(early_narrow));
% 结果显示
figure;
plot(chip_range, total_corr, 'LineWidth', 2);
hold on;
plot([chip_range(early_idx) chip_range(late_idx)], ...
[total_corr(early_idx) total_corr(late_idx)], 'ro-', 'LineWidth', 2);
plot([chip_range(early_narrow) chip_range(late_narrow)], ...
[total_corr(early_narrow) total_corr(late_narrow)], 'go-', 'LineWidth', 2);
legend('相关函数', '传统相关点', '窄相关点');
title('不同相关间隔比较');
xlabel('码片延迟'); ylabel('相关值');
grid on;
fprintf('传统相关器斜率: %.4f\n', slope_trad);
fprintf('窄相关器斜率: %.4f\n', slope_narrow);
end
4.2.2 多路径估计跟踪技术
MEDLL(多路径估计延迟锁定环)简化实现:
matlab复制function medll_demo()
% 参数设置
N = 1000; % 迭代次数
tau = 0.2; % 真实多路径延迟
alpha = 0.3; % 真实多路径幅度
dt = 0.01; % 时间步长
noise_level = 0.05; % 噪声水平
% 初始化估计
tau_hat = 0.1; % 初始延迟估计
alpha_hat = 0.1; % 初始幅度估计
tau_history = zeros(1,N);
alpha_history = zeros(1,N);
% 迭代优化
for k = 1:N
% 生成观测数据
t = -1:0.01:1;
ideal = max(1-abs(t),0);
mp = alpha * max(1-abs(t-tau),0);
observed = ideal + mp + noise_level*randn(size(t));
% 当前估计的相关函数
estimated = max(1-abs(t),0) + alpha_hat * max(1-abs(t-tau_hat),0);
% 计算梯度
grad_tau = sum(2*(estimated - observed) .* ...
alpha_hat * sign(t-tau_hat) .* (abs(t-tau_hat)<=1));
grad_alpha = sum(2*(estimated - observed) .* ...
(abs(t-tau_hat)<=1));
% 参数更新
tau_hat = tau_hat - 0.001*grad_tau;
alpha_hat = alpha_hat - 0.001*grad_alpha;
% 记录历史
tau_history(k) = tau_hat;
alpha_history(k) = alpha_hat;
end
% 显示结果
figure;
subplot(2,1,1);
plot(1:N, tau_history, 'b', 1:N, tau*ones(1,N), 'r--');
legend('估计值', '真实值');
title('多路径延迟估计');
ylabel('延迟(chips)');
subplot(2,1,2);
plot(1:N, alpha_history, 'b', 1:N, alpha*ones(1,N), 'r--');
legend('估计值', '真实值');
title('多路径幅度估计');
xlabel('迭代次数'); ylabel('幅度比');
end
5. 实际数据分析案例
5.1 静态观测数据分析
5.1.1 数据预处理与质量检查
matlab复制function preprocess_gnss_data(filename)
% 读取RINEX观测文件
[obs, header] = rinexread(filename);
% 提取GPS L1 C/A码观测值
prn_list = unique(obs.GPS.PRN);
num_sats = length(prn_list);
% 初始化质量指标
snr_threshold = 35; % dB-Hz
elev_threshold = 15; % 度
% 各卫星数据质量分析
figure;
for i = 1:num_sats
prn = prn_list(i);
idx = obs.GPS.PRN == prn;
% 提取观测数据
elev = obs.GPS.Elevation(idx);
snr = obs.GPS.L1.SNR(idx);
prange = obs.GPS.L1.Pseudorange(idx);
phase = obs.GPS.L1.Phase(idx);
% 数据质量检查
valid_idx = (snr > snr_threshold) & (elev > elev_threshold);
% 绘制SNR与高度角关系
subplot(2,1,1);
plot(elev(valid_idx), snr(valid_idx), 'o');
hold on;
% 计算多路径组合
wavelength = 0.1903; % L1波长(m)
mp = prange(valid_idx) - phase(valid_idx)*wavelength;
% 绘制多路径序列
subplot(2,1,2);
plot(mp, 'LineWidth', 1.5);
hold on;
end
subplot(2,1,1);
xlabel('高度角(度)'); ylabel('SNR(dB-Hz)');
title('各卫星SNR与高度角关系');
grid on;
subplot(2,1,2);
xlabel('历元数'); ylabel('多路径组合(m)');
title('各卫星多路径序列');
legend(cellstr(num2str(prn_list)));
grid on;
end
5.1.2 多路径特征提取与分析
matlab复制function analyze_multipath_pattern()
% 加载预处理后的数据
load('processed_data.mat');
% 选择一颗典型卫星分析
prn = 12;
idx = (data.PRN == prn) & (data.Elev > 15);
elev = data.Elev(idx);
mp = data.MP(idx);
% 高度角归一化
elev_rad = deg2rad(elev);
elev_norm = sin(elev_rad);
% 多路径与高度角关系建模
X = [ones(size(elev_norm)) elev_norm 1./elev_norm];
coeff = X \ mp;
mp_model = X * coeff;
residual = mp - mp_model;
% 频谱分析
Fs = 1/30; % 采样频率(Hz)
N = length(residual);
freq = (0:N/2)*Fs/N;
Y = fft(residual);
P2 = abs(Y/N);
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);
% 结果可视化
figure;
subplot(3,1,1);
plot(elev, mp, '.', elev, mp_model, 'r', 'LineWidth', 2);
xlabel('高度角(度)'); ylabel('多路径(m)');
legend('观测值', '模型拟合');
title('多路径与高度角关系');
grid on;
subplot(3,1,2);
plot(residual);
xlabel('历元数'); ylabel('残差(m)');
title('去趋势后的多路径序列');
grid on;
subplot(3,1,3);
plot(freq, P1);
xlabel('频率(Hz)'); ylabel('幅度');
title('多路径残差频谱分析');
grid on;
% 输出周期性分析结果
[~, locs] = findpeaks(P1, 'SortStr', 'descend', 'NPeaks', 1);
if ~isempty(locs)
fprintf('主导多路径周期频率: %.4f Hz\n', freq(locs));
end
end
5.2 动态车载数据分析
5.2.1 轨迹与多路径关联分析
matlab复制function plot_trajectory_with_mp()
% 加载车载数据集
load('vehicle_data.mat');
% 创建地理气泡图
figure;
geobubble(pos.Latitude, pos.Longitude, mp_combined, ...
'BubbleWidthRange', [5 20], ...
'MapLayout', 'auto');
title('车辆轨迹与多路径强度分布');
% 多路径与城市特征关联分析
figure;
subplot(2,1,1);
plot(dist, mp_combined, 'LineWidth', 1.5);
hold on;
plot(dist(building_idx), mp_combined(building_idx), 'ro');
xlabel('行驶距离(m)'); ylabel('多路径组合(m)');
legend('多路径值', '建筑物附近');
title('多路径与城市环境关系');
grid on;
subplot(2,1,2);
histogram(mp_combined(building_idx), 'BinWidth', 0.5, 'Normalization', 'pdf');
hold on;
histogram(mp_combined(~building_idx), 'BinWidth', 0.5, 'Normalization', 'pdf');
xlabel('多路径值(m)'); ylabel('概率密度');
legend('建筑物附近', '开阔区域');
grid on;
end
5.2.2 多路径对定位精度的影响评估
matlab复制function assess_positioning_error()
% 加载数据
load('kinematic_results.mat');
% 计算各历元定位误差
true_pos = [ref_lat, ref_lon, ref_alt];
est_pos = [sol_lat, sol_lon, sol_alt];
[dist_error, ~] = lldistkm(true_pos, est_pos);
dist_error = dist_error * 1000; % 转换为米
% 多路径与定位误差相关性分析
valid_idx = ~isnan(dist_error) & ~isnan(mp_index);
R = corrcoef(mp_index(valid_idx), dist_error(valid_idx));
% 误差统计分析
mean_error = mean(dist_error(valid_idx));
std_error = std(dist_error(valid_idx));
rms_error = sqrt(mean(dist_error(valid_idx).^2));
% 可视化结果
figure;
subplot(2,1,1);
plot(dist_error, 'LineWidth', 1.5);
hold on;
plot(movmean(dist_error, 30), 'r', 'LineWidth', 2);
xlabel('历元数'); ylabel('定位误差(m)');
legend('瞬时误差', '30点移动平均');
title(sprintf('定位误差(均值=%.2fm, 标准差=%.2fm)', mean_error, std_error));
grid on;
subplot(2,1,2);
scatter(mp_index(valid_idx), dist_error(valid_idx), 20, 'filled');
lsline;
xlabel('多路径指数'); ylabel('定位误差(m)');
title(sprintf('多路径与误差相关性(R=%.2f)', R(1,2)));
grid on;
% 输出关键指标
fprintf('RMS定位误差: %.2f 米\n', rms_error);
fprintf('多路径-误差相关系数: %.3f\n', R(1,2));
end
6. 高级多路径分析技术
6.1 基于机器学习的多路径分类
6.1.1 特征工程与数据集构建
matlab复制function prepare_ml_dataset()
% 加载原始数据
load('static_dataset.mat');
% 初始化特征矩阵和标签
num_samples = length(data);
features = zeros(num_samples, 8);
labels = zeros(num_samples, 1);
% 特征提取
for i = 1:num_samples
% 时域特征
features(i,1) = mean(data(i).MP);
features(i,2) = std(data(i).MP);
features(i,3) = max(data(i).MP) - min(data(i).MP);
% 频域特征
L = length(data(i).MP);
Y = fft(data(i).MP);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
[~, idx] = max(P1(2:end)); % 忽略DC分量
features(i,4) = idx / (L/2) * 0.5; % 归一化频率
% 高度角相关特征
features(i,5) = mean(data(i).Elev);
features(i,6) = std(data(i).Elev);
% 信噪比特征
features(i,7) = mean(data(i).SNR);
features(i,8) = std(data(i).SNR);
% 标签(0=无多路径, 1=有显著多路径)
labels(i) = features(i,2) > 0.5; % 简单阈值分类
end
% 保存数据集
save('ml_dataset.mat', 'features', 'labels');
% 特征可视化
figure;
gscatter(features(:,2), features(:,4), labels, 'rb', 'xo');
xlabel('MP标准差'); ylabel('主导频率');
legend('无多路径', '有多路径');
title('多路径分类特征空间');
grid on;
end
6.1.2 随机森林分类器实现
matlab复制function train_rf_classifier()
% 加载数据集
load('ml_dataset.mat');
% 数据分割(70%训练,30%测试)
rng(1); % 重现性
cv = cvpartition(size(features,1), 'HoldOut', 0.3);
X_train = features(cv.training,:);
y_train = labels(cv.training);
X_test = features(cv.test,:);
y_test = labels(cv.test);
% 训练随机森林
numTrees = 100;
rf_model = TreeBagger(numTrees, X_train, y_train, ...
'Method', 'classification', ...
'OOBPrediction', 'on', ...
'MinLeafSize', 5);
% 测试集评估
[y_pred, scores] = predict(rf_model, X_test);
y_pred = str2double(y_pred);
% 计算性能指标
accuracy = sum(y_pred == y_test) / length(y_test);
precision = sum(y_pred & y_test) / sum(y_pred);
recall = sum(y_pred & y_test) / sum(y_test);
f1 = 2 * (precision * recall) / (precision + recall);
% 混淆矩阵
figure;
confusionchart(y_test, y_pred);
title(sprintf('随机森林分类器(准确率=%.2f%%)', accuracy*100));
% 特征重要性
imp = rf_model.OOBPermutedPredictorDeltaError;
figure;
bar(imp);
title('特征重要性');
xticklabels({'MP均值', 'MP标准差', 'MP范围', '主导频率', ...
'高度角均值', '高度角标准差', 'SNR均值', 'SNR标准差'});
ylabel('OOB误差变化');
xtickangle(45);
% 输出性能指标
fprintf('测试集性能:\n');
fprintf('准确率: %.2f%%\n', accuracy*100);
fprintf('精确率: %.2f%%\n', precision*100);
fprintf('召回率: %.2f%%\n', recall*100);
fprintf('F1分数: %.2f%%\n', f1*100);
end
6.2 多路径环境地图构建
6.2.1 基于网格的多路径统计建模
matlab复制function build_mp_map()
% 加载车载数据集
load('urban_dataset.mat');
% 创建网格(0.0001度≈11m)
lat_edges = min(pos.Latitude):0.0001:max(pos.Latitude);
lon_edges = min(pos.Longitude):0.0001:max(pos.Longitude);
% 初始化统计矩阵
mp_mean = zeros(length(lat_edges)-1, length(lon_edges)-1);
mp_std = zeros(size(mp_mean));
count = zeros(size(mp_mean));
% 网格统计
for i = 1:length(pos.Latitude)
% 确定网格索引
lat_idx = find(pos.Latitude(i) >= lat_edges, 1, 'last');
lon_idx = find(pos.Longitude(i) >= lon_edges, 1, 'last');
if ~isempty(lat_idx) && ~isempty(lon_idx) && ...
lat_idx <= size(mp_mean,1) && lon_idx <= size(mp_mean,2)
% 更新统计量
mp_mean(lat_idx,lon_idx) = mp_mean(lat_idx,lon_idx) + mp_index(i);
mp_std(lat_idx,lon_idx) = mp_std(lat_idx,lon_idx) + mp_index(i)^2;
count(lat_idx,lon_idx) = count(lat_idx,lon_idx) + 1;
end
end
% 计算最终统计量
valid_cells = count > 0;
mp_mean(valid_cells) = mp_mean(valid_cells) ./ count(valid_cells);
mp_std(valid_cells) = sqrt(mp_std(valid_cells)./count(valid_cells) - mp_mean(valid_cells).^2);
% 可视化热图
figure;
imagesc(lon_edges(1:end-1), lat_edges(1:end-1), mp_mean);
colorbar;
xlabel('经度'); ylabel('纬度');
title('多路径均值热图');
axis xy;
% 保存地图数据
mp_map.lat_edges = lat_edges;
mp_map.lon_edges = lon_edges;
mp_map.mean = mp_mean;
mp_map.std = mp_std;
mp_map.count = count;
save('mp_map.mat', 'mp_map');
end
6.2.2 地图辅助的多路径预测
matlab复制function predict_using_mp_map()
% 加载地图和新轨迹
load('mp_map.mat');
load('new_trajectory.mat');
% 初始化预测数组
pred_mp = zeros(size(new_pos.Latitude));
% 对每个位置查询地图
for i = 1:length(new_pos.Latitude)
% 查找最近网格点
lat_diff = abs(mp_map.lat_edges - new_pos.Latitude(i));
lon_diff = abs(mp_map.lon_edges - new_pos.Longitude(i));
[~, lat_idx] = min(lat_diff);
[~, lon_idx] = min(lon_diff);
% 确保索引在范围内
lat_idx = min(max(lat_idx, 1), size(mp_map.mean,1));
lon_idx = min(max(lon_idx, 1), size(mp_map.mean,2));
% 获取预测值
if mp_map.count(lat_idx,lon_idx) > 0
pred_mp(i) = mp_map.mean(lat_idx,lon_idx);
else
% 无数据时使用邻近值插值
[row,col] = find(mp_map.count > 0);
dist = sqrt((row-lat_idx).^2 + (col-lon_idx).^2);
[~, idx] = min(dist);
pred_mp(i) = mp_map.mean(row(idx),col(idx));
end
end
% 与实际观测对比
figure;
plot(new_pos.Distance, pred_mp, 'b-', 'LineWidth', 2);
hold on;
plot(new_pos.Distance, new_pos.MP_index, 'r--', 'LineWidth', 1.5);
xlabel('距离(m)'); ylabel('多路径指数');
legend('地图预测', '实际观测');
title('基于地图的多路径预测');
grid on;
% 计算预测精度
valid_idx = ~isnan(new_pos.MP_index);
rmse = sqrt(mean((pred_mp(valid_idx) - new_pos.MP_index(valid_idx)).^2));
fprintf('预测RMSE: %.3f\n', rmse);
end
