/*
 * 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 FDCT.
 */
public class FDCT implements DCT {

	/**
	 * F dct transform.
	 *
	 * @param ablk the ablk
	 * @return the double[][]
	 */
	public static double[][] fDctTransform(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];
			}
		}
		// 对行变换
		for (int i = 0; i <= 7; i++) {
			double S07, S16, S25, S34, S0734, S1625;
			double D07, D16, D25, D34, D0734, D1625;
			S07 = blk[i][0] + blk[i][7];
			S16 = blk[i][1] + blk[i][6];
			S25 = blk[i][2] + blk[i][5];
			S34 = blk[i][3] + blk[i][4];
			S0734 = S07 + S34;
			S1625 = S16 + S25;
			D07 = blk[i][0] - blk[i][7];
			D16 = blk[i][1] - blk[i][6];
			D25 = blk[i][2] - blk[i][5];
			D34 = blk[i][3] - blk[i][4];
			D0734 = S07 - S34;
			D1625 = S16 - S25;
			blk[i][0] = 0.5 * (C4 * (S0734 + S1625));
			blk[i][1] = 0.5 * (C1 * D07 + C3 * D16 + C5 * D25 + C7 * D34);
			blk[i][2] = 0.5 * (C2 * D0734 + C6 * D1625);
			blk[i][3] = 0.5 * (C3 * D07 - C7 * D16 - C1 * D25 - C5 * D34);
			blk[i][4] = 0.5 * (C4 * (S0734 - S1625));
			blk[i][5] = 0.5 * (C5 * D07 - C1 * D16 + C7 * D25 + C3 * D34);
			blk[i][6] = 0.5 * (C6 * D0734 - C2 * D1625);
			blk[i][7] = 0.5 * (C7 * D07 - C5 * D16 + C3 * D25 - C1 * D34);
		}
		// 对列变换
		for (int j = 0; j <= 7; j++) {
			double S07, S16, S25, S34, S0734, S1625;
			double D07, D16, D25, D34, D0734, D1625;
			S07 = blk[0][j] + blk[7][j];
			S16 = blk[1][j] + blk[6][j];
			S25 = blk[2][j] + blk[5][j];
			S34 = blk[3][j] + blk[4][j];
			S0734 = S07 + S34;
			S1625 = S16 + S25;
			D07 = blk[0][j] - blk[7][j];
			D16 = blk[1][j] - blk[6][j];
			D25 = blk[2][j] - blk[5][j];
			D34 = blk[3][j] - blk[4][j];
			D0734 = S07 - S34;
			D1625 = S16 - S25;
			blk[0][j] = 0.5 * (C4 * (S0734 + S1625));
			blk[1][j] = 0.5 * (C1 * D07 + C3 * D16 + C5 * D25 + C7 * D34);
			blk[2][j] = 0.5 * (C2 * D0734 + C6 * D1625);
			blk[3][j] = 0.5 * (C3 * D07 - C7 * D16 - C1 * D25 - C5 * D34);
			blk[4][j] = 0.5 * (C4 * (S0734 - S1625));
			blk[5][j] = 0.5 * (C5 * D07 - C1 * D16 + C7 * D25 + C3 * D34);
			blk[6][j] = 0.5 * (C6 * D0734 - C2 * D1625);
			blk[7][j] = 0.5 * (C7 * D07 - C5 * D16 + C3 * D25 - C1 * D34);
		}
		return blk;
	}
}
