79 lines
1.9 KiB
Java
79 lines
1.9 KiB
Java
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;
|
|
}
|
|
}
|
|
} |