UWBIns/lib/gnss/tropo_correction.m

86 lines
2.2 KiB
Matlab
Raw Normal View History

2025-04-16 20:15:33 +08:00
function [corr] = tropo_correction(el, h)
% SYNTAX:
% [corr] = tropo_error_correction(el, h);
%
% INPUT:
% el = satellite elevation (rad)
% h = receiver ellipsoidal height (m)
%
% OUTPUT:
% corr = tropospheric error correction
%
% DESCRIPTION:
% Computation of the pseudorange correction due to tropospheric refraction.
% Saastamoinen algorithm.
%----------------------------------------------------------------------------------------------
% goGPS v0.4.3
%
% Copyright (C) 2009-2014 Mirko Reguzzoni, Eugenio Realini
%
% Portions of code contributed by Laboratorio di Geomatica, Polo Regionale di Como,
% Politecnico di Milano, Italy
%----------------------------------------------------------------------------------------------
global tropo_model
%Saastamoinen model requires positive ellipsoidal height
h(h < 0) = 0;
% If in ATM_model section in config file tropo is set to 0 it does not use tropospheric model
% [ATM_model]
% tropo=0
if (tropo_model == 0)
corr = zeros(size(el));
else
if (h < 5000)
%conversion to radians
el = abs(el);
%Standard atmosphere - Berg, 1948 (Bernese)
%pressure [mbar]
Pr = 1013.25;
%temperature [K]
Tr = 291.15;
%numerical constants for the algorithm [-] [m] [mbar]
Hr = 50.0;
P = Pr * (1-0.0000226*h).^5.225;
T = Tr - 0.0065*h;
H = Hr * exp(-0.0006396*h);
%----------------------------------------------------------------------
%linear interpolation
h_a = [0; 500; 1000; 1500; 2000; 2500; 3000; 4000; 5000];
B_a = [1.156; 1.079; 1.006; 0.938; 0.874; 0.813; 0.757; 0.654; 0.563];
t = zeros(length(T),1);
B = zeros(length(T),1);
for i = 1 : length(T)
d = h_a - h(i);
[dmin, j] = min(abs(d));
if (d(j) > 0)
index = [j-1; j];
else
index = [j; j+1];
end
t(i) = (h(i) - h_a(index(1))) ./ (h_a(index(2)) - h_a(index(1)));
B(i) = (1-t(i))*B_a(index(1)) + t(i)*B_a(index(2));
end
%----------------------------------------------------------------------
e = 0.01 * H .* exp(-37.2465 + 0.213166*T - 0.000256908*T.^2);
%tropospheric error
corr = ((0.002277 ./ sin(el)) .* (P - (B ./ (tan(el)).^2)) + (0.002277 ./ sin(el)) .* (1255./T + 0.05) .* e);
else
corr = zeros(size(el));
end
end