private static double[,] fwt2d(double[,] x, int width, int height)
{
for (int j = 0; j < width; j++)
{
// 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];
// 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];
// 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];
// 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];
}
// Pack
var tempbank = new double[width, height];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if ((i % 2) == 0)
tempbank[j, i / 2] = (1 / zeta) * x[i, j];
else
tempbank[j, i / 2 + height / 2] = (zeta / 2) * x[i, j];
}
}
for (int i = 0; i < width; i++)
for (int j = 0; j < width; j++)
x[i, j] = tempbank[i, j];
return x;
}