|
|
function PlotAdrResids(adrResid,gnssMeas,prFileName,colors) |
|
|
% PlotAdrResids(adrResid,gnssMeas,[prFileName],[colors]) |
|
|
% plot the Accumulated Delta Range residuals for the 5 sats with most valid adr |
|
|
% |
|
|
% adrResid.FctSeconds = Nx1 time vector, same as gnssMeas.FctSeconds |
|
|
% .Svid0 = reference satellite for single differences |
|
|
% .Svid = 1xM vector of all svid |
|
|
% .ResidM = [NxM] adr residuals (adr = -k*carrier) |
|
|
% |
|
|
% gnssMeas, the measurements (from ProcessGnssMeas) used to get adrResids |
|
|
% |
|
|
% Optional inputs: prFileName = string with file name |
|
|
% colors, Mx3 color matrix |
|
|
% if colors is not Mx3, it will be ignored |
|
|
|
|
|
%Author: Frank van Diggelen |
|
|
%Open Source code for processing Android GNSS Measurements |
|
|
|
|
|
K = 5; %number of satellites to plot |
|
|
if isempty(adrResid) || ~any(any(isfinite(adrResid.ResidM))) %Nothing but NaNs |
|
|
fprintf(' No adr residuals to plot\n'), return |
|
|
end |
|
|
if nargin<2 |
|
|
prFileName = ''; |
|
|
end |
|
|
|
|
|
M = length(adrResid.Svid); |
|
|
N = length(adrResid.FctSeconds); |
|
|
if nargin<3 || any(size(colors)~=[M,3]) |
|
|
bGotColors = false; |
|
|
else |
|
|
bGotColors = true; |
|
|
end |
|
|
|
|
|
timeSeconds =adrResid.FctSeconds-adrResid.FctSeconds(1);%elapsed time in seconds |
|
|
|
|
|
% find the K sats with most data |
|
|
numValid = zeros(1,M); |
|
|
for j=1:M |
|
|
numValid(j) = sum(isfinite(adrResid.ResidM(:,j))); |
|
|
end |
|
|
[~,jSorted] = sort(numValid,'descend'); |
|
|
hK=zeros(1,K); %initialize plot handle |
|
|
for k=1:K |
|
|
hK(k) = subplot(K,1,k); |
|
|
jSv = jSorted(k); %index into correct adrResid.Svid, and columns of .ResidM |
|
|
svid = adrResid.Svid(jSv); |
|
|
h = plot(timeSeconds,adrResid.ResidM(:,jSv)); grid on, hold on |
|
|
j = find(gnssMeas.Svid == svid); %index into gnssMeas columns |
|
|
if bGotColors |
|
|
set(h,'Color',colors(j,:)); |
|
|
end |
|
|
%get cycle slip flags |
|
|
%From gps.h: |
|
|
% #define GPS_ADR_STATE_CYCLE_SLIP (1<<2) |
|
|
iCs = find(bitand(gnssMeas.AdrState(:,j),2^2)); |
|
|
numCs = length(iCs); |
|
|
if numCs |
|
|
h=plot(timeSeconds(iCs),zeros(numCs,1),'xk'); |
|
|
set(h,'MarkerSize',5) |
|
|
end |
|
|
ts=sprintf('Svids %d - %d',svid,adrResid.Svid0); |
|
|
title(ts) |
|
|
ylabel('(meters)'); |
|
|
end |
|
|
xs = sprintf('time (seconds)\n%s',prFileName); |
|
|
xlabel(xs,'Interpreter','none') |
|
|
linkaxes(hK,'x'); |
|
|
|
|
|
subplot(K,1,1) |
|
|
svid = adrResid.Svid(jSorted(1)); |
|
|
ts=sprintf('ADR single difference residuals. No iono or tropo correction. Svids %d - %d',... |
|
|
svid,adrResid.Svid0); |
|
|
title(ts) |
|
|
ax=axis; |
|
|
ht=text(ax(1),ax(3),' ''x'' = declared cycle slip'); |
|
|
set(ht,'VerticalAlignment','bottom','FontSize',8); |
|
|
|
|
|
end %end of function PlotAdrResids |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
|
|
% 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.
|
|
|
|