function [dtsvS] = GpsEph2Dtsv(gpsEph,tS) %[dtsvS] = GpsEph2Dtsv(gpsEph,tS) % % Calculate satellite clock bias % Inputs: % gpsEph = vector of GPS ephemeris structures defined in ReadRinexNav % tS GPS time of week (secs) at time of transmission, calculate this as: % tS = trx - PR/c, % where trx = time of reception (receiver clock) % PR = pseudorange % % tS may be a vector, gpsEph is a structure or vector of structures % If gpsEph is a vector then t must have the same number of rows as gpsEph % tS(i) is interpreted as being associated with gpsEph(i,:) % If gpsEph is a single structure then tS may be any length % % Outputs: % dtsvS = sat clock bias (seconds). GPS time = satellite time - dtsvS % length(dtsvS) = length(tS) % % See IS-GPS-200 and RTCM Paper 99-92 SC104-88 for details of data %Author: Frank van Diggelen %Open Source code for processing Android GNSS Measurements %% Check size of inputs if min(size(tS))>1 error('tS must be a vector or a scalar, not a matrix') end tS=tS(:)';%make t a row vector, to match [gpsEph.*] vectors below pt=length(tS); [p]=length(gpsEph); if (p>1 && pt~=p), error('If gpsEph is a vector tS must be a vector with #rows = length(gpsEph),\n') end %% %%Extract the necessary variables from gpsEph TGD = [gpsEph.TGD]; Toc = [gpsEph.Toc]; af2 = [gpsEph.af2]; af1 = [gpsEph.af1]; af0 = [gpsEph.af0]; Delta_n = [gpsEph.Delta_n]; M0 = [gpsEph.M0]; e = [gpsEph.e]; Asqrt = [gpsEph.Asqrt]; Toe = [gpsEph.Toe]; %% %%Calculate dependent variables ------------------------------------------------ tk = tS - Toe; %time since time of applicability I = find(tk > 302400.0); if any(I), tk(I) = tk(I)-GpsConstants.WEEKSEC; end, I = find(tk < -302400.0); if (I), tk(I) = tk(I)+GpsConstants.WEEKSEC; end, A = Asqrt.^2; %semi-major axis of orbit n0=sqrt(GpsConstants.mu./(A.^3)); %Computed mean motion (rad/sec) n=n0+Delta_n; %Corrected Mean Motion Mk=M0+n.*tk; %Mean Anomaly Ek=Kepler(Mk,e); %Solve Kepler's equation for eccentric anomaly %% %%Calculate satellite clock bias (See ICD-GPS-200 20.3.3.3.3.1) ---------------- dt = tS - Toc; I = find(dt > 302400.0); if any(I), dt(I) = dt(I)-GpsConstants.WEEKSEC; end, I = find(dt < -302400.0); if (I), dt(I) = dt(I)+GpsConstants.WEEKSEC; end, dtsvS = af0 + af1.*dt + af2.*(dt.^2) + ... GpsConstants.FREL.*e.*Asqrt.*sin(Ek) -TGD; end % end of function GpsEph2Dtsv %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Copyright 2016 Google Inc. % % Licensed under the Apache License, Version 2.0 (the "License"); % you may not use this file except in compliance with the License. % You may obtain a copy of the License at % %     http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % See the License for the specific language governing permissions and % limitations under the License.