/*
* Copyright (C) 2012 www.amsoft.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ab.util.dct;
// TODO: Auto-generated Javadoc
/**
* The Class IFDCT.
*/
public class IFDCT implements DCT {
/**
* I f dct transform.
*
* @param ablk the ablk
* @return the double[][]
*/
public static double[][] iFDctTransform(double[][] ablk) {
double[][] blk = new double[8][8];
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
blk[i][j] = ablk[i][j];
}
}
// 对列做IDCT
for (int j = 0; j <= 7; j++) {
double[] tmp = new double[16];
// first step
tmp[0] = blk[0][j] * C4 + blk[2][j] * C2;
tmp[1] = blk[4][j] * C4 + blk[6][j] * C6;
tmp[2] = blk[0][j] * C4 + blk[2][j] * C6;
tmp[3] = -blk[4][j] * C4 - blk[6][j] * C2;
tmp[4] = blk[0][j] * C4 - blk[2][j] * C6;
tmp[5] = -blk[4][j] * C4 + blk[6][j] * C2;
tmp[6] = blk[0][j] * C4 - blk[2][j] * C2;
tmp[7] = blk[4][j] * C4 - blk[6][j] * C6;
tmp[8] = blk[1][j] * C7 - blk[3][j] * C5;
tmp[9] = blk[5][j] * C3 - blk[7][j] * C1;
tmp[10] = blk[1][j] * C5 - blk[3][j] * C1;
tmp[11] = blk[5][j] * C7 + blk[7][j] * C3;
tmp[12] = blk[1][j] * C3 - blk[3][j] * C7;
tmp[13] = -blk[5][j] * C1 - blk[7][j] * C5;
tmp[14] = blk[1][j] * C1 + blk[3][j] * C3;
tmp[15] = blk[5][j] * C5 + blk[7][j] * C7;
// second step
tmp[0] = 0.5 * (tmp[0] + tmp[1]);
tmp[1] = 0.5 * (tmp[2] + tmp[3]);
tmp[2] = 0.5 * (tmp[4] + tmp[5]);
tmp[3] = 0.5 * (tmp[6] + tmp[7]);
tmp[4] = 0.5 * (tmp[8] + tmp[9]);
tmp[5] = 0.5 * (tmp[10] + tmp[11]);
tmp[6] = 0.5 * (tmp[12] + tmp[13]);
tmp[7] = 0.5 * (tmp[14] + tmp[15]);
// third step
blk[0][j] = tmp[0] + tmp[7];
blk[1][j] = tmp[1] + tmp[6];
blk[2][j] = tmp[2] + tmp[5];
blk[3][j] = tmp[3] + tmp[4];
blk[4][j] = tmp[3] - tmp[4];
blk[5][j] = tmp[2] - tmp[5];
blk[6][j] = tmp[1] - tmp[6];
blk[7][j] = tmp[0] - tmp[7];
}
// 对行做IDCT
for (int i = 0; i <= 7; i++) {
double[] tmp = new double[16];
// first step
tmp[0] = blk[i][0] * C4 + blk[i][2] * C2;
tmp[1] = blk[i][4] * C4 + blk[i][6] * C6;
tmp[2] = blk[i][0] * C4 + blk[i][2] * C6;
tmp[3] = -blk[i][4] * C4 - blk[i][6] * C2;
tmp[4] = blk[i][0] * C4 - blk[i][2] * C6;
tmp[5] = -blk[i][4] * C4 + blk[i][6] * C2;
tmp[6] = blk[i][0] * C4 - blk[i][2] * C2;
tmp[7] = blk[i][4] * C4 - blk[i][6] * C6;
tmp[8] = blk[i][1] * C7 - blk[i][3] * C5;
tmp[9] = blk[i][5] * C3 - blk[i][7] * C1;
tmp[10] = blk[i][1] * C5 - blk[i][3] * C1;
tmp[11] = blk[i][5] * C7 + blk[i][7] * C3;
tmp[12] = blk[i][1] * C3 - blk[i][3] * C7;
tmp[13] = -blk[i][5] * C1 - blk[i][7] * C5;
tmp[14] = blk[i][1] * C1 + blk[i][3] * C3;
tmp[15] = blk[i][5] * C5 + blk[i][7] * C7;
// second step
tmp[0] = 0.5 * (tmp[0] + tmp[1]);
tmp[1] = 0.5 * (tmp[2] + tmp[3]);
tmp[2] = 0.5 * (tmp[4] + tmp[5]);
tmp[3] = 0.5 * (tmp[6] + tmp[7]);
tmp[4] = 0.5 * (tmp[8] + tmp[9]);
tmp[5] = 0.5 * (tmp[10] + tmp[11]);
tmp[6] = 0.5 * (tmp[12] + tmp[13]);
tmp[7] = 0.5 * (tmp[14] + tmp[15]);
// third step
blk[i][0] = tmp[0] + tmp[7];
blk[i][1] = tmp[1] + tmp[6];
blk[i][2] = tmp[2] + tmp[5];
blk[i][3] = tmp[3] + tmp[4];
blk[i][4] = tmp[3] - tmp[4];
blk[i][5] = tmp[2] - tmp[5];
blk[i][6] = tmp[1] - tmp[6];
blk[i][7] = tmp[0] - tmp[7];
}
return blk;
}
}