package sparseviewer.otf; public class DelayCorrection { public static CorrectedXY correctXY(double[] x, double[] y, double shiftSamples) { double[] xc = shiftArray(x, shiftSamples); double[] yc = shiftArray(y, shiftSamples); return new CorrectedXY(xc, yc); } public static double[] shiftArray(double[] values, double shiftSamples) { if (values == null) { return null; } double[] out = new double[values.length]; for (int i = 0; i < values.length; i++) { double sourceIndex = i - shiftSamples; out[i] = interpolateAt(values, sourceIndex); } return out; } private static double interpolateAt(double[] values, double index) { if (values == null || values.length == 0) { return Double.NaN; } if (index < 0.0 || index > values.length - 1) { return Double.NaN; } int i0 = (int) Math.floor(index); int i1 = i0 + 1; if (i1 >= values.length) { return values[i0]; } double v0 = values[i0]; double v1 = values[i1]; if (!isFinite(v0) || !isFinite(v1)) { return Double.NaN; } double alpha = index - i0; return (1.0 - alpha) * v0 + alpha * v1; } private static boolean isFinite(double v) { return !Double.isNaN(v) && !Double.isInfinite(v); } public static class CorrectedXY { private final double[] x; private final double[] y; public CorrectedXY(double[] x, double[] y) { this.x = x; this.y = y; } public double[] getX() { return x; } public double[] getY() { return y; } } }