# Transformée en cosinus discrète

La transformée en cosinus discrète ou TCD (de l'anglais : DCT ou Discrete Cosine Transform) est une transformation proche de la transformée de Fourier discrète (DFT). Le noyau de projection est un cosinus et crée donc des coefficients réels, contrairement à la DFT, dont le noyau est une exponentielle complexe et qui crée donc des coefficients complexes. On peut cependant exprimer la DCT en fonction de la DFT, qui est alors appliquée sur le signal symétrisé.
La variante la plus courante de la transformée en cosinus discrète est la DCT type-II, souvent simplement appelée « la DCT ». Son inverse, qui correspond au type-III est souvent simplement appelée « IDCT ».

## Applications

La DCT, et en particulier la DCT-II est très utilisée en traitement du signal et de l'image, et spécialement en compression. La DCT possède en effet une excellente propriété de « regroupement » de l'énergie : l'information est essentiellement portée par les coefficients basses fréquences. Pour les images naturelles, la DCT est la transformation qui se rapproche le plus de la transformée de Karhunen-Loève qui fournit une décorrélation optimale des coefficients pour un signal markovien. En pratique, les procédés de compression font donc l'hypothèse qu'une image naturelle peut être modélisée comme la réalisation d'un processus markovien et approximent la transformée de Karhunen-Loève, trop complexe en calcul et dépendante des données, par une DCT. L'intérêt d'une transformation se voit particulièrement bien sur une figure (voir ci-contre). Seuls un petit nombre de coefficients sont non nuls, et peuvent être utilisés pour reconstruire l'image par transformée inverse (IDCT) lors de la décompression. Le gain en matière de compression vient de la suppression des coefficients nuls ou proches de zéro. Ce genre de mécanisme est utilisé dans les standards JPEG et MPEG, qui utilisent une DCT 2D sur des blocs de pixels de taille 8×8 (pour des raisons de complexité).
Les formats de compression de son avec perte AAC, Vorbis et MP3 utilisent une version modifiée de cette technique, la transformée en cosinus discrète modifiée (en), TCDM (MDCT en anglais).
La DCT est aussi employée pour la résolution de systèmes d'équations différentielles par des méthodes spectrales.

## Définition

La DCT est une fonction linéaire inversible R$^N$ → R$^N$ ou de manière équivalente une matrice carrée N × N inversible. Il existe plusieurs légères variantes de la DCT. Voici les quatre types les plus connus.
Le développement des algorithmes de calcul rapide des transformées DCT se basent sur la possibilité de décomposer la matrice de définition sous forme d'un produit de matrices dont le calcul est plus simple, et permet de réduire le nombre de multiplications scalaires, en profitant des identités remarquables de périodicité et symétries des fonctions sinusoïdales. Ainsi, on peut décomposer toute transformée DCT de R$^N$ en transformées plus simples en décomposant N en produit de facteurs premiers, et en composant des sous-transformées dans R$^n$ où n est l'un de ces facteurs. En particulier, de nombreuses optimisations ont été développées quand N est une puissance de 2.
Cela revient à réécrire la matrice N × N sous forme de produit de sous-matrices identiques (disposées en pavage régulier et utilisant donc des coefficients réels communs ou différenciés uniquement par leur signe) et de matrices à coefficients unitaires ou nuls (-1, 0 ou 1), ces dernières ne nécessitant pas de multiplication.

### DCT-I

    $X_{k}={\frac {1}{2}}\left(x_{0}+(-1)^{k}x_{N-1}\right)+\sum _{n=1}^{N-2}{x_{n}\cos \left[{\frac {\pi }{N-1}}nk\right]}$
On peut rendre cette transformée orthogonale (à une constante multiplicative près) en multipliant x$_0$ et x$_{N-1}$ par √2 et réciproquement X$_0$ et X$_{N-1}$ par 1/√2. Cette normalisation casse toutefois la correspondance avec une DFT.
On peut noter que la DCT-I n'est pas définie pour $N\leq 2$, contrairement aux autres types qui sont définis pour tout N positif.

### DCT-II

    $X_{k}=\sum _{n=0}^{N-1}{x_{n}\cos \left[{\frac {\pi }{N}}\left(n+{\frac {1}{2}}\right)k\right]}$
Cette variante DCT est la plus courante et la plus utilisée. Elle est généralement simplement appelée « la DCT ». De la même manière que pour la DCT-I, on peut rendre cette transformation orthogonale en multipliant X$_0$ par 1/√2. Cette forme normalisée est très utilisée en pratique mais casse la correspondance avec la DFT.

#### Exemple pour N = 8

Un développement optimisé de cette transformée pour le cas N=8 (utilisé dans JPEG et MPEG) est obtenu en réécrivant la transformée sous forme matricielle et en factorisant la décomposition, pour réduire le nombre de multiplications scalaires nécessaires. Par exemple, la décomposition suivante est utilisée pour la factorisation par l'algorithme de Chen, ici orthogonalisée (voir remarque ci-dessus) :

##### Coefficients constants de calcul

    ${\begin{pmatrix}C_{1}\\C_{2}\\C_{3}\\C_{4}\\C_{5}\\C_{6}\\C_{7}\end{pmatrix}}={\sqrt {\frac {2}{N}}}.{\begin{pmatrix}\cos {\frac {\pi }{16}}\\\cos {\frac {2\pi }{16}}\\\cos {\frac {3\pi }{16}}\\\cos {\frac {4\pi }{16}}\\\cos {\frac {5\pi }{16}}\\\cos {\frac {6\pi }{16}}\\\cos {\frac {7\pi }{16}}\\\end{pmatrix}}\approx {\begin{pmatrix}0,49039\\0,46194\\0,41573\\0,35355\\0,27779\\0,19134\\0,09755\end{pmatrix}}$

##### DCT(8) (méthode de calcul rapide)

    ${\begin{pmatrix}X_{0}\\X_{2}\\X_{4}\\X_{6}\end{pmatrix}}={\begin{bmatrix}C_{4}&C_{4}&C_{4}&C_{4}\\C_{2}&C_{6}&-C_{6}&-C_{2}\\C_{4}&-C_{4}&-C_{4}&C_{4}\\C_{6}&-C_{2}&C_{2}&-C_{6}\end{bmatrix}}.{\begin{pmatrix}x_{0}+x_{7}\\x_{1}+x_{6}\\x_{2}+x_{5}\\x_{3}+x_{4}\end{pmatrix}}$
    ${\begin{pmatrix}X_{1}\\X_{3}\\X_{5}\\X_{7}\end{pmatrix}}={\begin{bmatrix}C_{1}&C_{3}&C_{5}&C_{7}\\C_{3}&-C_{7}&-C_{1}&-C_{5}\\C_{5}&-C_{1}&C_{7}&C_{3}\\C_{7}&-C_{5}&C_{3}&-C_{1}\end{bmatrix}}.{\begin{pmatrix}x_{0}-x_{7}\\x_{1}-x_{6}\\x_{2}-x_{5}\\x_{3}-x_{4}\end{pmatrix}}$
La formule optimisée pour une DCT unidimensionnelle est souvent utilisée telle quelle pour son utilisation dans l'espace bidimensionnel (par transposition et composition) ; cette formule permet de réduire de façon remarquable le calcul de 1024 multiplications (formule de base) à 512 multiplications seulement dans le traitement d'un bloc image 8×8 (deux passes de 32 multiplications pour chaque ligne de 8 valeurs, qui font 512 multiplications) ; cependant, des optimisations sont encore possibles en optimisant la composition elle-même des deux passes (horizontale et verticale) pour réduire encore de 256 à 91 multiplications seulement (voire moins selon des recherches plus récentes).
On notera aussi que la première matrice ci-dessus permet aussi une réécriture de nombreuses multiplications communes (et donc la formule ci-dessus nécessite beaucoup moins que les 32 multiplications, 16 si on regroupe les sous-expressions communes). On pourrait encore décomposer facilement la première matrice car elle est elle-même une transformée DCT dans R$^4$, décomposable en deux sous-matrices de R$^2$.
De nombreuses études ont montré comment cette transformée peut être optimisée en fonction des contraintes, notamment quand la transformée est utilisée pour la compression, car la transformée permet de concentrer l'essentiel de l'énergie dans les coefficients obtenus x$_i$ d'indice faible, les autres concentrant peu d'énergie ont une contribution faible sur le signal spatial initial et sont réduits à zéro lors des étapes de quantification. Ainsi, la précision nécessaire pour représenter les derniers coefficients est plus faible voire nulle, et les coefficients constants C$_i$ utilisés pour le calcul des multiplications scalaires peuvent faire l'objet d'optimisation spécifique, en fixant leur précision, et en utilisant des techniques de multiplication par un nombre réduit d'additions-décalages sans avoir besoin d'utiliser une multiplication générique.
Néanmoins, cet algorithme de calcul (présenté tel quel, il calcule la DCT unidimensionnelle à 8 points avec 16 multiplications) est à la base de toutes les optimisations suivantes par factorisation des sous-matrices. L'algorithme de Loeffler est actuellement le plus efficace ayant été publié (avec 11 multiplications pour la même DCT à 8 points au lieu de 16 avec l'algorithme de Chen, toutefois certains coefficients subissent deux multiplications et cela pourrait rendre l'algorithme moins stable). Il a même été démontré que le nombre minimum théorique de multiplications nécessaires pour la transformation DCT à 8 points ne peut être inférieur à 11, ce qui fait que les algorithmes à 11 multiplications scalaires sont optimums en matière de performance brute (ils se différencient seulement en termes de stabilité suivant l'ordre dans lequel les multiplications sont réalisées, et la précision dès lors nécessaire pour les produits intermédiaires).
Cependant l'algorithme de Loeffler regroupe 8 des 11 multiplications scalaires sur les sorties, ce qui permet de regrouper ces multiplications avec l'étape suivante de quantification (ce qui en fait tout l'intérêt) : pour une transformée 2D 8×8, il faut 8×11 multiplications pour la transformée des lignes, et seulement 8×3 multiplications pour les colonnes, soit un total de 112 multiplications (au lieu de 256 avec l'algorithme de Chen) si les 64 dernières multiplications scalaires sont effectuées avec la quantification. Plus de détails sont disponibles dans les normes de compression JPEG et MPEG.

