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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
function [gpsRafosDates, predictedToa] = predictToaFromGps(pRfb, pSoundSource, pSoundSpeedParameter)
%ESTIMATETOAFROMGPS Summary of this function goes here
% Detailed explanation goes here
%% Collect Float data
gpsData = pRfb.SAT_DATA;
floatSchedule = pRfb.FLOAT.schedule;
floatPhasereftime = pRfb.FLOAT.phasereftime(1) + pRfb.FLOAT.phasereftime(2)/60;
floatWindowStart = pRfb.FLOAT.windowstart;
floatWindowLength = pRfb.FLOAT.windowlength;
floatLaunchTime = artoa.convert.dmy2rd( ...
pRfb.FLOAT.launchtime(3), ...
pRfb.FLOAT.launchtime(2), ...
pRfb.FLOAT.launchtime(1) ...
) + pRfb.FLOAT.launchtime(4)/24 + pRfb.FLOAT.launchtime(5)/24/60;
% floatSurfaceEnd = artoa.convert.dmy2rd( ...
% pRfb.FLOAT.cycle(13), pRfb.FLOAT.cycle(12), pRfb.FLOAT.cycle(11) ...
% ) + pRfb.FLOAT.cycle(14)/24 + pRfb.FLOAT.cycle(15)/24/60;
%% Collect sound source data
soundSourceTime = pSoundSource.reftime(1) + pSoundSource.reftime(2)/60;
%soundSourceSchedule = pSoundSource.schedule;
%soundSourceLaunchDate = [pSoundSource.launchtime(3) pSoundSource.launchtime(2) pSoundSource.launchtime(1)];
soundSourceEmissionBegin = artoa.convert.dmy2rd( ...
[pSoundSource.begemis(3) pSoundSource.begemis(2) pSoundSource.begemis(1)] ...
) + pSoundSource.begemis(4)/24 + pSoundSource.begemis(5)/24/60;
%soundSourceOffset = 0;
% if (~isempty(pSoundSource.offset))
% soundSourceOffset = pSoundSource.offset(4);
% end
soundSourceDrift = 0;
if ~isempty(pSoundSource.drift) && ~isnan(pSoundSource.drift)
soundSourceDrift = pSoundSource.drift;
end
soundSourcePosition = pSoundSource.position;
%% Collect generic variables
leapSeconds = artoa.data.calculateLeapseconds( ...
floatLaunchTime, ...
soundSourceEmissionBegin ...
);
%% Calculations
loopLength = floor(24/floatSchedule);
floatTime = NaN(loopLength, 1);
for o = 1:loopLength
floatTime(o) = mod(floatPhasereftime + (o-1) * floatSchedule, 24);
end
floatTime = sort(floatTime);
travelCorrection = soundSourceTime - floatTime;
maxTime = (floatWindowStart + floatWindowLength) / 60;
minTime = floatWindowStart / 60;
indicesInRange = (travelCorrection < maxTime) & (travelCorrection >= minTime);
windowStartTime = min(travelCorrection(indicesInRange));
clear maxTime minTime indicesInRange;
% sound xmit time (seconds) = (hours*60 plus minutes)*60 -leapseconds - sosooffset
%soundXmitTime = windowStartTime * 3600 - leapSeconds + soundSourceOffset + pAdditionalOffset;
soundSourceDriftSinceLaunch = soundSourceDrift ...
* (floatLaunchTime - soundSourceEmissionBegin);
%soundSourceDriftSinceSurfaceEnd = soundSourceDrift ...
% * (floatSurfaceEnd - artoa.convert.dmy2rd(soundSourceEmissionBegin));
%predictedToaAtLaunch = soundXmitTime + soundSourceDriftSinceLaunch;
%predictedToaAtSurface = soundXmitTime + soundSourceDriftSinceSurfaceEnd;
%% Predict toa for every gps position
gpsMeasurementCount = size(gpsData, 1);
predictedToa = zeros(gpsMeasurementCount, 1);
gpsRafosDates = NaN(gpsMeasurementCount, 1);
for o = 1:gpsMeasurementCount
currentGpsPosition = [str2double(gpsData{o, pRfb.SAT_FORMAT.lat_sat}), str2double(gpsData{o, pRfb.SAT_FORMAT.lon_sat})];
gpsRafosDates(o) = artoa.convert.dmy2rd( ...
str2double(gpsData{o, pRfb.SAT_FORMAT.day_sat}), ...
str2double(gpsData{o, pRfb.SAT_FORMAT.month_sat}), ...
str2double(gpsData{o, pRfb.SAT_FORMAT.year_sat}) ...
);
currentSoundsourceDrift = soundSourceDrift * (gpsRafosDates(o) - soundSourceEmissionBegin);
% calculate distance between sound source and gps
distanceSoundSourceToFloat = artoa.data.calculateGeodist(currentGpsPosition, soundSourcePosition);
if (isempty(windowStartTime))
predictedToa(o) = NaN;
else
predictedToa(o) = windowStartTime * 3600 - leapSeconds + currentSoundsourceDrift ...
+ distanceSoundSourceToFloat / (artoa.data.calculateSoundVelocity( ...
pSoundSpeedParameter.temperature, pSoundSpeedParameter.pressure, ...
pSoundSpeedParameter.method, pSoundSpeedParameter.soundSource ...
)/1000); % TODO: CHECK IF /1000 IS CORRECT
end
end
end