Реализация дискретного косинусного преобразования - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь реализовать уравнение 2D косинусного преобразования, приведенное в разделе «Дискретное косинусное преобразование» на этой веб-странице: https://en.wikipedia.org/wiki/JPEG

    public void transform() {
        int u;
        int v;
        double alphau;
        double alphav;

        double[][] test = {
            {52, 55, 61, 66, 70, 61, 64, 73},   
            {63, 59, 55, 90, 109, 85, 69, 72},
            {62, 59, 68, 113, 144, 104, 66, 73},
            {63, 58, 71, 122, 154, 106, 70, 69}, 
            {67, 61, 68, 104, 126, 88, 68, 70},  
            {79, 65, 60, 70, 77, 68, 58, 75},
            {85, 71, 64, 59, 55, 61, 65, 83},
            {87, 79, 69, 68, 65, 76, 78, 94}
        };

        double summation = 0;
        double[][] coefficients = new double[8][8];

        for(int x = 0; x < test.length; x++) 
        {

            for(int y = 0; y < test[x].length; y++)
            {
                //Inner discrete transform.
                u = x % 8;
                v = y % 8;

                double cosu = Math.cos(Math.toRadians((((2 * x) + 1) * u * Math.PI) / 16));
                double cosv = Math.cos(Math.toRadians((((2 * y) + 1) * v * Math.PI) / 16));

                summation = ((test[y][x]) * cosu * cosv) + summation;
                System.out.print(test[y][x] - 128 + ", ");
            }
            System.out.println("");
        }

        System.out.println("");

        for(int i = 0; i < 8; i++)
        {
            for(int j = 0; j < 8; j++) 
            {
                //Outer discrete transform.
                alphau = 1.0;
                alphav = 1.0;

                if(i == 0) {
                    alphav = 1 / Math.sqrt(2);
                }
                if(j == 0) {
                    alphau = 1 / Math.sqrt(2);
                }

                coefficients[i][j] = .25 * alphau * alphav * summation;

                System.out.print(coefficients[i][j] + ", ");
            }
            System.out.println("");
        }

    }

Быстрая ссылка на уравнение I Я пытаюсь реализовать можно найти здесь: 1 Первый для l oop предназначен для вычисления двойного суммирования косинусов тестового массива, а второй предназначен для умножения его на соответствующие значения альфа , Мой вывод для коэффициентов возвращает:

589, 833, 833, 833, 833, 833, 833, 833, 833, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 833, 1179, 1179 1179, 1179, 1179, 1179, 1179, 833, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 833, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 833, 1179, 1179, 1179 1179, 1179, 1179, 1179, 833, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 833, 1179, 1179, 1179, 1179, 1179, 1179, 1179,

Пока ожидается выход можно найти здесь: 2

1 Ответ

0 голосов
/ 25 апреля 2020

Выход из следующей программы соответствует онлайн-калькулятору DCT https://asecuritysite.com/comms/dct2 Пожалуйста, проверьте и дайте мне знать, если это работает для вас

 void dctTransform(double matrix[][])
    {
        int i, j, k, l;

        // dct will store the discrete cosine transform
        double[][] dct = new double[m][n];

        double ci, cj, dct1, sum;

        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
            {
                // ci and cj depends on frequency as well as
                // number of row and columns of specified matrix
                if (i == 0)
                    ci = 1 / Math.sqrt(m);
                else
                    ci = Math.sqrt(2) / Math.sqrt(m);

                if (j == 0)
                    cj = 1 / Math.sqrt(n);
                else
                    cj = Math.sqrt(2) / Math.sqrt(n);

                // sum will temporarily store the sum of
                // cosine signals
                sum = 0;
                for (k = 0; k < m; k++)
                {
                    for (l = 0; l < n; l++)
                    {
                        dct1 = matrix[k][l] *
                                Math.cos((2 * k + 1) * i * pi / (2 * m)) *
                                Math.cos((2 * l + 1) * j * pi / (2 * n));
                        sum = sum + dct1;
                    }
                }
                dct[i][j] = ci * cj * sum;
            }
        }

        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
                System.out.printf("%f\t", dct[i][j]);
            System.out.println();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...