mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-10-30 14:46:23 +00:00
101 lines
2.8 KiB
Matlab
101 lines
2.8 KiB
Matlab
function ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum)
|
|
% TROPO Calculation of tropospheric correction.
|
|
% The range correction ddr in m is to be subtracted from
|
|
% pseudo-ranges and carrier phases
|
|
%
|
|
% ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum);
|
|
%
|
|
% Inputs:
|
|
% sinel - sin of elevation angle of satellite
|
|
% hsta - height of station in km
|
|
% p - atmospheric pressure in mb at height hp
|
|
% tkel - surface temperature in degrees Kelvin at height htkel
|
|
% hum - humidity in % at height hhum
|
|
% hp - height of pressure measurement in km
|
|
% htkel - height of temperature measurement in km
|
|
% hhum - height of humidity measurement in km
|
|
%
|
|
% Outputs:
|
|
% ddr - range correction (meters)
|
|
%
|
|
% Reference
|
|
% Goad, C.C. & Goodman, L. (1974) A Modified Tropospheric
|
|
% Refraction Correction Model. Paper presented at the
|
|
% American Geophysical Union Annual Fall Meeting, San
|
|
% Francisco, December 12-17
|
|
|
|
% A Matlab reimplementation of a C code from driver.
|
|
%
|
|
% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
|
% This file is part of GNSS-SDR.
|
|
%
|
|
% SPDX-FileCopyrightText: Kai Borre 06-28-95
|
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
|
%==========================================================================
|
|
|
|
a_e = 6378.137; % semi-major axis of earth ellipsoid
|
|
b0 = 7.839257e-5;
|
|
tlapse = -6.5;
|
|
tkhum = tkel + tlapse*(hhum-htkel);
|
|
atkel = 7.5*(tkhum-273.15) / (237.3+tkhum-273.15);
|
|
e0 = 0.0611 * hum * 10^atkel;
|
|
tksea = tkel - tlapse*htkel;
|
|
em = -978.77 / (2.8704e6*tlapse*1.0e-5);
|
|
tkelh = tksea + tlapse*hhum;
|
|
e0sea = e0 * (tksea/tkelh)^(4*em);
|
|
tkelp = tksea + tlapse*hp;
|
|
psea = p * (tksea/tkelp)^em;
|
|
|
|
if sinel < 0
|
|
sinel = 0;
|
|
end
|
|
|
|
tropo = 0;
|
|
done = 'FALSE';
|
|
refsea = 77.624e-6 / tksea;
|
|
htop = 1.1385e-5 / refsea;
|
|
refsea = refsea * psea;
|
|
ref = refsea * ((htop-hsta)/htop)^4;
|
|
|
|
while 1
|
|
rtop = (a_e+htop)^2 - (a_e+hsta)^2*(1-sinel^2);
|
|
|
|
% check to see if geometry is crazy
|
|
if rtop < 0
|
|
rtop = 0;
|
|
end
|
|
|
|
rtop = sqrt(rtop) - (a_e+hsta)*sinel;
|
|
a = -sinel/(htop-hsta);
|
|
b = -b0*(1-sinel^2) / (htop-hsta);
|
|
rn = zeros(8,1);
|
|
|
|
for i = 1:8
|
|
rn(i) = rtop^(i+1);
|
|
end
|
|
|
|
alpha = [2*a, 2*a^2+4*b/3, a*(a^2+3*b),...
|
|
a^4/5+2.4*a^2*b+1.2*b^2, 2*a*b*(a^2+3*b)/3,...
|
|
b^2*(6*a^2+4*b)*1.428571e-1, 0, 0];
|
|
|
|
if b^2 > 1.0e-35
|
|
alpha(7) = a*b^3/2;
|
|
alpha(8) = b^4/9;
|
|
end
|
|
|
|
dr = rtop;
|
|
dr = dr + alpha*rn;
|
|
tropo = tropo + dr*ref*1000;
|
|
|
|
if done == 'TRUE '
|
|
ddr = tropo;
|
|
break;
|
|
end
|
|
|
|
done = 'TRUE ';
|
|
refsea = (371900.0e-6/tksea-12.92e-6)/tksea;
|
|
htop = 1.1385e-5 * (1255/tksea+0.05)/refsea;
|
|
ref = refsea * e0sea * ((htop-hsta)/htop)^4;
|
|
end;
|
|
%%%%%%%%% end tropo.m %%%%%%%%%%%%%%%%%%%
|