### DCT-III

    $X_{k}={\frac {1}{2}}x_{0}+\sum _{n=1}^{N-1}{x_{n}\cos \left[{\frac {\pi }{N}}n\left(k+{\frac {1}{2}}\right)\right]}$
La DCT-III est la transformée inverse de la DCT-II. Elle est plus connue sous le nom de « DCT Inverse » et son acronyme (anglais) "IDCT".
De la même manière que pour la DCT-I, on peut rendre cette transformation orthogonale en multipliant x$_0$ par √2. Cette forme normalisée est très utilisée en pratique mais casse la correspondance avec la DFT.

#### Exemple pour N = 8

En reprenant l'exemple ci-dessus, on obtient une décomposition inverse (ici orthogonalisée) également utilisée dans l'algorithme de Chen :

##### IDCT(8) (méthode de calcul rapide)

    ${\begin{pmatrix}x_{0}\\x_{1}\\x_{2}\\x_{3}\end{pmatrix}}={\begin{bmatrix}C_{4}&C_{2}&C_{4}&C_{6}\\C_{4}&C_{6}&-C_{4}&-C_{2}\\C_{4}&-C_{6}&-C_{4}&C_{2}\\C_{4}&-C_{2}&C_{4}&-C_{6}\end{bmatrix}}.{\begin{pmatrix}X_{0}\\X_{2}\\X_{4}\\X_{6}\end{pmatrix}}+{\begin{bmatrix}C_{1}&C_{3}&C_{5}&C_{7}\\C_{3}&-C_{7}&-C_{1}&-C_{5}\\C_{5}&-C_{1}&C_{7}&C_{3}\\C_{7}&-C_{5}&C_{3}&-C_{1}\end{bmatrix}}.{\begin{pmatrix}X_{1}\\X_{3}\\X_{5}\\X_{7}\end{pmatrix}}$
    ${\begin{pmatrix}x_{7}\\x_{6}\\x_{5}\\x_{4}\end{pmatrix}}={\begin{bmatrix}C_{4}&C_{2}&C_{4}&C_{6}\\C_{4}&C_{6}&-C_{4}&-C_{2}\\C_{4}&-C_{6}&-C_{4}&C_{2}\\C_{4}&-C_{2}&C_{4}&-C_{6}\end{bmatrix}}.{\begin{pmatrix}X_{0}\\X_{2}\\X_{4}\\X_{6}\end{pmatrix}}-{\begin{bmatrix}C_{1}&C_{3}&C_{5}&C_{7}\\C_{3}&-C_{7}&-C_{1}&-C_{5}\\C_{5}&-C_{1}&C_{7}&C_{3}\\C_{7}&-C_{5}&C_{3}&-C_{1}\end{bmatrix}}.{\begin{pmatrix}X_{1}\\X_{3}\\X_{5}\\X_{7}\end{pmatrix}}$
Là aussi, l'évaluation scalaire de ce produit matriciel contient de nombreuses sous-expressions communes permettant des réductions du nombre de multiplications scalaires nécessaires.

### DCT-IV

    $X_{k}=\sum _{n=0}^{N-1}{x_{n}\cos \left[{\frac {\pi }{N}}\left(n+{\frac {1}{2}}\right)\left(k+{\frac {1}{2}}\right)\right]}$
La DCT-IV est une matrice orthogonale.