Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
function [results, initialResults, variationResults] = calculateByOffsetVariations(pPreparedData, pCurrentCombination, pFloatReferenceTime, pSoundVelocity, pTrackingParameter, pOffsetVariations)
%CALCULATEERRORELLIPSES Summary of this function goes here
% Detailed explanation goes here
%% Create all combinations of offsets that should be calculated
offsetVariations = [ ...
pOffsetVariations; ...
0, 0 ...
];
variations = cell(4, 1);
variationResults = cell(4, 1);
soundsources = strsplit(pCurrentCombination.soundsources{1}, ' ');
for i = 1:length(offsetVariations)
variations{i} = pPreparedData;
% apply variations to the data
for k = 1:length(soundsources)
variations{i}.(soundsources{k}).toa = variations{i}.(soundsources{k}).toa + offsetVariations(i, k);
end
variationResults{i} = struct();
[variationResults{i}.positions, variationResults{i}.dates] = helperCalculateCombinationSegment(variations{i});
% create date vector that contains all common dates
if (i == 1)
intersectedDates = variationResults{i}.dates;
else
intersectedDates = intersect(intersectedDates, variationResults{i}.dates);
end
end
%% Prepare return variables
results = cell(1, length(intersectedDates));
initialResults = variationResults(end);
%% Calculate covariance for every date of the initial results
for i = 1:length(variationResults{end}.dates)
results{i} = struct();
observations = NaN(length(variationResults), 2);
for k = 1:length(variationResults)
selection = variationResults{k}.dates == variationResults{end}.dates(i);
if sum(selection) ~= 1
continue;
end
observations(k, :) = variationResults{k}.positions(selection, :);
end
results{i}.date = variationResults{end}.dates(i);
results{i}.observations = observations;
% get covariance matrix
results{i}.covarianceMatrix = cov(observations);
% eigendecomposition
[results{i}.V, results{i}.D] = eig(results{i}.covarianceMatrix);
end
variationResults = variationResults(1:end - 1);
%% Helper functions
function [segmentPositions, segmentDates] = helperCalculateCombinationSegment(pCustomizedToaData)
[ ...
segmentPositions, ...
segmentDates, ...
~, ...
~ ...
] = artoa.trajectory.calculateCombinationSegment( ...
pCustomizedToaData, ...
pCurrentCombination, ...
pFloatReferenceTime, ...
pSoundVelocity, ...
leprob001
committed
pCurrentCombination.backwardTracking, ...
leprob001
committed
false ...
);
% remove NaNs from segment
validPositions = all(~isnan(segmentPositions), 2);
segmentPositions = segmentPositions(validPositions, :);
segmentDates = segmentDates(validPositions);
end
end