private static double[,] iwt2d(double[,] x, int width, int height)
{
// Unpack
var tempbank = new double[width, height];
for (int j = 0; j < width / 2; j++)
{
for (int i = 0; i < height; i++)
{
tempbank[j * 2, i] = zeta * x[i, j];
tempbank[j * 2 + 1, i] = (2 / zeta) * x[i, j + width / 2];
}
}
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
x[i, j] = tempbank[i, j];
for (int j = 0; j < width; j++)
{
// Undo update 2
for (int i = 2; i < height; i += 2)
x[i, j] -= delta * (x[i - 1, j] + x[i + 1, j]);
x[0, j] -= 2 * delta * x[1, j];
// Undo predict 2
for (int i = 1; i < height - 1; i += 2)
x[i, j] -= gamma * (x[i - 1, j] + x[i + 1, j]);
x[height - 1, j] -= 2 * gamma * x[height - 2, j];
// Undo update 1
for (int i = 2; i < height; i += 2)
x[i, j] -= beta * (x[i - 1, j] + x[i + 1, j]);
x[0, j] -= 2 * beta * x[1, j];
// Undo predict 1
for (int i = 1; i < height - 1; i += 2)
x[i, j] -= alpha * (x[i - 1, j] + x[i + 1, j]);
x[height - 1, j] -= 2 * alpha * x[height - 2, j];
}
return x;
}