§ Одномерное преобразование
Элементы матрицы представлены формулой DCT-2n (число 2 - это версия ДКП, n - размерность):Коэффициент перед косинусом вычисляется так:
- если
- если
§ Прямое преобразование
Допустим, есть вектор на 8 элементов. Нужно умножить его на матрицу 8x8v0 m00 m01 ... m07 v1 m10 m11 ... m17 .. x .............. v6 m60 m61 ... m67 v7 m70 m71 ... m77По правилу умножения матриц, каждый элемент вектора (столбец) умножается на строку в матрице:
Другими словами, например, рассчитаем:
И так для каждого нового элемента столбца.
§ Обратное преобразование
Здесь все будет так же, кроме одного: матрица транспонируется. То есть, она как будто переворачивается на 90 градусов и значения следующие:v0 m00 m10 ... m70 v1 m01 m11 ... m11 .. x .............. v6 m06 m16 ... m76 v7 m07 m17 ... m77Потому рассчитываются теперь значения иначе:
Здесь от предыдущей формулы поменялся только порядок
§ Небольшой вывод преобразования
Умножим вектор на матрицуv0 m00 m01 m02 v1 x m10 m11 m12 v2 m20 m21 m22Получим
f0 = v0*m00 + v1*m01 + v2*m02 f1 = v0*m10 + v1*m11 + v2*m12 f2 = v0*m20 + v1*m21 + v2*m22Умножим снова вектор на транспонированную матрицу
f0 m00 m10 m20 f1 x m01 m11 m21 f2 m02 m12 m22Получим
n0 = f0*m00 + f1*m10 + f2*m20 n1 = f0*m01 + f1*m11 + f2*m21 n2 = f0*m02 + f1*m12 + f2*m22А теперь вместо f0,f1,f2 подставим их выражения
n0 = (v0*m00 + v1*m01 + v2*m02)*m00 + (v0*m10 + v1*m11 + v2*m12)*m10 + (v0*m20 + v1*m21 + v2*m22)*m20 n1 = (v0*m00 + v1*m01 + v2*m02)*m01 + (v0*m10 + v1*m11 + v2*m12)*m11 + (v0*m20 + v1*m21 + v2*m22)*m21 n2 = (v0*m00 + v1*m01 + v2*m02)*m02 + (v0*m10 + v1*m11 + v2*m12)*m12 + (v0*m20 + v1*m21 + v2*m22)*m22Внесем общие множители из скобок:
n0 = (v0*m00*m00 + v1*m01*m00 + v2*m02*m00) + (v0*m10*m10 + v1*m11*m10 + v2*m12*m10) + (v0*m20*m20 + v1*m21*m20 + v2*m22*m20) n1 = (v0*m00*m01 + v1*m01*m01 + v2*m02*m01) + (v0*m10*m11 + v1*m11*m11 + v2*m12*m11) + (v0*m20*m21 + v1*m21*m21 + v2*m22*m21) n2 = (v0*m00*m02 + v1*m01*m02 + v2*m02*m02) + (v0*m10*m12 + v1*m11*m12 + v2*m12*m12) + (v0*m20*m22 + v1*m21*m22 + v2*m22*m22)Перегруппировка v0,v1,v2:
n0 = v0*(m00*m00 + m10*m10 + m20*m20) + v1*(m01*m00 + m11*m10 + m21*m20) + v2*(m02*m00 + m12*m10 + m22*m20) n1 = v0*(m00*m01 + m10*m11 + m20*m21) + v1*(m01*m01 + m11*m11 + m21*m21) + v2*(m02*m01 + m12*m11 + m22*m21) n2 = v0*(m00*m02 + m10*m12 + m20*m22) + v1*(m01*m02 + m11*m12 + m21*m22) + v2*(m02*m02 + m12*m12 + m22*m22)Итак, что в итоге получилось? Сейчас я обращу внимание на то, что у коэффициентов v0, v1, v2 — находится сумма квадратов. А что такое ? Это косинусы ведь.
Дело в том, что сумма этих косинусов по дискретным отсчета это значение интеграла:
Поскольку значение - это константа, поскольку она не меняется при суммировании, то видно, что функция то может быть ортонормирована! Просто необходимо домножить константу в косинусе на .
И выходит, что результат получается равным для любого . В данном случае в качестве выступает номер вектора, который вычисляем.
Еще одна особенность, что при интеграл будет равен .
Теперь рассмотрим два других компонента:
-
v1*(m01*m00 + m11*m10 + m21*m20)
-
v2*(m02*m00 + m12*m10 + m22*m20)
Где - это номер элемента вектора, который считаем (здесь константа), и - номер компонента, тоже константа. И получается что:
Где . Аналогично, если привести в тот же ортонормированный вид, то получится 0, всегда 0, из-за свойства ортонормированности. Это означает, что при перемножении на такую матрицу и умножении ее снова на ту же, получим одно и то же одинаковое значение входящего вектора.
Естественно, это все доказано так себе, но хотя бы общее представление теперь у меня имеется, почему именно оно так работает.
Поскольку, если применять формулу вычисления, которая получилась выше, то для новых коэффициентов получатся значения (выше показано, что интеграл при a = 0 равен n), и также
Чтобы этого избежать, коэффициенты как раз и домножаются на для нулевого , и для всех остальных.