|
|
|
|
function [gnssMeas]= ProcessAdr(gnssMeas)
|
|
|
|
|
% [gnssMeas]= ProcessAdr(gnssMeas)
|
|
|
|
|
% process the Accumulated Delta Ranges obtained from ProcessGnssMeas
|
|
|
|
|
%
|
|
|
|
|
%gnssMeas.FctSeconds = Nx1 vector. Rx time tag of measurements.
|
|
|
|
|
% .ClkDCount = Nx1 vector. Hw clock discontinuity count
|
|
|
|
|
% .Svid = 1xM vector of all svIds found in gnssRaw.
|
|
|
|
|
% ...
|
|
|
|
|
% .PrM = NxM pseudoranges, row i corresponds to FctSeconds(i)
|
|
|
|
|
% .DelPrM = NxM change in pr while clock continuous
|
|
|
|
|
% .AdrM = NxM accumulated delta range (= -k*carrier phase)
|
|
|
|
|
% ...
|
|
|
|
|
%
|
|
|
|
|
% output:
|
|
|
|
|
% gnssMeas.DelPrMinusAdrM = NxM DelPrM - AdrM, re-initialized to zero at each
|
|
|
|
|
% discontinuity or reset of DelPrM or AdrM
|
|
|
|
|
|
|
|
|
|
%Author: Frank van Diggelen
|
|
|
|
|
%Open Source code for processing Android GNSS Measurements
|
|
|
|
|
|
|
|
|
|
if ~any(any(isfinite(gnssMeas.AdrM) & gnssMeas.AdrM~=0))
|
|
|
|
|
%Nothing in AdrM but NaNs and zeros
|
|
|
|
|
fprintf(' No ADR recorded\n'), return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
M = length(gnssMeas.Svid);
|
|
|
|
|
N = length(gnssMeas.FctSeconds);
|
|
|
|
|
DelPrMinusAdrM = zeros(N,M)+NaN;
|
|
|
|
|
for j=1:M %loop over Svid
|
|
|
|
|
AdrM = gnssMeas.AdrM(:,j); %make local variables for readability
|
|
|
|
|
DelPrM = gnssMeas.DelPrM(:,j);
|
|
|
|
|
AdrState = gnssMeas.AdrState(:,j);
|
|
|
|
|
%From gps.h:
|
|
|
|
|
%/* However, it is expected that the data is only accurate when:
|
|
|
|
|
% * 'accumulated delta range state' == GPS_ADR_STATE_VALID.
|
|
|
|
|
%*/
|
|
|
|
|
% #define GPS_ADR_STATE_UNKNOWN 0
|
|
|
|
|
% #define GPS_ADR_STATE_VALID (1<<0)
|
|
|
|
|
% #define GPS_ADR_STATE_RESET (1<<1)
|
|
|
|
|
% #define GPS_ADR_STATE_CYCLE_SLIP (1<<2)
|
|
|
|
|
|
|
|
|
|
%keep valid values of AdrM only
|
|
|
|
|
iValid = bitand(AdrState,2^0);
|
|
|
|
|
iReset = bitand(AdrState,2^1);
|
|
|
|
|
AdrM(~iValid) = NaN;
|
|
|
|
|
|
|
|
|
|
%% work out DelPrM - AdrM since last discontinuity, plot DelPrM-AdrM
|
|
|
|
|
|
|
|
|
|
DelPrM0 = NaN; %to store initial offset from AdrM
|
|
|
|
|
for i=1:N %loop over time
|
|
|
|
|
if isfinite(AdrM(i)) && (AdrM(i)~=0) && isfinite(DelPrM(i)) && ...
|
|
|
|
|
~iReset(i)
|
|
|
|
|
%reinitialize after NaNs or AdrM zero or AdrState reset
|
|
|
|
|
if isnan(DelPrM0)
|
|
|
|
|
DelPrM0 = DelPrM(i) - AdrM(i);
|
|
|
|
|
end
|
|
|
|
|
else %reset at NaNs or AdrM zero
|
|
|
|
|
DelPrM0 = NaN;
|
|
|
|
|
end
|
|
|
|
|
DelPrMinusAdrM(i,j) = DelPrM(i) - DelPrM0 - AdrM(i);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
gnssMeas.DelPrMinusAdrM = DelPrMinusAdrM;
|
|
|
|
|
|
|
|
|
|
end %end of function ProcessAdr
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
|
|
|
|
% 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.
|