in Backend/src/Trackable.TripDetection/Modules/NoiseRemovalModule.cs [57:116]
public override Task<TripDetectionContext> Process(TripDetectionContext input, ILogger logger)
{
logger.LogDebugSerialize("Recieved points {0}", input.FilteredOrderedPoints);
// Filter out points with low accuracy or no datetime stamps
var noisePoints = input.FilteredOrderedPoints.Where(p =>
(p.Accuracy.HasValue && p.Accuracy.Value > this.minimumAccuracy)
|| p.DeviceTimestampUtc == 0);
var preFilteredPoints = input.FilteredOrderedPoints.Except(noisePoints).ToList();
logger.LogDebugSerialize("Filtered points based on accuracy or 0 timestamps {0}", preFilteredPoints);
var filteredPoints = new List<TrackingPoint>();
for (int i = 0; i < preFilteredPoints.Count - 1; i++)
{
if (preFilteredPoints[i].DeviceTimestampUtc != preFilteredPoints[i + 1].DeviceTimestampUtc
&& (preFilteredPoints[i].Latitude != preFilteredPoints[i + 1].Latitude
|| preFilteredPoints[i].Longitude != preFilteredPoints[i + 1].Longitude ))
{
filteredPoints.Add(preFilteredPoints[i]);
}
}
input.FilteredOrderedPoints = filteredPoints;
logger.LogDebugSerialize("Removed duplicate points {0}", filteredPoints);
if (filteredPoints.Count < 2)
{
logger.LogDebugSerialize("Output few points {0}", filteredPoints);
return Task.FromResult(input);
}
var accelerations = MathUtils.AveragePointAccelerations(filteredPoints);
var flaggedPointIndeces = new HashSet<int>();
for (int i = 0; i < accelerations.Count; i++)
{
if (accelerations[i] > this.accelerationThreshold)
{
flaggedPointIndeces.Add(i);
}
}
var finalPoints = new List<TrackingPoint>();
for (int i = 0; i < filteredPoints.Count; i++)
{
if (!flaggedPointIndeces.Contains(i))
{
finalPoints.Add(filteredPoints[i]);
}
}
input.FilteredOrderedPoints = finalPoints.OrderBy(p => p.DeviceTimestampUtc).ToList();
logger.LogDebugSerialize("Output further filtered points {0}", input.FilteredOrderedPoints);
return Task.FromResult(input);
}