离散余弦转换

103 阅读1分钟
import java.util.List;

/**
 * @author sunzeng
 * @version 1.0
 * @date 2022/9/30 15:41
 */
public class Util {

    public static double[] getDCT(double[] data){
        double[] dct=new double[64];
        int indexResult=0;
        for (int u = 0; u < 8; ++u) {
            for (int v = 0; v < 8; ++v) {
                double Cu;
                double Cv;
                if (u == 0) {
                    Cu = 1.0 / Math.sqrt(2.0);
                } else {
                    Cu = 1.0;
                }

                if (v == 0) {
                    Cv = 1.0 / Math.sqrt(2.0);
                } else {
                    Cv = 1.0;
                }
                double ysum = 0.0;
                for ( int i = 0; i < 8; i++) {
                    for ( int j = 0; j < 8; j++) {
                        double y=data[getIndex(i,j,8)]*Math.cos((2 * i + 1) * u * Math.PI / 16.0)*Math.cos((2 * j + 1) * v * Math.PI / 16.0);
                        ysum += y;

                    }
                }
                dct[indexResult]=0.25*Cu*Cv*ysum;
                indexResult++;
            }
        }
        return dct;
    }
    public static double[] getIDCT(double[] data) {
        double[] idctArr=new double[64];
        for ( int i = 0; i < 8; i++) {
            for ( int j = 0; j < 8; j++) {
                double idctValue = 0.0;
                for (int u = 0; u < 8; ++u) {
                    for (int v = 0; v < 8; ++v) {
                        double Cu;
                        double Cv;
                        if (u == 0) {
                            Cu = 1.0 / Math.sqrt(2.0);
                        } else {
                            Cu = 1.0;
                        }

                        if (v == 0) {
                            Cv = 1.0 / Math.sqrt(2.0);
                        } else {
                            Cv = 1.0;
                        }
                        int index=getIndex(u,v,8);
                        double f=data[index];
                        double idct=0.25*Cu*Cv*f*(Math.cos((2 * i + 1) * u * Math.PI / 16.0)*Math.cos((2 * j + 1) * v * Math.PI / 16.0));
                        idctValue+=idct;
                    }
                }
                idctArr[getIndex(i,j,8)]=idctValue;
            }
        }
        return idctArr;
    }
    public static int getIndex(int row, int col, int cols) {
        return row * cols + col % cols;
    }

    public static void main(String[] args) {
        double[] data={
                8,   6,   5,   8,   12,  20,  26,  31,
                6,   6,   7,   10,  13,  29,  30,  28,
                7,   7,   8,   12,  20,  29,  35,  28,
                7,   9,   11,  15,  26,  44,  40,  31,
                9,   11,  19,  28,  34,  55,  52,  39,
                12,  18,  28,  32,  41,  52,  57,  46,
                25,  32,  39,  44,  52,  61,  60,  51,
                36,  46,  48,  49,  56,  50,  52,  50,
        };
        double[] dctData=getDCT(data);
        double[] idctData=getIDCT(dctData);
        for(int i=0;i<64;i++){
            System.out.print(""+ Math.round(data[i]) +"\t\t");
        }
        System.out.println();
        for(int i=0;i<64;i++){
            System.out.print(""+ Math.round(dctData[i]) +"\t\t");
        }
        System.out.println();
        for(int i=0;i<64;i++){
            System.out.print(""+ Math.round(idctData[i]) +"\t\t");
        }
    }
}