public final double resample(final Raster raster, final Index index) throws Exception {

    final int[] x = new int[kernelSize];
    final int[] y = new int[kernelSize];
    final double[][] samples = new double[kernelSize][kernelSize];
    final double[] winX = new double[kernelSize];

    final double cx = index.ki[0] + halfKernelSize;

    double sumX = 0.0;
    for (int n = 0; n < kernelSize; n++) {
      x[n] = (int) index.i[n];
      y[n] = (int) index.j[n];
      winX[n] = sincHanning(cx - n);
      sumX += winX[n];
    }

    if (!raster.getSamples(x, y, samples)) {
      if (Double.isNaN(samples[halfKernelSize][halfKernelSize])) {
        return samples[halfKernelSize][halfKernelSize];
      }
      BiCubicInterpolationResampling.replaceNaNWithMean(samples);
    }

    final double cy = index.kj[0] + halfKernelSize;
    double sumY = 0, winY;
    double v = 0.0;
    for (int j = 0; j < kernelSize; j++) {
      winY = sincHanning(cy - j);
      sumY += winY;
      for (int i = 0; i < kernelSize; i++) {
        v += samples[j][i] * winX[i] * winY;
      }
    }
    v /= sumX * sumY;

    return v;
  }