86 lines
2.2 KiB
Matlab
86 lines
2.2 KiB
Matlab
|
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
|