diff --git a/455-Codage_Sources/Cours/0/1.png b/455-Codage_Sources/Cours/0/1.png new file mode 100644 index 0000000..4d7f810 Binary files /dev/null and b/455-Codage_Sources/Cours/0/1.png differ diff --git a/455-Codage_Sources/Cours/0/2.png b/455-Codage_Sources/Cours/0/2.png new file mode 100644 index 0000000..a38b8a8 Binary files /dev/null and b/455-Codage_Sources/Cours/0/2.png differ diff --git a/455-Codage_Sources/Cours/0/3.png b/455-Codage_Sources/Cours/0/3.png new file mode 100644 index 0000000..e3564e2 Binary files /dev/null and b/455-Codage_Sources/Cours/0/3.png differ diff --git a/455-Codage_Sources/Cours/2/1/1.png b/455-Codage_Sources/Cours/2/1/1.png new file mode 100644 index 0000000..911347d Binary files /dev/null and b/455-Codage_Sources/Cours/2/1/1.png differ diff --git a/455-Codage_Sources/Cours/2/1/2.png b/455-Codage_Sources/Cours/2/1/2.png new file mode 100644 index 0000000..7d4d899 Binary files /dev/null and b/455-Codage_Sources/Cours/2/1/2.png differ diff --git a/455-Codage_Sources/Cours/2/1/3.png b/455-Codage_Sources/Cours/2/1/3.png new file mode 100644 index 0000000..a6ff19d Binary files /dev/null and b/455-Codage_Sources/Cours/2/1/3.png differ diff --git a/455-Codage_Sources/Cours/2/2/1.png b/455-Codage_Sources/Cours/2/2/1.png new file mode 100644 index 0000000..0f6e366 Binary files /dev/null and b/455-Codage_Sources/Cours/2/2/1.png differ diff --git a/455-Codage_Sources/Cours/2/2/2.png b/455-Codage_Sources/Cours/2/2/2.png new file mode 100644 index 0000000..83e8ac7 Binary files /dev/null and b/455-Codage_Sources/Cours/2/2/2.png differ diff --git a/455-Codage_Sources/Cours/2/2/3.png b/455-Codage_Sources/Cours/2/2/3.png new file mode 100644 index 0000000..e792336 Binary files /dev/null and b/455-Codage_Sources/Cours/2/2/3.png differ diff --git a/455-Codage_Sources/Cours/2/3/1.png b/455-Codage_Sources/Cours/2/3/1.png new file mode 100644 index 0000000..839c4f5 Binary files /dev/null and b/455-Codage_Sources/Cours/2/3/1.png differ diff --git a/455-Codage_Sources/Cours/2/3/2.png b/455-Codage_Sources/Cours/2/3/2.png new file mode 100644 index 0000000..7e3db13 Binary files /dev/null and b/455-Codage_Sources/Cours/2/3/2.png differ diff --git a/455-Codage_Sources/Cours/3/1/1.png b/455-Codage_Sources/Cours/3/1/1.png new file mode 100644 index 0000000..0fce847 Binary files /dev/null and b/455-Codage_Sources/Cours/3/1/1.png differ diff --git a/455-Codage_Sources/Cours/3/2/1.png b/455-Codage_Sources/Cours/3/2/1.png new file mode 100644 index 0000000..2066fdf Binary files /dev/null and b/455-Codage_Sources/Cours/3/2/1.png differ diff --git a/455-Codage_Sources/Cours/3/2/2.png b/455-Codage_Sources/Cours/3/2/2.png new file mode 100644 index 0000000..f271866 Binary files /dev/null and b/455-Codage_Sources/Cours/3/2/2.png differ diff --git a/455-Codage_Sources/Cours/chap0.tex b/455-Codage_Sources/Cours/chap0.tex new file mode 100644 index 0000000..350ed66 --- /dev/null +++ b/455-Codage_Sources/Cours/chap0.tex @@ -0,0 +1,167 @@ +\documentclass[main.tex]{subfiles} + +\begin{document} + +\paragraph{Pourquoi a-t-on besoin du codage de source ?} + +Un téléviseur HD affiche des images de 1920 x 1080 pixels. Chaque pixel est formé d'une combinaison de 3 couleurs RGB, chacune des couleurs étant codée par un nombre sur 8, 10 ou 12 bits. À raison de 25, 50 ou 60 images par seconde, le débit nécessaire est R= 1920 x 1080 x 3 x 8 x 25 = 1,22 Gbits par seconde. \\ + +En 4G, le débit maximal est de 100 Mbits par seconde (quand on est seul dans la zone) et en ADSL, il est de 20 Mbits par seconde. + +Il faut compresser les données avec un facteur 100 au minimum.\\ + +\emph{"Le taux minimum c'est 25 images par seconde, pour pas avoir l'impression de regarder un dessin animé japonais."} +\emph{"Des émissions mettent volontairement moins pour qu'on ait l'impression d'avoir trop bu en regardant la télé."}\\ + +\paragraph{Comment faire de la compression?} Quelles propriétés du signal vidéo peut-on utiliser pour réaliser de la compression? +On utilise la redondance statistique. Par exemple, pour la vision (ou tech 3D) on utilise les petites différences pour obtenir la profondeur. De la même façon, en stéréo on a deux micros pour l'enregistrement. C'est la ressemblance entre les deux signaux qui nous intéresse ici pour effectuer la compression.\\ + +La compression est possible à cause de plusieurs propriétés: +\begin{itemize} +\item La corrélation temporelle (ressemblance entre deux image successives d'une vidéo ou échantillons audio successifs). +\item La corrélation spatiale (le fait que certaines zones présentes sont relativement uniforme, ressemblance entre deux pixels voisins). +\item La corrélation spectrale (ressemblance entre les composantes R, G et B d'une image). +\item Les propriétés statistiques du signal (un texte contient plus de "e" que de "z" en général). +\end{itemize} + +\paragraph{Exemple d'une chaîne de compression vidéo} +On considère une vidéo mono-vue (pas en 3D) codée en niveaux de gris.\\ + +\underline{Transformation}: On applique une transformation à l'image, c'est à dire que l'on cherche à exprimer les blocs de l'image dans une base autre que la base canonique, pour permettre une compression plus facile.\\ +Par exemple : + +$\begin{pmatrix}1&1\\1&1\end{pmatrix}$ permet de décrire les zones constantes + +$\begin{pmatrix}1&1\\-1&-1\end{pmatrix}$ pour décrire les variations verticales, et + +$\begin{pmatrix}1&-1\\1&-1\end{pmatrix}$ pour une variation horizontale.\\ + +\underline{Quantification}: Elle permet de représenter les pixels transformés sur un nombre limité de bits (et d'en mettre plein à 0). Cette opération est irréversible.\\ + +\underline{Codeur entropique}: Il exploite la redondance statistique des coefficients quantifiés (il prend les successions et les compresse). On ne peut pas encore envoyer les données sur le réseaux, il faut appliquer un standard de compression.\\ + +\underline{Standard de compression}: Détermine la manière dont les bits en sortie sont organisés. (constitue les paquets, les numérote etc.)\\ + + +On peut alors transmettre l'image. Une fois récupérée, on applique un décodage entropique, puis un désindexation et enfin une transformation inverse.\\ + +La désindexation permet d'obtenir à partir d'un coefficient quantifié, un nombre qui a la même dynamique qu'un coefficient transformé.(exemple: permet de retrouver un nombre à la bonne échelle, même si ce nombre n'est pas exactement le même). +\begin{figure}[H] + \centering +\begin{tikzpicture} + \sbEntree{E} + \sbBlocL{t}{Transformée}{E} + \sbBlocL{q}{Quantificateur}{t} + \sbBlocL{c}{Codeur entropique}{q} + \sbSortie{S}{c} +\end{tikzpicture} +\begin{figure}[H] + \centering + + \caption{utilisation d'un décodeur local} +\end{figure} +\caption{Chaine de compression} +\end{figure} + + +\begin{figure}[H] + \centering +\begin{tikzpicture} + \sbEntree{E} + \sbBlocL{d}{decodeur entropique}{E} + \sbBlocL{D}{Désindexeur}{d} + \sbBlocL{t}{Transformée inverse}{D} + \sbSortie{S}{t} +\end{tikzpicture} +\caption{Chaine de décompression} +\end{figure} + +\paragraph{Comment transmettre une vidéo?} appliquer ce shcéma (JPEG) à chaque image et transmettre? non, trop lourd. +On peut comparer l'image 2 à l'image précédente non pas 1 mais $\hat{1}$ l'estimée de l'image reçue par le récepteur, et l'on envoie la différence. Puis pour envoyer l'image 3, on estime la différence précédente, on y ajoute l'image estimée de la première image et on calcule la différence, que l'on envoie au travers des différentes transformations. Et ainsi de suite.\\ + +De ce fait, au niveau du récepteur on mémorise l'image précédente à laquelle on ajoute les différences.\\ + +Cette structure de codeur était celle des premiers codeurs vidéo (H261, MPEPZ). H265 encore utilisé a aussi cette structure.\\ + +\noindent Notations :\\ +$I_n$: image numéro n\\ +$\hat{I_n}$ : image numéro n au décodeur\\ +$f(\hat{I_n}) = \tilde{I_{n+1}}$: image n+1 prédite\\ + + +On va étudier deux cas : +\begin{enumerate} +\item pas de décodeur au niveau du codeur mais on a un prédicteur. +\begin{align*} +\tilde{I_{n+1}} &= T^{-1}(Q^{-1}(Q(T(I_{n+1} - f(I_n))))) + \tilde{I_{n+1}}\\ +&= I_{n+1} - f(I_n) + E_{n+1} + \tilde{I_{n+1}} \text{ avec, E le bruit} +\end{align*} +$f(I_n)$ et $\tilde{I_{n+1}}$ ne se compensent pas totalement. +\bigbreak + +\item On fait la prédiction a partir des images codées précédemment. +\begin{align*} +\tilde{I_{n+1}} &= T^{-1}(Q^{-1}(Q(T(I_{n+1} - f(\hat{I_n}))))) + f(\hat{I_n}\\ +&= I_{n+1} - f(\hat{I_n}) + E_n +f(\hat{I_n})\\ +&= I_{n+1} + E_n +\end{align*} +L'utilisation d'un décodeur au niveau du codeur (décodeur local) permet d'éviter une accumulation des erreurs au niveau des images décodées. +\end{enumerate} +\begin{figure}[H] + \centering + \begin{tikzpicture}[thick,scale=0.9, every node/.style={scale=0.9}] + \sbEntree{E} + \node[above] at (E) {...$I_2,I_1$}; + \sbComp{a}{E} + \sbRelier{E}{a} + \sbBlocL[6]{c}{Transformée}{a} + \sbBlocL[6]{d}{Quantification}{c} + \sbBlocL[5]{e}{ + \begin{tabular}{c} + Codeur\\ entropique + \end{tabular}}{d} + \sbSortie{s}{e} + \sbRelier{e}{s} + \sbDecaleNoeudy[10]{d-e}{Ret} + \sbBlocr{D}{Désindéxation}{Ret} + \sbBlocrL{T}{ + \begin{tabular}{c} + Transformée\\inverse + \end{tabular}}{D} + \sbRelieryx{d-e}{D} + \sbCompSum[-6]{C1}{T}{+}{ }{ }{+} + \sbRelier{T}{C1} + \sbBlocrL{m}{Mémoire}{C1} + \sbRelierxy{m}{a} + \sbDecaleNoeudx[5]{m-a}{int} + \node[left] (is) at (m-a){}; + \node[left=0.5em] at (m-a) {$\hat{I_1}$}; + \node[right] (ie) at (int){}; + \draw[-] (is) to[spst] (ie); + \sbRelierxy{int}{C1} + \end{tikzpicture} + \caption{Utilisation d'un décodeur local} +\end{figure} + +\begin{figure}[H] + \centering + \begin{tikzpicture} + \sbEntree{E} + \sbBlocL{d}{\begin{tabular}{c} + decodeur \\entropique + \end{tabular}}{E} + \sbBlocL{D}{Désindexeur}{d} + \sbBlocL{t}{\begin{tabular}{c} + Transformée\\inverse + \end{tabular}}{D} + \sbCompSum[8]{c}{t}{ }{+}{+}{ } + \sbRelier{t}{c} + \node[below=4em,rectangle,draw](m) at (c) {Mémoire}; + \sbRelier{m}{c} + \sbSortie{S}{c} + \sbRelier[$\hat{I_2}\hat{I_1}$]{c}{S} + \end{tikzpicture} + \caption{Décodeur à mémoire} +\end{figure} + +\end{document} diff --git a/455-Codage_Sources/Cours/chap0_MAN.tex b/455-Codage_Sources/Cours/chap0_MAN.tex new file mode 100644 index 0000000..caf4ec0 --- /dev/null +++ b/455-Codage_Sources/Cours/chap0_MAN.tex @@ -0,0 +1,85 @@ +\documentclass[main.tex]{subfile} + +\lstset{language=Matlab} + +\begin{document} +\section{Rappels mathématiques pour le codage de source} + +\paragraph{Signaux et variables aléatoires} +Les signaux qu'on cherche à compresser (texte, échantillons de voix, musique, images, vidéo...) sont décrits comme des réalisations de suites de variables aléatoires.\\ + +Une variable aléatoire $X$ est décrite par son domaine $\X$, c'est-à-dire l'ensemble des valeurs que $X$ peut prendre (aussi appelé alphabet). + +$\X$ peut être à valeurs discrètes (par exemple singletons $\in\{0,1\}, \quad \{0,\dots 255\}$, ou triplets $\{(0,0,0)...(255,255,255)\}$ dans le cas de couleurs), ou à valeurs continues ($\in \R$, un intervalle $[a,b]\subset\R$) + +\section{Variables aléatoires discrètes} + +$X$ est en plus caractérisée par sa \emph{probability mass function} (loi de probabilité) $p_i = Pr(X=i), \quad i \in \X$ + +Les $p_i$ sont tels que : +\begin{itemize} +\item $p_i \geq 0, \quad \forall i \in \X$ +\item $\sum_{i \in \X}p_i = 1$ +\end{itemize} + +\medskip + +\paragraph{Moyenne de $X$} (ou espérance) : $E(X)=\sum_{i \in \X} i p_i$ + +\begin{exemple} +$\X=\{1,2,3\}$ avec $p=1 = 0.5, p_2=0.25, p_3=0.25$. + +On a $E(X) = 1\times0.5 + 2\times0.25 + 3\times0.25 = 1.75$ +\end{exemple} + +\paragraph{Variance de X} : $V(x)=E[(X-E(X))^2] = \sum_{i\in\X} (i-E(x))^2p_i$ + +\begin{exemple}[(suite)] +$\X=\{1,2,3\}$ avec $p=1 = 0.5, p_2=0.25, p_3=0.25$. + +On a $V(x) = (1-1.75)^2\times0.5 + (2-1.75)^2\times0.25 + (3-1.75)^2\times0.25=0.69$ +\end{exemple} + +\paragraph{Écart-type de X} $ \sigma(X) = \sqrt{V(X)}$ + +\medskip +\begin{exemple}[Générer des réalisations de VA] +Génération d'une suite de réalisations d'une VA $X$ tel que $\X=\{0,1\}$ avec $p_0=0.9,\quad p_1=0.1$ + +\begin{lstlisting} +x=rand(1,10)>0.9 +% rand : générateur de loi uniforme +% randn : générateur de loi gaussienne +\end{lstlisting} + +\noindent Pour générer une suite de réalisations correspondant aux exemples précédents + +\begin{lstlisting} +x=rand(1,10) +y= (x<0.5) + 2*(x<0.75 & x>0.5) + 3*(x>0.75) +\end{lstlisting} +\end{exemple} + +\medskip +On considère deux variables aléatoires $X_1$ et $X_2$ d'alphabet $\X$. + +\paragraph{Indépendance} +$X_1$ et $X_2$ sont indépendantes si et seulement si \[Pr(X_1=i,X_2=j)=Pr(X_1=i).Pr(X_2=j)\] + +Ainsi $E(X_1X_2)=E(X_1).E(X_2)$\\ + +Dans le cas général, +\[Pr(X_1=i,X_2=j)=Pr(X_1=i / X_2=j).Pr(X_2=j)=Pr(X_2=j / X_1 =i).Pr(X_1=i)\] + +Si $X_1$ et $X_2$ sont indépendants $Pr(X_1=i/X_2=j)=Pr(X_1=i)$ pour tous $i,j$ + +$\sum_{j\in\X}Pr(X_2=j/X_1=i)=1$ mais $\sum_{i\in\X} Pr(X_2=j/X_1=i)= ?$ + +\paragraph{Marginalisation} + +On suppose connaître $Pr(X_2=j/X_1=i)$ et $Pr(X_1=i)$. + +D'après la règle du produit, + +\[Pr(X_2=j)=\sum_{i\in\X} Pr(X_2=j,X_1=i) = \sum_{i\in\X} Pr(X_2=j/X_i=i).Pr(X_1=i)\] +\end{document} diff --git a/455-Codage_Sources/Cours/chap1.tex b/455-Codage_Sources/Cours/chap1.tex new file mode 100644 index 0000000..afd686b --- /dev/null +++ b/455-Codage_Sources/Cours/chap1.tex @@ -0,0 +1,504 @@ +\documentclass[main.tex]{subfiles} + +% Corrigé jusqu'à II.2 inclus. A 03/03/15 +% Corrigé en entier. A 22/04/15 + +\begin{document} +\newcommand{\X}{\mathcal{X}} +\section{Modèles de sources} + +On s'intéresse à la compression sans perte d'un message constitué de symboles appartenant à un alphabet fini $\X$.\\ + +Ces symboles sont: +\begin{itemize} +\item les caractères d'un texte +\item la sortie du quantificateur d'un codeur vidéo. +\item ... +\end{itemize} +\bigbreak +On fait l'hypothèse que le message est une réalisation d'une suite de variables aléatoires $X_1$,...,$X_n$.\\ + +\subsection{Modèle stationnaire sans mémoire} + +C'est le modèle le plus simple, on suppose que: +\begin{itemize} +\item les VA $x_i$ sont distribuées de la même manière, quelque soit $n$ (stationnarité). +\item les VA sont indépendantes entre elles. +\end{itemize} +\smallbreak +C'est un mauvais modèle, mais il est simple. + +Pour décrire ce modèle, il suffit de disposer de $p_i = Pr(X_n=i), \quad \forall i \in \X$.\\ + +\begin{exemple} +On considère une source binaire $X$, à valeurs dans $\X = \{0,1\}$, et + +\[p_0 = Pr(X=0),\quad p_1 = Pr(X=1) = 1 - p_0\] +\end{exemple} + +\begin{defin}[Information] +L'information associée à chaque symbole de la VA X est \[I(i) = -log_2 p_i \text{ (en bits/symbole)} \] +\end{defin} + +\begin{rem} +C'est une fonction décroissante sur ]0,1] qui s'annule en 1. En effet, l'information associée à quelque chose de certain ($p_i=1$) est nulle, alors que celle associée à quelque chose de peu probable ($p_i\rightarrow 0$) est très grande $(\rightarrow \infty)$. +\end{rem} + +\begin{defin}[Entropie] +L'information moyenne associé aux symboles de $X$ ou à $X$ est appelée entropie de la source $X$. + \[H(X) = -\sum_{i\in\X}p_i log_2(p_i) = \sum_{i\in\X}p_i log_2(\frac{1}{p_i})\] +\end{defin} + + +On rappelle que $log_2(2^n)=n$. + +\begin{exemple} + Pour la source binaire: + + si $p_0 = 0.5$ et $p_1 = 0.5$ alors $H(X) = 1$ bit/symbole. + + si $p_0 = 0.01$ et $p_1 = 0.99$ alors $H(X) = 0.08$ bit/symbole. +\end{exemple} + +\begin{prop} +Propriété de l'entropie\\ + +On considère deux VA $X_1$ et $X_2$ indépendantes et identiquement distribuées (iid). +\begin{align*} +H(X_1,X_2) &= - \sum_{i\in \X, j \in \X} Pr(X_1=i,X_2=j)log_2(Pr(X_1=i,X_2=j))\\ +&= H(X_1)+H(X_2)\\ +&= 2H(X_1) +\end{align*} +Plus généralement, si on a N VA iid alors $H(X_1,...,X_N) = N(H(X_1))$.\\ +Et on a $\boxed{H(X) \leq log_2|\X|}$ (nombre d'élément de $\X$). +\end{prop} + +\subsection{Modèle de Markov d'ordre 1} + +\noindent Dans ce modèle, la probabilité d'apparition du symbole $n$ ne dépend que de la réalisation du symbole $n-1$. \\ + +Les probabilités de transition vérifient donc : +\[Pr(X_n=a_n|X_{n-1} = a_{n-1},X_{n-2} = a_{n-2},...,X_{1} = a_{1}) = Pr(X_n = a_n |X_{n-1} = a_{n-1})\] + +On considère des sources de Markov d'ordre 1 stationnaires, donc: +\[Pr(X_n=a_n|X_{n-1} = a_{n-1}) = Pr(X_{n-1} = a_n | X_{n-2} = a_{n-1}), \forall n\] + +Pour décrire une source de Markov d'ordre 1 stationnaire, il suffit de décrire ses probabilités de transition : +\[Pr(X_{n}=i|X_{n-1}=j) = p_{i|j},\quad \forall i \in \X, \forall j \in \X\] + +\begin{exemple} +Comment estimer les probabilités de transition ? +on a la séquence : a a b b a c a b b a\\ +\paragraph{Modèle sans mémoire} on estime $\hat{p_a} = \frac{5}{10}$, $\hat{p_b} = \frac{4}{10}$ et $\hat{p_c} = \frac{1}{10}$\\ + +\paragraph{Modèle de Markov d'ordre 1} +\begin{align*} +Pr(X_{n}=i,X_{n-1}=j) &= Pr(X_{n}=i|X_{n-2}=j)Pr(X_{n-1}=j)\\ +&= \frac{Pr(X_{n}=i,X_{n-2}=j)}{Pr(X_{n-1}=j)} +\end{align*} +Avec $j=a$, si $i=a$ alors \[Pr(X_n=a|X_{n-1}=a) = \frac{\text{nombre de paires aa}}{\text{nombre de paires débutant par a}}=\frac{1}{4}\] +si $i = b$ alors \[Pr(X_n=b|X_{n-1}=a) = \frac{\text{nombre de paires ab}}{\text{nombre de paires débutant par a}}=\frac{2}{4}\] + +\end{exemple} + +On range ces probabilités de transition dans une matrice : +\[\underline{\underline{P}} = (p_{a_j|a_i})_{(i,j)} = \begin{pmatrix} +p_{a_1|a_1} & p_{a_2|a_1} & \dots & p_{a_j|a_1}\\ +p_{a_1|a_2} & p_{a_2|a_2} & \dots & p_{a_j|a_2}\\ +\vdots & & & \\ +p_{a_1|a_J} & p_{a_2|a_j} & \dots & p_{a_J|a_J}\\ +\end{pmatrix} \quad \text{avec $J = |\X|$ nombre d'éléments de $\X$}\] + + +\begin{exemple} +On considère une source de Markov binaire: +\[p_{0|0} = 0.9, \quad p_{1|0} = 0.1, \quad p_{0|1} = 0.3, \quad p_{1|1} = 0.7\] +On a donc : +\[\underline{\underline{P}} = \begin{pmatrix} +0.9&0.1\\0.3&0.7 +\end{pmatrix}\] +\end{exemple} + +Pour cette source de Markov, on peut être intéressé par les probabilités stationnaires $Pr(x_n=i)$ et on note : +\begin{align*} +\underline{\Pi} &= (Pr(X_n=a_1), \dots, Pr(X_n = a_J))\\ +&= (p_{a_1},...,p_{a_J}) +\end{align*} + +On peut montrer que $\underline{\Pi}$ satisfait : +\[\boxed{\underline{\Pi} = \underline{\Pi}\underline{\underline{P}}}\] + +\begin{rem} +On peut aussi voir ce résultat sous la forme plus courante $\underline{\Pi}^T = \underline{\underline{P}}^T \underline{\Pi}^T$. Ceci permet notamment de calculer $\underline{\Pi}$ s'il n'est pas donné, en cherchant un vecteur propre de $\underline{\underline{P}}^T$. +\end{rem} + +\paragraph{Entropie d'une source de Markov d'ordre 1} + +\begin{align*} +H(X) &= -\sum_{i \in \X}p_i\sum_{j \in \X}p_{i|j}log_2(p_{i|j})\\ +&= -\sum_{i \in \X}\sum_{j \in \X}p_{i,j}log_2(p_{i|j}) +\end{align*} +où $p_{i,j} = Pr(X_n = i, X_{n-1} = j)$\\ + +\underline{Remarque}: Avec un modèle de Markov, si on essaie de "créer" des mots lettre par lettre, plus on monte dans les ordres, plus la structure de la langue commence à apparaître. À partir de l'ordre 3, il apparaît des mots qui seraient potentiellement de la langue considérée. Ce modèle peut être adapté, comme par exemple pour le correcteur orthographique des téléphones.\\ + +L'idée générale de la compression d'une source de Markov est d'effectuer des prédictions pour avoir accès aux informations, de sorte qu'il ne reste à transmettre que ce que l'on ne peut pas prédire.\\ + +\newpage +\section{Codes} + +\subsection{Définitions et propriétés} +On considère une source $X$ à valeurs dans $\X = \{a_1,..a_J\}$. + +\begin{defin}[Code] +Un code est un ensemble binaire de $\{0,1\}^*$ (union de tous les ensembles $\{0,1\}^2 = \{00,11,01,10\}$ , $\{0,1\}^3 = ...$ ...). Un code est donc un sous-ensemble de $\{0,1\}^*$.\\ +\end{defin} + +\begin{defin}[Fonction de codage] +Une fonction de codage $c : \X \rightarrow C$ associe à chaque élément de $\X$, un élément de C.\\ +\end{defin} + +\begin{defin}[Longueur d'un mot de code] +La longueur d'un mot de code associé à $x \in \X$ est notée \[l(x) = l(c(x)) = \text{ nombre de bits de } c(x)\] +Pour une source sans mémoire avec $p_j = Pr(X=a_j)$. La longueur moyenne du code C associé à $\X$ est: +\[\overline{l} = \sum_{j=1}^J p_jl(a_j)\] +\end{defin} + +L'objectif du codage sans perte est de minimiser $\overline{l}$ tout en étant capable de décoder le code sans ambiguïté. + + +\begin{defin} +Un code $C$ (et sa fonction de codage associée $c$) est dit non singulier si: +\[x_1 \neq x_2 \Rightarrow c(x_1) \neq c(x_2) \] +\end{defin} + + +\begin{defin} +L'extension $C^*$ d'un code $C$ est l'ensemble de toutes les suites, finies et infinies, de mots provenant du code $C$. + +\begin{exemple} +Si C $=\{0,10\}$ alors $\{C^*=\{0,10,00,010,100,000,1010,...\}$ +\end{exemple} +\end{defin} + +\begin{prop} +Un code C est décodable de façon unique si son extension $C^*$ est non singulière.\\ +Si on prend deux successions de symboles dans $\X$: +\[x_1x_2...x_N \neq x_1'x_2'...x_{N'} \Rightarrow c(x_1,...x_N)=c(x_1)c(x_2)...c(x_N) \neq c(x_1')...c(x_N')\] +\end{prop} + +\begin{defin} +Un code C est un code préfixe si aucun mot de code n'est le début d'un autre mot de code.\\ + +\begin{exemple} +$\X = \{1,2,3,4\}$\\ + +\begin{center} +\begin{tabular}{|c||c|c|c|c|} +\hline +X & Singulier & Non singulier & Décodable de manière unique & Préfixe \\ +\hline +\hline +1 & 0 & 0 & 10 & 0 \\ +\hline +2 & 0 & 010 & 00 & 10 \\ +\hline +3 & 0 & 01 & 11 & 110 \\ +\hline +4 & 0 & 10 & 110 & 111 \\ +\hline +\end{tabular} +\end{center} + +\end{exemple} +\end{defin} + +\begin{rem} +"Décodable de manière unique" implique "Non singulier". +\end{rem} + +\subsection{Inégalités} + +\paragraph{Inégalité de Kraft} +Un code binaire préfixe peut exister à condition que ses longueurs de mot de code $l_1,...l_J$ satisfassent: +\[\sum_{j=1}^J2^{-l_j} \leq 1 \] + + +\begin{proof} Condition nécessaire : \\ +Soit $l_{max}$ la plus grande des longueurs. +Le nombre de feuilles à la profondeur $l_{max}$ que peut porter un arbre dont la racine est à la profondeur $l_j$ est $2^{l_{max}-l_j}$.\\ + +Le nombre maximum de feuilles d'un arbre de profondeur $l_{max}$ est $2^{l_{max}}$.\\ + +On a $\sum_{j=1}^J2^{l_{max}-l_j} \leq 2^{l_{max}}$ d'où le résultat.\\ + +Condition suffisante : ? +\end{proof} + +\paragraph{Inégalité de Kraft-McMillan} +Un code binaire décodable de manière unique peut exister à condition que ses longueurs de mot de code $l_1,...l_J$ satisfassent: + \[\sum_{j=1}^J2^{-l_j} \leq 1 \] + + +\begin{rem} +Attention, ce sont des théorèmes d'existence : ils ne peuvent pas servir à vérifier qu'un code est préfixe ou décodable de manière unique. + +\begin{exemple} +Le code $\{1,00,10\}$ n'est pas préfixe, pourtant on a $\sum 2^{-l_i} = 2^{-1} + 2^{-2} + 2^{-2} = 1$. On sait seulement qu'il existe un code préfixe dont les mots de code ont ces longueurs. +\end{exemple} +\end{rem} + +\begin{rem} +On sait que "préfixe" implique "décodable de manière unique". En revanche, si un code est décodable de manière unique, on peut seulement dire qu'il existe un code préfixe équivalent, sans qu'il soit le même. +\end{rem} + +\paragraph{Corollaire} Pour qu'un code binaire soit préfixe (ou décodable de manière uniquer), \emph{il faut} que ses longueurs de mot de code $l_1,...l_J$ satisfassent: +\[\sum_{j=1}^J2^{-l_j} \leq 1 \] + + \newpage +\subsection{Code de longueur minimale} +On considère une source $X$ sans mémoire d'alphabet $\X = \{a_1,...,a_J\}$ et de probabilités $p_j = Pr(X=a_j)$. +On souhaite construire un code préfixe de longueur moyenne minimale associé à $X$.\\ + +Si on note $l_1,...,l_J$ les longueurs des mots de codes associés à $a_1,...a_J$ la longueur moyenne sera: +\[\overline{l}=\sum_{j=1}^Jp_jl_j\] + +On cherche à minimiser $\overline{l}$ en s'assurant que le code reste préfixe, c'est à dire que: + \[\sum_{j=1}^J2^{-l_j} \leq 1 \text{ ou } \sum_{j=1}^J2^{-l_j} - 1 \leq 0\] + +C'est un problème d'optimisation sans contrainte que l'on résout en introduisant le Lagrangien: + \[L(l_1,...l_J,\mu) = \sum_{j=1}^Jp_jl_j + \mu\times (\sum_{j=1}^J2^{-l_j} - 1) \text{ avec $\mu$ le multiplicateur de Lagrange}\] + +Une condition nécessaire d'optimisation est que: + \[\left\{ \begin{matrix} + \frac{\partial L}{\partial l_j}=0 & \forall j=1,...,J\\ + \frac{\partial L}{\partial \mu} = 0 + \end{matrix}\right.\] + + On a donc: + \[ + \begin{cases} + \frac{\partial L}{\partial \mu} & = \sum_{j=1}^J2^{-l_j} - 1 = 0 \\ + \frac{\partial L}{\partial l_j} & = p_j-\mu. 2^{-l_j}.\ln2 = 0 \text{ , }\forall j=1,...,J + \end{cases} +\] + + En sommant ces égalités et en injectant l'égalité précédente de Kraft, on obtient: + \[\mu = \frac{1}{ln2}\] + + En remplaçant dans $p_j-\mu. \ln2. 2^{-l_j} = 0$, et en passant au log en base 2: + \[\boxed{l_j = -log_2p_j}\] + \bigbreak + \bigbreak + Pour ce choix de longueurs de mots de code, on obtient: + \[ \boxed{ \overline{l} = \sum_{j=1}^J p_j(-log_2p_j) = H(x)}\] + Le meilleur code préfixe a une longueur moyenne au minimum égale à l'entropie de la source.\\ + + \begin{rem} + L'entropie (avec une source sans mémoire) donne une borne supérieure de la quantité d'information réelle contenue dans un message. Dans le cas d'un texte, l'entropie au sens d'une source de Makorv diminue quand on augmente l'ordre, jusqu'à se stabiliser au bout d'un certain ordre. + \end{rem} + +\newpage +\subsection{Codage de Huffmann} + +On considère une source $X$ à valeurs dans $\X$, de probabilités associées $p_i=Pr(X=a_i)$, pour $a_i\in\X$. + +\paragraph{Code préfixe à longueur minimale} +Pour qu'un code à longueur variable préfixe $C$ de longueurs de mots de code $l_1,...,l_j$ soit un code de Huffmann, il faut que : +\begin{itemize} +\item $p_i \leq p_j \Rightarrow l_i \geq l_j, \forall i,j$ +\item les deux mots de codes associés aux symboles les moins probables aient la même longueur +\item parmi tous les mots de code de longueur maximale, deux d'entre eux ne diffèrent que par le dernier bit. +\end{itemize} + +\paragraph{Principe d'un code de Huffmann} +À partir de ces propriétés, on peut fabriquer un code de Huffmann. + +Initialement, on considère une source $X^{(0)}$ à $J$ symboles $\X=\{a_1,\dots a_J\}$ + +\begin{enumerate} +\item On identifie les deux symboles $a_i^{(0)}$ et $a_j^{(0)}$ les moins probables, avec les probabilités associées $p_i^{(0)}$ et $p_j^{(0)}$ +\item On fabrique une source fictive $X^{(1)}$ émettant tous les symboles de $\X$ sauf $a_i^{(0)}$ et $a_j^{(0)}$, remplacé par le symbole fictif $a_{ij}^{(0)}$ de probabilité $p_i^{(0)}+p_j^{(0)}$. + +$\X^{(1)}$ comporte $J-1$ éléments. + +\item On répète 1 et 2 jusqu'à ce qu'il n'y ait plus que deux symboles. +\end{enumerate} + +Au bout de $J-2$ itérations, il reste deux symboles $\X^{(J-2)} = \{a_1^{(J-2)},a_2^{(J-1)}\}$. Le premier est identifié avec un 0, le second avec un 1.\\ + +Si $a_1^{(J-2)}$ est un symbole fictif résultant du regroupement de deux symboles $a_1^{(J-3)}$ et $a_2^{(J-3)}$ alors le code associé à ces deux symboles est obtenu en rajoutant 0 ou 1 au code associé à $a_1^{(J-2)}$.\\ + +Plus généralement, si $\underline{C}$ est le code associé au symbole fictif $a_i^{k)}$ résultant du regroupement de $a_i^{(k-1)}$ et $a_j^{(k-1)}$, alors le code de $a_i^{(k-1)}$ sera $\underline{C} 0$ et le code de $a_j^{(k-1)}$ sera $\underline{C} 1$.\\ + +\paragraph{Propriétés} +On peut montrer que la longueur moyenne $\overline{l}$ d'un code de Huffmann associé à une source satisfait \[ H(x) \leq \overline{l} \leq H(X) +1 \] + +On peut obtenir des codes plus performants en codant des paires de symboles, des triplets... des N-uplets de symboles. Avec ce type de technique, la longueur moyenne $\overline{l}$ par symbole de la source initiale satisfait : \[H(X) \leq \overline{l} \leq H(X)+1 \] + +L'inconvénient est la taille de la table de Huffmann à gérer. + +\newpage +\subsection{Codage arithmétique} + +On considère une source binaire $X$ avec $p_0=Pr(X=0)$ et $p_i=Pr(X=i)$. + +Cette source génère un message $x_{1:N}$ de longueur $N$. + + +On va associer un code $\underline{c}(x_{1:N})$ à $x_{1:N}$ qui sera un nombre dans l'intervalle $[0,1[$. + +On essaie de représenter $\c(x_{1:N})$ avec peu de bits si $x_{1:N}$ est très probable et avec plus de bits si $x_{1:N}$ est moins probable. + +\subsubsection{Algorithme de codage arithmétique (codage d'Elias)} + +\paragraph{Initialisation} $l_0=0, \quad h_1 = 1,\quad n=1$ + +\paragraph{Étapes} +\begin{enumerate} +\item Si $x_n=0$ alors $l_n=l_{n-1}$ et $h_n=l_{n-1}+(h_{n-1}-l_{n-1})p_0$ +\item Si $x_n=1$ alors $l_n=l_{n-1}+(h_{n-1}-l_{n-1})p_0$ et $h_n=h_{n-1}$ +\item $n = n+1$ +\item Si $n\leq N$, aller en 1. +\item On a $h_N-l_N=p(x_{1:N})$ +\end{enumerate} + +On pose $\mu(x_{1:N}) = \frac{l_N+h_N}{2} \text{ et } \lambda(x_{1:N}) = \lceil - \log_2(p(x_{1:N})) \rceil + 1$ + +\[ \overline{c}(x_{1:N}) = \lfloor \mu(x_{1:N}) \rfloor _{\lambda(x_{1:N})} \] + +où $\lfloor a \rfloor _{\lambda}$ est la représentation binaire de $a$ tronquée à $\lambda$ bits. (Exemple : $\lfloor 0,1011 \rfloor _2 = 0,10$)\\ + +Il faut montrer que $c(x_{1:N}) \in [l_N,h_N[$ (et qu'alors on pourra décoder), et que cette procédure de codage est efficace. \\ + + + +\begin{itemize} +\item On sait que $c(x_{1:N}) \leq \mu(x_{1:N})$ et on veut montrer que $\mu(x_{1:N})-c(x_{1:N}) \leq \frac{h_N-l_N}{2}$.\\ + +Avec par exemple +$\mu(x_{1:N}) = 0,101xxx$ et $c(x_{1:N})=0,101$, alors +\[ \mu(x_{1:N}) - c(x_{1:N}) = 0,000xxx \leq \sum_{i=4}^6 2^{-i} \] + + +Ainsi dans le cas général, +\[ \mu(x_{1:N}) - c(x_{1:N}) \leq \sum_{i=\lambda(x_{1:N})+1}^{+\infty} 2 ^{-i} = 2^{-\lambda(x_{1:N})} \] + +Or, on a $\lambda(x_{1:N}) = -\lceil \log_2(p(x_{1:N})) \rceil + 1$ +\[ +\begin{array}{ccccc} +- \log_2(p(x_{1:N})) + 1 & \leq & \lambda(x_{1:N}) & < & -\log_2(p(x_{1:N})) + 2 \\ +\log_2(p(x_{1:N})) - 1 & \geq & -\lambda(x_{1:N}) & > & \log_2(p(x_{1:N})) - 2 \\ +2^{\log_2(p(x_{1:N})) - 1} & \geq & 2^{-\lambda(x_{1:N})} & > & 2^{\log_2(p(x_{1:N})) - 2} \\ +\end{array} +\] +\[ \frac{p(x_{1:N})}{2} \geq 2^{-l(x_{1:N})} \] + +Ainsi, $\mu(x_{1:N}) - c(x_{1:N}) \leq 2^{-\lambda(x_{1:N})} \leq \frac{p(x_{1:N})}{2} = \frac{h_N-l_N}{2}$ donc $c(x_{1:N}) \in [l_N,h_N[$ (donc on pourra décoder). + +\newpage +\item L'efficacité du codage est montrée en calculant la longueur moyenne du code obtenu : +\[ \overline{l} = \sum_{x_{1:N}\in\X^N} p(x_{1:N}) \lambda(x_{1:N}) \] + +En utilisant le premier encadrement de $\lambda(x_{1:N})$, alors +\[ \begin{array}{ccccc} +- \sum_{x_{1:N}} p(x_{1:N})( \log_2(p(x_{1:N}))-1) & \leq & \overline{l} & < & -\sum_{x_{1:N}} p(x_{1:N})(\log_2(p(x_{1:N}))-2) \\ +NH(X) + 1 & \leq & \overline{l} & < & NH(X) + 2 +\end{array} +\] + +Cette procédure est efficace pour $N\to +\infty$, avec l'$\infty$ petit. Par exemple, pour $N=100$, alors la longueur moyenne sera proche à $1\%$ de l'entropie. +\end{itemize} + +\paragraph{Décodage} +On part de $c(x_{1:N})$, on réalise le découpage de $[0,1[$ suivant les probabilités d'apparition de 0 et de 1. À chaque étape, l'intervalle auquel appartient $c(x_{1:N})$ permet de déterminer le bit codé.\\ + +\paragraph{Réalisation pratique} +En pratique, le codage utilise l'intervalle $[0,2^p[$ où $p$ désigne la précision du codeur arithmétique. (pour le codage H264/AVC, on a $p=9$). + +On réalise des homothéties de centre 0, de rapport $2^p$ ou $2^{p-1}$ avec ou sans émission de bits. + +On estime les probabilités d'apparition des bits en parallèle du codage au codeur et au décodeur, et on modifie la façon de découper les intervalles en fonction de ces probabilités d'apparition estimées. + +On obtient alors un CABAC : Context Adaptative Binary Arithmetic Coder. + +\begin{rem} +Si on a plusieurs symboles à coder (A,B,C), on pourrait faire un codeur arithmétique ternaire, mais on préfaire binariser les données (A=00,B=01,C=10) et utiliser un codeur arithmétique binaire, qui est plus pratique pour les remises à l'échelle. +\end{rem} + +\newpage +\subsection{Code de Lempel-Ziv-Welch} + +\paragraph{Idée} +Avant l'algorithme arithmétique adaptatif, il fallait avoir les probabilités d'apparition des symboles (Huffmann, codage arithmétique,...). Le code LZW permet de faire une compression sans passer par la phase d'estimation des probabilités des symboles. Par exemple pour un texte, l'alphabet est gros, et le codeur arithmétique ne fonctionne pas très bien pour les gros alphabets, car il utilise d'abord une phase de binarisation.\\ + +\subsubsection{Codage} +Le codage de LZW est une variante des codes LZ77 et LZ78 qui utilise un dictionnaire et n'a pas besoin des probabilités de la source. C'est un cde universel.\\ + +On considère une source $X$ à valeurs dans $\X=\{a,b,c\}$. + +\begin{enumerate} +\item On initialise le dictionnaire de codage à l'aide des symboles de l'alphabet $\X$. +\item On cherche la plus longue suite de symboles restant à coder et appartenant au dictionnaire et on la code. +\item On rajoute cette suite suivi du premier symbole non codé $\omega$ au dictionnaire. +\item Aller en 2 tant qu'il existe des symboles à coder. +\end{enumerate} + +\begin{exemple} +On a à coder la séquence $aabababca$. + +\begin{center} +\begin{tabular}{|c|c|c|c|c|c|c|c|} +\hline +$a$ & $b$ & $c$ & $aa$ & $ab$ & $ba$ & $aba$ & $abac$ \\ +\hline +0 & 1 & 2 & 3 & 4 & 5 & 6 & 7\\ +\hline +\end{tabular} +\end{center} + +On code $a$, on émet 0 et on ajoute $aa$ au dictionnaire. + +On code $a$, on émet 0 et on ajoute $ab$ au dictionnaire. + +On code $b$, on émet 1 et on ajoute $ba$ au dictionnaire. + +On code $ab$, on émet 4 et on ajoute $aba$ au dictionnaire. + +On code $aba$, on émet 6 et on ajoute $abac$ au dictionnaire. + +On code $c$, on émet 2. + +\end{exemple} + +\subsubsection{Décodage} +Le décodage se fait +\begin{enumerate} +\item à partir du dictionnaire initial +\item à chaque décodage d'un mot, on rajoute ce mot suivi de $\omega$ au dictionnaire +\item $\omega$ n'est déterminé que si on a décodé le mot suivant +\end{enumerate} + +\begin{exemple} +On a à décoder 001462.\\ + +On décode $a$, on ajoute $a\omega$ (3) au dictionnaire. + +On décode $a$, donc le (3) est $aa$ et on ajoute $a\omega$ (4) au dictionnaire. + +On décode $b$, donc le (4) était $ab$ et on ajoute $b\omega$ (5) au dictionnaire. + +On décode $ab$, donc le (5) était $ba$ et on ajoute $ab\omega$ (6) au dictionnaire. + +On décode $ab\omega$, qui était en fait un $aba$ et on ajoute $aba\omega$ (7) au dictionnaire. + +On décode $c$ donc le (7) était $abac$. +\end{exemple} + +En pratique : +\begin{itemize} +\item les codes générés sont à nouveau codés à l'aide d'un code de Huffmann +\item la taille du dictionnaire est limitée, les mots les moins utilisés sont effacés. +\end{itemize} + +\end{document} diff --git a/455-Codage_Sources/Cours/chap2.tex b/455-Codage_Sources/Cours/chap2.tex new file mode 100644 index 0000000..7709a8d --- /dev/null +++ b/455-Codage_Sources/Cours/chap2.tex @@ -0,0 +1,304 @@ +\documentclass[main.tex]{subfiles} + +\begin{document} +\newcommand{\Y}{\mathcal{Y}} +\newcommand{\X}{\mathcal{X}} +\section{Introduction} +L'objectif de la quantification est de représenter les réalisations d'une source à valeurs dans un "grand" alphabet $\X$ , par exemple $\mathbb{R}$, à l'aide d'éléments d'un alphabet plus "petit" $\Y \in\N $.\\ + +Le quantificateur est donc défini par $q: \X \to \Y$. L'opération de quantification inverse, appelée aussi désindexation, est la fonction $q^{-1}: \Y \rightarrow \X$.\\ + +Remarque: l'opération de quantification n'est pas réversible donc $q^{-1}$ n'a pas de réalité, par contre, par abus de langage on note : $Q(x) = q^{-1}(q(x))$.\\ + +\begin{figure}[H] + \centering + \begin{tikzpicture} + \begin{axis} + [axis lines=middle, + xtick={-2,-1,1,2}, + ytick={-1.5,0.5,1.5}, + xlabel =$x$,ylabel=$Q(x)$, + ymin=-2,ymax=2 + ] + \addplot+[no marks,color=black] plot coordinates {(-2,-1.5) (-1,-1.5) (-1,-0.5) (0,-0.5) (0,0.5) (1,0.5) (1,1.5)(2,1.5)}; + \end{axis} + \end{tikzpicture} + \caption{Exemple de quantificateur} +\end{figure} +Un quantificateur est défini par des intervalles de quantification $b_0 < b_1 < ... < b_n$ et par des valeurs de reconstitution $y_1,...,y_n$ : si on a $x \in[b_{i-1} ; b_i[$ alors $Q(x) = y_i$.\\ + +Dans la suite, on va voir comment régler de façon efficace les $b_i$ et les $y_i$. + +\newpage +\section{Mesure de distorsion et distorsion} + +On introduit une mesure de distorsion pour les performances d'un quantificateur. Les principales mesures considérées sont: +\begin{itemize} +\item la mesure de distorsion en valeur absolue, $d(x,y) = |x-y|$ +\item la mesure de distorsion quadratique, $d(x,y) = (x-y)^2$ +\end{itemize} +\bigbreak + +Pour une source $X$ décrite par une distribution de probabilité $f_X(x)$, la distorsion introduite par un quantificateur $Q(x)$, est la moyenne de la mesure de la distorsion: +\[D = \int_{-\infty}^{\infty} d(x,Q(x))f_X(x) dx \] +Pour la mesure de distorsion quadratique, on a: +\[D = \int_{-\infty}^{\infty} (x-Q(x))^2f_X(x) dx \] + +\section{Quantification uniforme d'une source uniforme} + +On considère une source $X$ uniformément distribuée sur $[-X_{max} ; X_{max}]$. On considère aussi un quantificateur uniforme, c'est à dire que les intervalles de quantification sont tous de même taille, à M niveaux de sortie, situés au milieux des intervalles de quantification. +Prenons par exemple, un quantificateur à 4 niveaux de quantification: +%\img{0.5}{2/1/2.png} + +On note $\Delta$ l'intervalle de quantification, dans ce cas, $\Delta = \frac{2 X_{max}}{M}$.\\ + +Pour déterminer la distorsion qui va être introduite par le quantificateur, on calcule simplement: +\begin{align*} +D &= \int_{-X_{max}}^{X_{max}}\frac{1}{2X_{max}}(x-Q(x))^2 dx +\intertext{Comme $Q(x)$ est connu et constant sur un intervalle de quantification, on découpe simplement l'intervalle en sous-intervalles de quantification:} +D &= \sum_{i=-M/2}^{(M-1)/2} \int_{i\Delta}^{(i+1)\Delta} \frac{1}{2X_{max}}(x-(i+\frac{1}{2})\Delta)^2 dx +\intertext{On calcule} +I & = \int_{i\Delta}^{(i+1)\Delta} (x-(i+\frac{1}{2})\Delta)^2 \frac{1}{2X_{max}} dx \\ +& = \int_{-\Delta/2}^{\Delta/2} \frac{u^2}{2X_{max}} du \\ +I & = \frac{\Delta^3}{24X_{max}} = \frac{X_{max}^2}{3M^3} +\end{align*} +Dans $D$, on a $M$ intégrales égales à $I$ donc \[ D = \frac{X_{max}^2}{3M^2}\] + +L'énergie de la source est mesurée par sa variance +\begin{align*} +\sigma^2 & = \int_{-\infty}^{+\infty} x^2 f(x) dx \\ +& = \int_{-X_{max}}^{X_{max}} \frac{x^2}{2X_{max}} dx \\ +\sigma^2 & = \frac{X_{max}^2}{3} +\end{align*} + +On obtient donc $D = \frac{\sigma^2}{M^2}$. Sans codage entropique, le nombre de bits nécessaires pour représenter un niveau de reconstruction est $R = \lceil \log_2 M \rceil $, d'où +\[ \boxed{ D = \sigma^2 2^{-2R} } \] + +La distorsion maximale est égale à l'énergie de la source, et diminue très rapidement quand on augmente le nombre de bits du quantificateur. + +\begin{rem} +Dans certains cas (source non uniforme), un codage entropique peut permettre de réduire le débit. +\end{rem} + +Rapport signal à bruit : +\begin{align*} +RSB & = \frac{\sigma^2}{D} = 2^{2R} \\ +RSB_{dB} & = 10\log_{10}(2^{2R}) = 6.02R \text{decibel} +\end{align*} + +Le $RSB$ est utilisé comme mesure de qualité en audio, image... + +\newpage +\section{Quantification uniforme d'une source quelconque} + +On considère une source $X$ décrite par sa ddp $f_X(x)$, quantifiée par un quantificateur uniforme à $M$ niveaux de pas $\Delta$. + +%\img{0.5}{2/1/3} + +Pour une source quelconque, il faut régler $\Delta$ de manière à équilibrer distorsion de granularité et distorsion de surcharge. + +\newpage +\section{Quantification non-uniforme d'une source quelconque - Algorithme de Lloyd-Max} + +On considère une source $X$ discrète décrite par une ddp $f_X(x)$. On cherche le quantificateur non-uniforme à $M$ niveaux de sortie qui minimise la distorsion de quantification pour une norme de distorsion quadratique.\\ + +Un tel quantificateur est caractérisé par +\begin{itemize} +\item $b_0 < b_1 < \dots < b_n$ les bornes des intervalles de quantification +\item $y_1 < y_2 < \dots < y_n$ les valeurs de reconstruction +\end{itemize} + +Ainsi, si $x \in [b_{i-1},b_i], Q(x) = y_i$.\\ + +On cherche à minimiser la distorsion +\[ D = \int_{-\infty}^{+\infty} (x-Q(x))^2f_X(x)dx = \sum_{i=1}^M \int_{b_{i-1}}^{b_i} (x-y_i)^2f_X(x)dx \] + +Les conditions nécessaires pour avoir $D$ minimale sont : +\begin{itemize} +\item $\derivp[D]{y_i} = 0, \forall i=1\dots M$ +\item $\derivp[D]{b_i} = 0, \forall i = 0\dots M$ +\end{itemize} + +\begin{align*} +\intertext{1ère condition d'optimalité} +\derivp[D]{y_i} & = \derivp{}{y_i} \int_{b_{i-1}}^{b_i} (x-y_i)^2 f_X(x) dx \\ +& = - 2 \int_{b_{i-1}}^{b_i} (x-y_i) f_X(x) dx +\intertext{Ainsi,} +\derivp[D]{y_i} = 0 & \Leftrightarrow \int_{b_{i-1}}^{b_i} xf_X(x)dx = y_i \int_{b_{i-1}}^{b_i} f_X(x)dx \\ +& \Rightarrow y_i = \frac{\int_{b_{i-1}}^{b_i} xf_X(x)dx}{\int_{b_{i-1}}^{b_i} f_X(x)dx}, \quad i = 1 \dots M +\intertext{2ème condition d'optimalité} +\derivp[D]{b_i} & = \derivp{}{b_i} \int_{b_i}^{b_{i+1}} (x-y_{i+1})^2f_X(x)dx + \derivp{}{b_i}\int_{b_{i-1}}^{b_i} (x-y_i)^2 f_X(x)dx \\ +& = -(b_i-y_{i+1})^2 f_X(b_i) + (b_i-y_i)^2 f_X(b_i) +\intertext{Ainsi, } +\derivp[D]{b_i} = 0 & \Leftrightarrow -(b_i-y_{i+1})^2 + (b_i-y_i)^2 = 0 \\ +& \Leftrightarrow (y_{i+1}-y_i)(b_i-y_{i+1}+b_i-y_i) = 0 \\ +& \Leftrightarrow b_i = \frac{y_i+y_{i+1}}{2}, \quad i=1 \dots M-1 +\end{align*} + +\newpage +\subsection*{Algorithme de Lloyd -Max} +\begin{enumerate} +\item Initialisation : $b_0^{(0)} < b_1^{(0)} < \dots < b_n^{(0)}$ choisis arbitrairement, $k=1$. +\item $y_i^{(k)}$ obtenus à partir des $b_i^{(k-1)}, i=0 \dots M$ en utilisant la 1ère condition d'optimalité +\item $b_i^{(k)}$ obtenus à partir des $y_i^{(k)},i=1 \dots M$ en utilisant la 2ème condition d'optimalité +\item $k=k+1$ +\item tant qu'il y a des variations des $y_i$ ou des $b_i$, aller en 2. +\end{enumerate} + +\begin{rem} +Essayer d'implémenter l'algorithme de Lloyd-Max à l'aide de Matlab, C ou Python pour les fétichistes. Pour Matlab, utiliser la fonction \texttt{quad} afin de calculer les intégrales. Prendre une ddp gaussienne. + +Essayer de retrouver ceci pour $M=4$ et $\sigma = 1$ +\begin{center} +\begin{tabular}{ccc} +$i$ & $b_i$ & $y_i$ \\ \hline +1 & -0.98 & -1.51 \\ +2 & 0 & -0.45 \\ +3 & 0.98 & 0.45 \\ +4 & $+\infty$ & 1.51 \\ +\end{tabular} +\end{center} + +Prendre l'infini égal à 10. +\end{rem} + +\begin{rem} +On ne quantifie jamais sur le domaine des pixels, car les ddp y sont immondes. On effectue des transformées, et ensuite les ddp sont sympa (gaussiennes, laplaciennes), ce qui permet d'avoir des algorithmes efficaces. + +La plupart du temps, les quantifications sont uniformes (JPEG, JPEG200, H264...). On n'utilise des quantifications non uniformes que dans le cas d'applications très précises, où le gain de 2 ou 3 dB sur le $RSB$ est vraiment nécessaire. +\end{rem} + +\newpage +\section{Comportement asymptotique} +Pour étudier le comportement asymptotique d'un quantificateur, on suppose $M$ grand (les intervalles de quantification seront petits), $f_X(x) \approx f_X(y_i)$ sur $[b_{i-1},b_i]$. On note $\Delta_i = b_i - b_{i-1}$.\\ + +On a \[P_i = Pr(X\in[b_{i-1},b_i]) \approx f_X(y_i)\Delta_i\] + +\begin{align*} +D & = \sum_{i=1}^M \int_{b_{i-1}}^{b_i} (x-y_i)^2 f_X(x) dx \\ +D & = \sum_{i=1}^M f_X(y_i) \int_{b_{i-1}}^{b_i} (x-y_i)^2dx +\intertext{On suppose que $y_i$ est au milieu de l'intervalle $[b_{i-1},b_i]$} +\int_{b_{i-1}}^{b_i} (x-y_i)^2 dx & = \int_{-\Delta_i/2}^{\Delta_i/2} u^2 du = [\frac{u^3}{3}]_{-\Delta_i/2}^{\Delta_i/2} = \frac{2}{3} \frac{\Delta_i^2}{8} = \frac{\Delta_i^3}{12} +\intertext{En réinjectant dans $D$, on a} +D & = \sum_{i=1}^M f_X(y_i) \frac{\Delta_i^3}{12} +\intertext{On pose $\alpha_i^3 = f_X(y_i)\Delta_i^3$} +D & = \frac{1}{12} \sum_{i=1}^M \alpha_i^3 +\intertext{Si on calcule} +\sum_{i=1}^M \alpha_i & = \sum_{i=1}^M (f_X(y_i))^{1/3} \Delta_i \approx \int_{-\infty}^{+\infty} (f_X(x))^{1/3} dx = cste +\intertext{On doit trouver les $\Delta_i$ et les $\alpha_i$ qui minimisent $D$ sous la contrainte $\sum_{i=1}^M \alpha_i = C$. On introduit donc le Lagrangien du problème :} +L(\alpha_1,\dots\alpha_M,\lambda) & = \frac{1}{12}\sum_{i=1}^M\alpha_i^3 + \lambda (\sum_{i=1}^M \alpha_i - C) +\intertext{Condition d'optimalité :} +\derivp[L]{\alpha_i} = 0 & \Rightarrow \frac{1}{4}\alpha_i^2 + \lambda = 0, \quad i = 1 \dots M \\ +& \Rightarrow \alpha_i^2 = -4\lambda +\intertext{Les $\alpha_i$ sont donc tous égaux, d'où} +\alpha_i & = \frac{1}{M} \int_{-\infty}^{+\infty} (f_X(x))^{1/3} dx +\end{align*} +\newpage +On avait $\alpha_i^3 = f_X(y_i) \Delta_i^3$. Ainsi, si $f_X(y_i)$ est grand, $\Delta_i$ est petit, et inversement. + +%\img{0.5}{2/2/1} + +On peut donc calculer la distorsion : +\begin{align*} +D & = \frac{1}{12} \sum_{i=1}^M \frac{1}{M^3}(\int_{-\infty}^{+\infty} (f_X(x))^{1/3}dx)^3 \\ +& = \frac{1}{12} (\int_{-\infty}^{+\infty} (f_X(x))^{1/3}dx)^3.\frac{1}{M^2} +\intertext{Or, $M=2^R$ d'où} +D & = \frac{1}{12}(\int_{-\infty}^{+\infty} (f_X(x))^{1/3}dx)^3.2^{-2R} +\end{align*} + +\begin{rem} +Comme pour la quantification uniforme, on a une décroissance en $2^{-2R}$ de la distorsion en fonction du débit. Ici, il y a un facteur multiplicatif qui dépend de la ddp de la source. + +Pour une source quelconque, le comportement débit / distorsion sera : +\[ \boxed{ D(R) = \epsilon_X \sigma_X^2 2^{-2R} \text{ avec } \epsilon_X = \frac{1}{12\sigma_X^2}(\int_{-\infty}^{+\infty} (f_X(x))^{1/3}dx)^3 } \] +\end{rem} + +\section{Quantification vectorielle - Algorithme de Linde-Buzo-Gray} + +Avec une quantification vectorielle on considère des vecteurs de $N$ échantillons de la source que l'on va représenter à l'aide d'un index de quantification. + +%\img{0.5}{2/2/2} + +Pour un couple (poids, taille), on peut : +\begin{itemize} +\item quantifier indépendamment le poids et la taille avec deux quantificateurs scalaires +\item les quantifier simultanément avec une quantification vectorielle +\end{itemize} + +\subsection*{Algorithme de Linde-Buzo-Gray} + +\newcommand{\x}{\underline{x}} +Cet algorithme permet de fabriquer une quantification vectorielle optimale (optimum local) pour un ensemble de $K$ points de $\R^N$ : $\x_1 \dots \x_K$ et quantifiés sur $M$ niveaux. + +\newcommand{\y}{\underline{y}} +Pour cela, on introduit la mesure de distorsion $d(\x,\y) = \frac{1}{N}||\x-\y||^2$. + +Le quantificateur va minimiser la distorsion.\\ + +Initialisation : +\begin{itemize} +\item On sélectionne $M$ points $\y_1^{(0)},\dots,y_M^{(0)}$ parmi les $\x_1,\dots,\x_K$ au hasard. +\item $l=0, D_l = + \infty$ +\end{itemize} + +\begin{enumerate} +\item On réalise une quantification de $\x_1,\dots,\x_K$ en se servant de $\y_1^{(l)},\dots,\y_M^{(l)}$. +\[ q(\x_i) = \y_j \text{ ssi } ||\x_i-\y_j^{(l)}||^2 \leq ||\x_i-\y_k^{(l)}||^2, \quad \forall k\neq j\] + +\newcommand{\Cc}{\mathcal{C}} + +On obtient une partition de l'espace en cellules de quantification $\Cc_j^{(l)},j=1,\dots,M$ appelées cellules de Voronoï. + +%\img{0.5}{2/3/1} + +\item On calcule la distorsion : +\[ D^{(l+1)} = \frac{1}{K} \sum_{i=1}^K ||\x_i-q(\x_i)||^2 \] + +\item Actualisation des valeurs de reconstruction. On considère l'ensemble des points appartenant à \[\Cc_j^{(l)} = \{ \x_1^{(l)},\dots, \x_{K_l}^{(l)} \}, \quad j = 1,\dots,M\] + +On calcule le barycentre des points de $\Cc_j^{(l)}$ qui constitue la nouvelle valeur de reconstruction. + +\[\y_j^{(l+1)} = \frac{1}{K_l} \sum_{i=1}^{K_l} \x_i^{(l)} \] + +\item $l=l+1$ + +\item Aller en 1 tant que $D^{l-1} - D^l > \epsilon$ + +\end{enumerate} + +L'algorithme LBG converge vers une minimum local de la distorsion. + +\newcommand{\Cc}{\mathcal{C}} +En pratique : +\begin{itemize} +\item on transmet pour chaque $\x_i$ l'index $j$ de la cellule de Voronoi $\Cc_j$ auquel il appartient. +\item il faut transmettre au récepteur l'ensemble des points de reconstruction $\y_1^{(\overline{l})},\dots,\y_M^{(\overline{l})}$ où $\overline{l}$ est l'index final des itérations. +\item la phase de réglage du quantificateur peut se faire sur seulement $L<$.\\ +Si $\omega_i = 0$ on code $ <0, 0, \xi_{(i)}>$. + +ET on oublie pas : $c(i,:) = $, c'est à dire: ??!?. Ça traine tout seul dans son coin du tableau. + +\item Pour coder la chaîne bongbonbongobang$\$$, on commence par coder les quatre premiers symboles, c'est à dire que l'on a: +\[<0,0 <0,0,o> <0,0,n> <0,0,g>\] +Puis on code les quatre suivant ensemble avec $<1,3,b>$ car la sous-chaine composé de $bon$ apparait déjà avant.\\ +Puis $ongo$ car la racine $ong$ existe déjà donc on a $<2,3,o>$.\\ +Ensuite on code $ba$ qui donne $<1,1,a>$.\\ +Et pour finir on code $ng\$$ qui donne $<3,2,\$>$. + + +\item \begin{lstlisting} +c; //vecteur de triples +x = []; // séquence décodée +for i=1:length(c) + x = [x, x[c(i,1):c(i,1)+c(i,2)], c(i,3)] +end +\end{lstlisting} + +\item Pour coder la chaîne bongbonbongobang$\$$, on commence par coder les quatre premiers symboles, c'est à dire que l'on a: +\[<0,0 <0,0,o> <0,0,n> <0,0,g>\] +Puis on code les quatre suivant ensemble avec $<1,3,b>$ car la sous-chaine composé de $bon$ apparait déjà avant.\\ +Puis $ongo$ car la racine $ong$ existe déjà donc on a $<2,3,o>$.\\ +Ensuite on code $ba$ qui donne $<1,1,a>$.\\ +Et pour finir on code $ng\$$ qui donne $<3,2,\$>$. + +\item On effectue le même travail en décodant cette fois. Si on ne se trompe pas, on retombe sur la même chose. + +\item Avec la méthode C, pour coder bongbongbonbongobang$\$$ on obtient: +$<0,0,b> ... <0,0,g> <1,7,b><2,3,o><1,1,a><3,2,\$>$ +Ce que l'on retient c'est que pour bongbon on a une répétition sur 7 symbole des 4 premiers, après il suffit d'appliquer bêtement l'énoncé. + +\item \begin{lstlisting} +c; +x=[]; +for i=1:length(c) + for j = 1:c(i,2) + x = x[x,x[c(i,1+j-1)]; + end +end +\end{lstlisting} + +LE problème est que ? pas compris ce qu'il a dit. + +\item \begin{align*} +0 \leq j \leq s \Rightarrow \lceillog_2 S \rceil \text{ bits} \\ +0 \leq k \leq s + t \Rightarrow \lceillog_2 (S+t) \rceil \text{ bits} \\ +u \Rightarrow \lceillog_2 u \rceil \text{ bits} \\ +\end{align*} + + + + + +\end{enumerate} + + + +\end{document} \ No newline at end of file diff --git a/455-Codage_Sources/TD/TD5/1.png b/455-Codage_Sources/TD/TD5/1.png new file mode 100644 index 0000000..6d82203 Binary files /dev/null and b/455-Codage_Sources/TD/TD5/1.png differ diff --git a/455-Codage_Sources/TD/TD5/10.png b/455-Codage_Sources/TD/TD5/10.png new file mode 100644 index 0000000..2fbf26b Binary files /dev/null and b/455-Codage_Sources/TD/TD5/10.png differ diff --git a/455-Codage_Sources/TD/TD5/11.png b/455-Codage_Sources/TD/TD5/11.png new file mode 100644 index 0000000..3597d2c Binary files /dev/null and b/455-Codage_Sources/TD/TD5/11.png differ diff --git a/455-Codage_Sources/TD/TD5/2.png b/455-Codage_Sources/TD/TD5/2.png new file mode 100644 index 0000000..361d388 Binary files /dev/null and b/455-Codage_Sources/TD/TD5/2.png differ diff --git a/455-Codage_Sources/TD/TD5/3.png b/455-Codage_Sources/TD/TD5/3.png new file mode 100644 index 0000000..b457e47 Binary files /dev/null and b/455-Codage_Sources/TD/TD5/3.png differ diff --git a/455-Codage_Sources/TD/TD5/4.png b/455-Codage_Sources/TD/TD5/4.png new file mode 100644 index 0000000..1b7db88 Binary files /dev/null and b/455-Codage_Sources/TD/TD5/4.png differ diff --git a/455-Codage_Sources/TD/TD5/5.png b/455-Codage_Sources/TD/TD5/5.png new file mode 100644 index 0000000..7d22ab4 Binary files /dev/null and b/455-Codage_Sources/TD/TD5/5.png differ diff --git a/455-Codage_Sources/TD/TD5/6.png b/455-Codage_Sources/TD/TD5/6.png new file mode 100644 index 0000000..019cede Binary files /dev/null and b/455-Codage_Sources/TD/TD5/6.png differ diff --git a/455-Codage_Sources/TD/TD5/7.png b/455-Codage_Sources/TD/TD5/7.png new file mode 100644 index 0000000..5d7c8dc Binary files /dev/null and b/455-Codage_Sources/TD/TD5/7.png differ diff --git a/455-Codage_Sources/TD/TD5/8.png b/455-Codage_Sources/TD/TD5/8.png new file mode 100644 index 0000000..fbe4346 Binary files /dev/null and b/455-Codage_Sources/TD/TD5/8.png differ diff --git a/455-Codage_Sources/TD/TD5/9.png b/455-Codage_Sources/TD/TD5/9.png new file mode 100644 index 0000000..7f23e7a Binary files /dev/null and b/455-Codage_Sources/TD/TD5/9.png differ diff --git a/455-Codage_Sources/TD/TD5/TD5.tex b/455-Codage_Sources/TD/TD5/TD5.tex new file mode 100644 index 0000000..b570ea8 --- /dev/null +++ b/455-Codage_Sources/TD/TD5/TD5.tex @@ -0,0 +1,239 @@ +\documentclass{article} +\input{../../preambule/preambule} + +\newcommand{\nom}{TD5 : Codage de sources} +\renewcommand{\nomentete}{UE455 - \nom} + + + +\begin{document} + +\titre{\nom} + +\cacededi{C'est pratique d'avoir un pantalon troué, je peux me gratter les couilles comme je veux.}{Tom Colinot} + +\section*{2. Quantification et codage entropique} + +\img{0.5}{1} + +\begin{enumerate}\setlength{\itemsep}{5mm} + +\item On ne peut pas le dire directement parce que les couples $(R,D)$ n'ont ni $R$, ni $D$ connu pour QSU et QSNU. + +\item Sans codeur entropique, on ne se réfère qu'on premier tableau. Pour le même débit, on a toujours $RSB_{QSU} \leq RSB_{SQNU}$, donc la QSNU est meilleure. + +\item $D_{min} = \sigma^2 2^{-2R}$ +\img{0.5}{2} + +\[RSB_{max} = 10\log_{10} \frac{\sigma^2}{D_{min}} = 6.02R\] + +\[D(r) - D_{min}(R) = RSB_{max} - RSB(R) = 6R - RSB(R)\] + +Avec un codeur entropique parfait, on a $R=H$ et donc : + +\begin{center} +\begin{tabular}{c|c|c} +$\log_2 M$ & QSU & QSNU \\ +\hline +1 & 1.6 & 1.6 \\ +2 & 2.174 & 2.166 \\ +3 & 2.296 & 2.33 \\ +4 & 2.232 & 2.37 \\ +5 & 2.124 & 2.36 +\end{tabular} +\end{center} + +\item C'est QSU + CE qui est meilleur. +\end{enumerate} + + +\section*{3. Codage scalable} + +\begin{enumerate}\setlength{\itemsep}{5mm} + +\item +\begin{enumerate} +\item $M=2^R$ donc $\Delta = \frac{2X_{max}}{M} = \frac{2X_{max}}{2^R} = X_{max}2^{1-R}$ + +\item $D = \frac{\Delta^2}{12} = \frac{(X_{max}2^{1-R})^2}{12} = X_{max}^2 \frac{1}{3} 2^{-2R} $ + +\item $R=3 \Rightarrow M=8$ +\imgt{3} + +\item +\begin{itemize} +\item $X_1 = 0.9X_{max} \Rightarrow 111$ +\item $X_2 = -0.1X_{max} \Rightarrow 011$ +\item $X_3 = -0.6X_{max} \Rightarrow 001$ +\end{itemize} +\end{enumerate} + +\item Le train binaire classique est 111 0111 001. Si les six bits de la fin sont perdus, on ne peut que reconstruire $X_1$. + +\item +\begin{itemize} +\item Scalable 1 : on code d'abord $X_1X_2X_3$ avec un bit par $X_i$, puis on la quantifiée avec 2 puis 3 bits. Au final, on code donc $X_1X_2X_3$ sur un train de 3+6+9=18 bits. Si on n'a que les 3 premiers 100, on peut reconstituer $X_1 = 0.5X_{max}$, $X_2=X_3=-0.5X_{max}$. +\item Scalable 2 : on envoie les premiers bits de $X_1,X_2$ et $X_3$ à la suite, puis les deuxièmes bits, puis les troisièmes. Le train fait donc 9 bits. +\end{itemize} + +\begin{figure} +\centering +\begin{tabular}{c|c|c|c|c} +R & D & Non scalable & Scalable 1 & Scalable 2 \\ +\hline +0 & $\sigma^2$ & 0 & 0 & 0\\ +1 & $\sigma^2 2^{-2}$ & 1 & 1 & 1 \\ +2 & $\sigma^2 2^{-4}$ & 2 & 1+2 & 2 \\ +3 & $\sigma^2 2^{-6}$ & 3 & 1+2+3 & 3 +\end{tabular} +\caption{Débit} +\end{figure} + +\item Codage d'image, codage vidéo. \textit{Because why ? Because fuck you that's why.} + +\end{enumerate} + +\section*{1. Quantification scalaire uniforme} + +\imgt{4} + +\begin{enumerate}\setlength{\itemsep}{5mm} + +\item \begin{align*} +D & = E[(x-y)^2] \\ +& = \int_{-\infty}^{+\infty} p_X(x)(x_Q(x))^2dx \\ +& = \sum_{i=1}^N \int_{s_{i-1}}^{s_i} p_X(x)(x-y_i)^2 dx +\end{align*} + +\item $N=2$ +\img{0.5}{5} +$y_1 = -\frac{\Delta}{2}, \quad y_2 = \frac{\Delta}{2}$ + +On cherche $\Delta$ qui minimise $D$ : +\begin{align*} +D & = \int_{-\infty}^0 p_X(x)(x+\frac{\Delta}{2})^2 dx + \int_0^{\infty}p_X(x)(x-\frac{\Delta}{2})^2 dx \\ +& = \int_{-\infty}^0 p_X(x)(x^2+\frac{\Delta^2}{4}+x\Delta) dx + \int_0^{\infty}p_X(x)(x^2+\frac{\Delta^2}{4}-x\Delta) dx \\ +& = \int_{-\infty}^{\infty} p_X(x)(x^2 + \frac{\Delta^2}{4}) dx + \Delta(\int_{-\infty}^0p_X(x)dx - \int_0^{\infty}p_X(x)dx) +\intertext{Or, $\int_{-\infty}^0p_X(x)dx + \int_0^{\infty}p_X(x)dx = 0$ ($X$ de valeur moyenne nulle)} +D & = \int_{-\infty}^{\infty} p_X(x)(x^2 + \frac{\Delta^2}{4}) dx + 2\Delta\int_0^{\infty}p_X(x)dx \\ +& = (\int_{-\infty}^{+\infty} p_X(x)dx)\frac{\Delta^2}{4} - (2\int_0^{\infty} xp_X(x)dx)\Delta + \int_{-\infty}^{+\infty} x^2p_X(x)dx \\ +& = \frac{\Delta^2}{4} - (2\int_0^{\infty} xp_X(x)dx)\Delta + \int_{-\infty}^{+\infty} x^2p_X(x)dx +\end{align*} + +Ainsi, \[ \drond{D}{\Delta} = 0 \Rightarrow \frac{1}{4}2\Delta - 2\int_0^{\infty} xp_X(x)dx = 0 \Rightarrow \Delta = 4\int_0^{\infty} xp_X(x)dx \] + +\item On a maintenant $\acc{y_{i+1}-y_i & = \Delta}{y_{N/2} = -\Delta / 2, & y_{N/2+1} = \Delta / 2}$ + +De plus, $y_{N/2}-y_1 = \Delta(N/2-1)$ donc $y_1 = y_{N/2}-\Delta(N/2-1) = -\Delta(N/2-1/2)$ + +$y_i = \Delta/2(-N+1)+(i-1)\Delta = (i-N/2-1/2)\Delta$ + +$S_i=y_i+\Delta/2=\Delta(i-N/2)$ + +\begin{align*} +D & = \int_{-\infty}^{\Delta(1-N/2)}p_X(x)(x+\Delta(N/2-1/2))dx + \sum_{i=2}^{N-1} \int_{\Delta(i-1-N/2)}^{\Delta(i-N/2)} p_X(x)(x-\Delta(i-\frac{N+1}{2})^2)dx + \int_{\Delta(N/2-1)}^{\Delta(i-N/2)} p_X(x)(x-\Delta(N/2-1/2))dx +\end{align*} +Ensuite, on cherche $\Delta$ tel que $\drond{D}{\Delta}=0$ mais c'est relou donc on va pas le faire. + +\item \begin{enumerate} +\item $ \Delta = \frac{2A}{4} = \frac{A}{2}$ +\item \img{0.5}{6} +\item $D=\frac{\Delta^2}{12}=\frac{A^2}{3\times^{2R}}$ +\end{enumerate} + +\end{enumerate} + +\section*{4. Codage avec information adjacent au décodeur} +\begin{enumerate} +\item Un exemple de compression d'une sourceX en se servant d'une information adjacente supposée disponible au codeur et au décodeur:\\ +En codage vidéo, le codeur dispose de l'image n-1 (compressée et décompressée) pour coder l'image n.\\ +Le décodeur dispose également de l'image n-1.\\ + +\item On fabrique $\tilde{X}$ à partir de X et de Y : +\[\tilde{X} = X-Y\] +Au décodeur, $\tilde{X}$ sera utilisé pour calculer $\hat{X}$ (l'estimé de X).\\ + +\item On suppose que Y et donc Z suivent une loi normale de moyenne nulle et d'écart-type respectif $\sigma_Y$ et $\sigma_Z$. +\begin{enumerate} +\item \begin{align*} +E(X) &= E(Y+Z) = E(Y) + E(Z) = 0\\ +\sigma_X^2 &= E((X-E(X))^2) = E(X^2) =E(Y^2 + Z^2 + 2YZ)\\ +&= E(Y^2) + 2E(Y)E(Z) +E(Z^2)\\ +&= \sigma_Y^2 + \sigma_Z^2 +\end{align*} + +\item On ne tient compte de Y ni au codeur, ni au décodeur, $\tilde{X} = X$ et $D_1(R) = \sigma_X^2 2^{-2R}$.\\ + +\item Si on compresse $\tilde{X} = X-Y = Z$, alors $D_2(R) = \sigma_{\tilde{X}}^2 2^{-2R} = (\sigma_X^2 - \sigma_Y^2) 2^{-2R}$. Donc: +\[D_2(R) \leq D_1(R)\] + +\end{enumerate} + +\item On n'utilise pas Y au codeur, donc à priori, les performances devraient être moins bonnes. + +\img{0.5}{7.png} + +Tout d'abord, X est quantifié à l'aide d'un quantificateur scalaire uniforme de pas $\Delta_1$, centré en 0. X appartient à un intervalle de quantification répété par un index $q_1$, cet intervalle est alors découpé en M sous-intervalle, $m \in \{0,1,...,M-1\}$. + +\item \[\Delta_1 = M\Delta_2 \Rightarrow \Delta_2 = \frac{\Delta_1}{M} \] + +\item Les m(s) sont équiprobables donc: +\[H = \sum_{i=1}^{\Delta_2} \frac{1}{\Delta_2}log_2(\frac{1}{\frac{1}{\Delta_2}} = log_2(\Delta_2) \] + +C'est le nombre de bits nécessaire.\\ + +Première méthode:\\ +On quantifie Y au décodeur avec $\Delta_1$: + +\img{0.5}{8.png} + +\item Il faut: +\[\acc{k\Delta_1 - \frac{\Delta_1}{2} \leq Y \leq k\Delta_1 + \frac{\Delta_1}{2}}{k\Delta_1 - \frac{\Delta_1}{2} \leq X \leq k\Delta_1 + \frac{\Delta_1}{2}} \] + +\img{0.5}{9.png} +On suppose que $Y = k \Delta_1$ donc, on a $k\Delta_1 - \frac{\Delta_1}{2} \leq k \Delta_1 + Z \leq k\Delta_1 + \frac{\Delta_1}{2}$. Ce qui implique que : +\[-\frac{\Delta_1}{2} \leq Z \leq \frac{\Delta_1}{2}\] + +\item Lorsque Y est très proche de la limite de l'intervalle, on a une distorsion de l'ordre de $\Delta_1^2$, même lorsque $Z << Y$. + +\item Deuxième méthode: On découpe l'intervalle de largeur $\Delta_1$ en 0, en M sous-intervalle, et on sélectionne le milieu 0' du sous-intervalle indexé par m. +Ensuite, Y est quantifié avec $\Delta_1$ mais centré en 0'.\\ + +\img{0.5}{10.png} + +Première étape: on reconstruit $\hat{\omega}$ à partir de m et $-\frac{\Delta_1}{2} \leq \tilde{\omega} \leq \frac{\Delta_1}{2}$.\\ +Seconde étape: $Y \rightarrow \hat{Y}$\\ +\begin{align*} +\hat{X} = \hat{Y + \hat{\omega}} \text{ et,} X = Y + Z\\ +\text{donc, } (\hat{X}-X) = (\hat{Y} - Y) + (\hat{\omega} - Z)\\ +(\hat{Y}-Y)^2 \leq \frac{\Delta_1^2}{4} +\end{align*} + +Si $Z \in [-\frac{\Delta_1}{2}; \frac{\Delta_1}{2}]$ alors, $ (Z-\hat{\omega})^2 \leq \Delta_1^2$, sinon $(z-\hat{\omega})^2$ peut être large. + +\item $\Delta_1$ assez grand pour que $|Z| \leq \frac{\Delta_1}{2}$.\\ +D(R) augmente aussi et $(\hat{m}-m)$ augmente. + +\item Montrons que $Pr(|Z|> \frac{\Delta_1}{2}) = \sqrt{\frac{2}{\pi \sigma_Z^2}} \int_{\frac{\Delta_1}{2}}^{+\infty} exp(-\frac{z^2}{2\sigma_z^2}) dz$, dont la distribution de probabilité est: +\img{0.5}{11.png} +On peut aussi montrer que: +\begin{align*} +Pr(|Z|>\frac{\Delta_1}{2}) &= 2 Pr(Z > \frac{\Delta_1}{2})\\ +&= 2 \sqrt{\frac{1}{2\pi \sigma_Z^2}} \int_{\frac{\Delta_1}{2}}^{+\infty} exp(-\frac{z^2}{2\sigma_z^2}) dz +\end{align*} + +On suppose que $ \Delta_2 << \Delta_1$, et $\Delta_2 << \sigma_Z$.\\ +On peut montrer que $|Z| \leq \frac{\Delta_2}{2} \Rightarrow D_1 = \frac{\Delta_2^2}{12}$ et que $|Z| > \frac{\Delta_2}{2} \Rightarrow D_2 = \Delta_2^2$.\\ + +\begin{align*} +D &= D_1 Pr(|Z| \leq \frac{\Delta_1}{2}) + D_2 Pr(|Z| > \frac{\Delta_1}{2})\\ +&= \frac{\Delta_2^2}{12} \int_{-\frac{\Delta_1}{2}}^{\frac{\Delta_1}{2}} \frac{1}{\sqrt{2\pi \sigma_Z^2}} exp(-\frac{z^2}{2\sigma_Z^2})dz + \Delta_1^2 \sqrt{\frac{2}{\pi \sigma_Z^2}} \int_{\frac{\Delta_1}{2}}^{+\infty} exp(-\frac{z^2}{2\sigma_Z^2})dz\\ +&= \sqrt{\frac{2}{pi \sigma_z^2}} \left(\frac{\Delta_2^2}{12} \int_{0}^{\frac{\Delta_1}{2}} exp(-\frac{z^2}{2\sigma_Z^2})dz + \Delta_1^2 \int_{\frac{\Delta_1}{2}}^{+\infty} exp(-\frac{z^2}{2\sigma_Z^2})dz\right) +\end{align*} + +\item R est fixé donc M est fixé, et $\Delta_2 = \frac{\Delta_1}{M}$. + +On calcul $\frac{\partial D}{\partial \Delta_1}$ et par magie on trouve 0. + +\end{enumerate} +\end{document} \ No newline at end of file diff --git a/455-Codage_Sources/TD/TD6/1.png b/455-Codage_Sources/TD/TD6/1.png new file mode 100644 index 0000000..4c10687 Binary files /dev/null and b/455-Codage_Sources/TD/TD6/1.png differ diff --git a/455-Codage_Sources/TD/TD6/2.png b/455-Codage_Sources/TD/TD6/2.png new file mode 100644 index 0000000..da44d70 Binary files /dev/null and b/455-Codage_Sources/TD/TD6/2.png differ diff --git a/455-Codage_Sources/TD/TD6/3.png b/455-Codage_Sources/TD/TD6/3.png new file mode 100644 index 0000000..195abc9 Binary files /dev/null and b/455-Codage_Sources/TD/TD6/3.png differ diff --git a/455-Codage_Sources/TD/TD6/TD6.tex b/455-Codage_Sources/TD/TD6/TD6.tex new file mode 100644 index 0000000..27287fc --- /dev/null +++ b/455-Codage_Sources/TD/TD6/TD6.tex @@ -0,0 +1,212 @@ +\documentclass{article} +\input{../../preambule/preambule} + +\newcommand{\nom}{TD6 : Allocation optimale de bits} +\renewcommand{\nomentete}{UE455 - \nom} + + + +\begin{document} + +\titre{\nom} + +\cacededi{C'est bizarre, il a dit "reconnaissance de formes" et on l'a pas entendu jouir derrière.}{Tom Colinot} + +\section{Transformation unitaires, gain de codage} + +\subsection{Quantification sans transformation} + +\newcommand{\y}{\underline{y}} + +On considère une source $X$ dont les réalisations sont groupées en $N$ composantes considérées comme générées par une source vectorielle $Y$. + +\begin{center} +\begin{tabular}{c|cc} +$X_i$ & $x_1\dots x_N$ & $x_{N+1} \dots x_{2N}$ \\ +\hline +$Y_i$ & $\y_1$ & $\y_2$ +\end{tabular} +\end{center} + +\begin{enumerate}\setlength{\itemsep}{5mm} +\item On dispose de $NR$ bits par vecteur de $N$ composantes, donc on utilise $R$ bits par composante. + +\item $D_Y = \frac{1}{N} E(||\y_k-\tilde{\y_k}||^2) = D_X$. +\end{enumerate} + +\subsection{Quantification après transformation} + +\newcommand{\tv}{\underline{t}} +\newcommand{\Uu}{\underline{\underline{U}}} +\newcommand{\Id}{\underline{\underline{I}}} + +\begin{enumerate}\setlength{\itemsep}{5mm}\setcounter{enumi}{2} +\item On fait une transformation sur $\y_k$ : +\[ \tv_k = \Uu^T \y_k \avec \Uu.\Uu^T = \Id_N\] + +\imgt{1} + +\begin{align*} +D_T & = \frac{1}{N}E(||\tv_k - \tilde{\tv_k}||^2 ) \\ +& = \frac{1}{N} E(||\Uu^T \y_k - \Uu^T \tilde{\y_k}||^2) \\ +& = \frac{1}{N} E((\Uu^T(\y_k-\tilde{\y_k}))^T.(\Uu^T(\y_k-\tilde{\y_k}))) \\ +& = \frac{1}{N}E((\y_k - \tilde{y_k})^T \Uu.\Uu^T(\y_k - \tilde{y_k})) \\ +& = \frac{1}{N}E(||\y_k - \tilde{\y_k}||^2) \\ +& = D_Y +\end{align*} + +\item \[NR = \sum_{l=1}^N R_l\] + +\item \[D_T = \frac{1}{N} \sum_{l=1}^N D_{t,l}(R_l) = \frac{1}{N} \sum_{i=1}^N \epsilon_{t,l}\sigma^1_{t,l} 2^{-2R_l} \] + +\item On peut jouer sur $R_i, \forall i= 1, \dots N$ pour minimiser $D_T$ sous la contrainte $\sum R_l = NR$.\\ + +$D_T$ est une fonction convexe, donc la condition d'extremum est une condition de minimum.\\ + +On utilise le lagrangien : +\[ J(R_1, \dots, R_N, \ld) = \frac{1}{N} \sum_{l=1}^N \epsilon_{t,l} \sigma_{t,l}^2 2^{-2R_l} + \ld(\sum_{l=1}^N R_l - NR) \] + +\item Les conditions nécessaires pour minimiser $J(R_1, \dots, R_N, \ld)$ sont donc : +\[ \acc{ \drond{J}{R_l} & = 0, \quad \forall l = 1, \dots, N }{ \drond{J}{\ld} & = 0, \quad \forall \ld \in \{\ld\} \quad \text{Lolilonche}} \] + +\item \begin{align*} +\drond{J}{R_l} = 0 & \Leftrightarrow \frac{1}{N} \epsilon_{t,l} \sigma_{t,l}^2 (-2\ln2)2^{-2R_l} + \ld = 0 \\ +& \Leftrightarrow 2^{-2R_l} = \frac{N\ld}{\epsilon_{t,l} \sigma_{t,l}^2 (2\ln2)}, \quad \forall l = 1, \dots, N\\ +\drond{J}{\ld} = 0 & \Leftrightarrow \sum_{l=1}^N R_l = NR +\intertext{On en déduit donc que} +2^{-2\sum R_l} & = \prod_{l=1}^N \frac{N\ld}{\epsilon_{t,l} \sigma_{t,l}^2 (2\ln2)} \\ +2^{-2NR} & = \prod_{l=1}^N \frac{(N\ld/(2\ln2))}{\epsilon_{t,l} \sigma_{t,l}^2} \\ +2^{-2NR} & = \frac{(N\ld/(2\ln2))^N}{\prod_{l=1}^N\epsilon_{t,l} \sigma_{t,l}^2} \\ +(N\ld/(2\ln2)) & = 2^{-2R} (\prod_{l=1}^N\epsilon_{t,l} \sigma_{t,l}^2)^{1/N} \\ +\ld & = \frac{2\ln2}{N}2^{-2R} (\prod_{l=1}^N\epsilon_{t,l} \sigma_{t,l}^2)^{1/N} +\intertext{ Ainsi, en reprenant l'expression trouvée pour $2^{-2R_l}$} +R_l & = -\frac{1}{2} \log_2 \frac{(N\ld/(2\ln2))}{\epsilon_{t,l} \sigma_{t,l}^2} \\ +& = \frac{1}{2} \log_2 \frac{\epsilon_{t,l} \sigma_{t,l}^2}{2^{-2R}(\prod_{l=1}^N\epsilon_{t,l} \sigma_{t,l}^2)^{1/N}} \\ +R_l & = R + \frac{1}{2} \log_2 \frac{\epsilon_{t,l} \sigma_{t,l}^2}{2^{-2R}(\prod_{l=1}^N\epsilon_{t,l} \sigma_{t,l}^2)^{1/N}} +\end{align*} + +\item \begin{align*} +D_{t,l}(R_l) & = \epsilon_{t,l} \sigma_{t,l}^2 2^{-2R_l} \\ +& = \epsilon_{t,l} \sigma_{t,l}^2 \frac{N\ld}{\epsilon_{t,l} \sigma_{t,l}^2 (2\ln2)} \\ +D_{t,l}(R_l)& = \frac{N\ld }{2\ln2} \quad \text{constante} +\end{align*} + +\item \begin{align*} +D_T^* & = \frac{1}{N} \sum_{l=1}^N D_{t,l}(Rl) \\ +& = \frac{1}{N} N \frac{N\ld}{2\ln2} \\ +& = \frac{N\ld}{2\ln2} \\ +D_T^* & = 2^{-2R} (\prod_{l=1}^N\epsilon_{t,l} \sigma_{t,l}^2)^{1/N} +\end{align*} + +\item \[ D = \frac{1}{N} \sum_{l=1}^N \epsilon_{t,l} \sigma_{t,l}^2 2^{-2R} \] + +\item \[G_T = \frac{\frac{1}{N}\sum_{l=1}^N \epsilon_{t,l} \sigma_{t,l}^2}{(\prod_{l=1}^N \epsilon_{t,l} \sigma_{t,l}^2)^{1/N}} \] +\end{enumerate} + +\begin{flushright} +Si tu n'as pas encore vomi c'est le moment, je te laisse un bout de page blanche. +\end{flushright} + +\vspace{8cm} + +\subsection{Applications numériques} +Le chinois a \emph{rage quit}. + +\newpage +\section{Techniques de codage d'images} + +\subsection{Codage sans pertes} + +\begin{enumerate}\setlength{\itemsep}{5mm} +\item On estime d'abord les probabilités d'apparition : + +\begin{center} +\begin{tabular}{c|c|c} +Symbole & Nombre d’occurrences & Probabilité estimée \\ +\hline +4 & 1 & 1/16 \\ +6 & 3 & 3/16 \\ +8 & 7 & 7/16 \\ +10 & 5 & 5/16 +\end{tabular} +\end{center} + +L'estimation de l'entropie est donc : +\[ \hat{H} = -\sum_i p_i \log_2 p_i \approx 1.749 \text{bpp} \] + +\item Il n'est pas possible d'obtenir un débit de 0.5 bpp $< \hat{H}$. +\end{enumerate} + +\subsection{Codage avec pertes - Quantification} + +\begin{enumerate}\setlength{\itemsep}{5mm}\setcounter{enumi}{2} +\item $E(X) = 4\frac{1}{16} + 6\frac{3}{16} + 8\frac{7}{16} + 10\frac{5}{16} = 8$ + +$Var(X) = E((X-E(X))^2) = \dots = 3$ + +\item $D(R) = \sigma_X^2 2^{-2R}$ +\img{0.5}{2} + +\item $RSB_{dB} \approx 6R$ donc $R=1 \text{bpp} \Rightarrow RSB_{dB} = 6dB$. Pour $R=0.5\text{bpp}$, on aurait $RSB_{dB}=3dB$. + +\item On choisit le quantificateur suivant : +\img{0.5}{3} + +\[ \hat{X} = \acc{ \mu + \Delta & \si X \geq \mu }{ \mu - \Delta & \sinon} \] + +\begin{align*} +D & = \int_{-\infty}^{+\infty} ( X-\hat{X})^2 f_X(x) dx \\ +& = 2 \int_{\mu}^{+\infty} (X-\mu-\Delta)^2 f_X(x) dx +\intertext{Changement de variables $z=x-\mu$} +D & = 2\int_0^{+\infty} (z-\Delta)^2 f_Z(z) dz \quad \avec f_Z(z) = \frac{1}{\sqrt{2\pi\sigma_X^2}}\exp(-\frac{z)^2}{2\sigma_X^2}) \\ +D & = 2\int_0^{\infty} z^2 f_Z(z) dz + 2\Delta^2 \int_0^{\infty} f_Z(z)dz - 4 \Delta\int_0^{\infty} zf_Z(z)dz \\ +& = \sigma_X^2 + \Delta^2 - 4 \Delta\int_0^{\infty} zf_Z(z)dz +\intertext{Or,} +\int_0^{\infty} zf_Z(z)dz & = \int_0^{+\infty} \frac{1}{\sqrt{2\pi\sigma_X^2}}\exp(-\frac{z)^2}{2\sigma_X^2}) dz \\ +& = \frac{1}{2} \int_0^{\infty} \frac{1}{\sqrt{2\pi\sigma_X^2}}\exp(\frac{-y}{2\sigma_X^2}) dy \quad \avec y=z^2\\ +& = \frac{1}{2} \frac{2\sigma_X^2}{\sqrt{2\pi\sigma_X^2}} = \frac{1}{2} \sqrt{\frac{2\sigma_X^2}{\pi}} +\intertext{Donc} +D(\Delta) = \Delta^2 - 2\sqrt{\frac{2\sigma_X^2}{\pi}} \Delta + \sigma_X^2 +\end{align*} + +Ainsi, +\begin{align*} +\drond{D}{\Delta} = 0 & \Rightarrow \Delta^* = \sqrt{\frac{2\sigma_X^2}{\pi}} \approx 1.4 \\ +& \Rightarrow D^* = \frac{2\sigma_X^2}{\pi} - 2\frac{2\sigma_X^2}{\pi} + \sigma_X^2 = \sigma_X^2(1-\frac{2}{\pi})\\ +& \Rightarrow RSB^* = \frac{\sigma_X^2}{D^*} = \frac{1}{1-\frac{2}{\pi}} \approx 2.75 +& \Rightarrow RSB_{dB}^* = 10\log_{10}2.75 \approx 4.396 \text{dB} < 6 \text{dB} +\end{align*} + +\item Pour avoir $R=0.5$ bpp on doit utiliser un quantificateur vectoriel. +\end{enumerate} + +\subsection{Codage avec perte - DPCM} + +\newcommand{\Aa}{\underline{\underline{A}}} +\newcommand{\A}{\underline{A}} + +\begin{enumerate}\setlength{\itemsep}{5mm}\setcounter{enumi}{7} +\item \begin{align*} +\Aa & = [ \A_1 \A_2 \A_3 \A_4 ] \\ +\A_l & = [\A_1^T \A_2^T \A_3^T \A_4^T] \\ +& = [6,4,6,8,6,8,10,8,8,10,10,8,10,8,10] +\end{align*} + +\item Soit $E(y) = 0, \y=[y_1,\dots y_N]$ + +$\hat{y_{i+1}} = \alpha y_i, \quad \alpha^* = \frac{\gamma_Y(1)}{\gamma_Y(0)}$ + +$\underline{B}_L = \A_l - 8[ 1, 1, \dots 1 ] = [-2, -4, -2, \dots]$ + +$\gamma_X(0) = \sigma_X^2 = 3$ + +$\gamma_X(1) = \frac{1}{N} \sum_{i=1}^{N-1} B_l(i+1) B_L(i) = 5/4$ + +$\alpha \approx 0.4$ + +$\y(i) = \alpha B_L(i-1) + 8$ + +La variance diminue un peu. +\end{enumerate} + +\end{document} \ No newline at end of file diff --git a/455-Codage_Sources/TD/TD7/TD7.tex b/455-Codage_Sources/TD/TD7/TD7.tex new file mode 100644 index 0000000..9b0eef9 --- /dev/null +++ b/455-Codage_Sources/TD/TD7/TD7.tex @@ -0,0 +1,156 @@ +\documentclass{article} +\input{../../preambule/preambule} + +\newcommand{\nom}{TD7} +\renewcommand{\nomentete}{UE455 - \nom} + + + +\begin{document} + +\titre{\nom} +\section*{Exercice I-TD3: Entropie différentielle d'une source Gaussienne} + +\begin{enumerate} +\item +\begin{align*} +f_X(x) = \frac{1}{\sqrt{2 \pi \sigma^2}} exp(-\frac{(x-\mu)^2}{2\sigma^2} +\intertext{Montrons que $h(x) = \frac{1}{2} log_2(2\pi e \sigma^2)$} +h(x) = - \int_{-\infty}^{\infty} f_x(x) log_2(f_x(x)) dx\\ +\end{align*} +Tout réside dans le log de exp, la définition de la variance et de la densité de probabilité. Trivial donc. + +\item \begin{align*} +\int_{-\infty}^{+\infty} f_Y(x) log_2(\frac{f_X(x)}{f_Y(x)}) dx = h(Y) - \int_{-\infty}^{+\infty} f_Y(x) log_2(f_X(x)) dx +=h(Y) - h(X) \leq 0 +\end{align*} +D'où le résultat. +\end{enumerate} + + +\section*{Exercice III-TD3: Schéma de compression binaire avec pertes} + +\begin{align*} +\underline{X} = x_1x_2...x_mX_{m+1}x_{2m}\\ +\underline{Y} = y_1 y_2 +\end{align*} +On suppose que $n_j = \sum_{i=0}^M x_{(j-1)M+i}$. $n_j$ est le nombre de '1' dans $x_{(j-1)M+i} ... x_{jM}$. + +\begin{align*} +y_j &= \acc{0 \text{ si, } M-n_j > \frac{M}{2}}{1 \text{sinon, ie } n_j \geq \frac{M}{2}}\\ +\text{Pour $M = 3$, alors } x_1 &= 001\text{ }000\text{ }100\text{ }110\\ +\text{On a donc: } y_1 = 0 0 0 1 +\end{align*} + + +\begin{enumerate} +\item \begin{align*} +y_2 = (0100) \Rightarrow \hat{x_2} = 000\text{ }111\text{ }000\text{ }000 +\end{align*} + +\item On a $P(X=0) = 0.8$. Et $R = \frac{j}{Mj} = \frac{1}{M} $ bits/symbole.\\ +Pour M=2, y=0 si $n<\frac{M}{2}$ et 0 sinon, d'où:\\ +\begin{tabular}{|c|c|c|c|c|c|} +\hline +$\underline{X}$ & p & n & y & $\hat{\underline{x}}$ & d \\ +\hline +\hline +00 & $0.8^2$ & 0 & 0 & 00 & 0 \\ +\hline +01 & $0.8\times 0.2$ & 1 & 1 & 11 & 1 \\ +\hline +10 & $0.2 \times 0.8$ & 1 & 1 & 11 & 1 \\ +\hline +11 & $0.2^2$ & 2 & 1 & 11 & 0 \\ +\hline +\end{tabular} + +\begin{align*} +d(x,\hat{x}) &= \sum x_i \oplus \hat{x_i}\\ +D_2 &= \frac{1}{2}(0*0.8^2+1*0.8*0.2+1*0.8*0.2+0)\\ +\end{align*} +Pour $M=1$ on a $D_1 = 0$ et $R_1 = 1$ bits/symbole.\\ +Et l'autre qui demande à aller beaucoup plus vite... + + +n=0,...,M +$p_n = C_M^n*0.2^n * 0.8^{m-n}$ +Si $n<\frac{M}{2}$ $\hat{x}$ contient M 0 et x N 1, donc $d_n = n$ +Si $n\geq \frac{M}{2} $ $\hat{x}$ contient M bits de 1 et X M-n bits de 0 donc $d_n = M-n$ + +$D_n = \sum_{n=0}^{\lceil\frac{M}{2}\rceil - 1} C_M^n 0.2^n 0.8^{M-n} + \sum_{n = \lceil\frac{M}{2}}^{M} C_M^n 0.2^n 0.8^{M-N} (M-n) = \frac{1}{M}$ + +\item +\begin{align*} +x \longrightarrow y \longrightarrow Codeur \\ +1 \longrightarrow \frac{1}{M} \longrightarrow \frac{1}{M} H(Y) = R\\ +P(Y=0) = \sum_{n=0}^{\lceil\frac{M}{2}\rceil - 1} C_M^n 0.8^{M-n} 0.2^n\\ +P(Y=1) = 1-P(Y=0)\\ +H(Y) = -P(Y=0)log_2(P(Y=0)) - P(Y=1) log_2(P(Y=1)) +\end{align*} +\end{enumerate} + + +\section*{Exercice I-TD4: Codage prédictif d'une image} + +\begin{align*} +\underline{\underline{X}} = [\underline{\underline{X}}(:,1),\underline{\underline{X}}(:,2),...,\underline{\underline{X}}(:,256)]\\ +\underline{X_1} = \begin{pmatrix} +\underline{\underline{X}}(:,1)\\ +\underline{\underline{X}}(:,2)\\ +\vdots\\ +\underline{\underline{X}}(:,256) +\end{pmatrix} +\end{align*} + +\begin{enumerate} +\item L'hypothèse gaussienne est fausse, mais permet d'obtenir de bon ordre de grandeurs, $D(R) \leq D_g(R)$\\ + +\item On a $D(R) = \sigma_x^2 * 2^{-2R}$ pour une source gaussienne.\\ +$RSAB_{db} = 10 log_10 \frac{\sigma_x^2}{\sigma_x^2 2^{-2R}} \approx 6R$\\ +$RSAB_{db} \geq 30 dB \Rightarrow R \geq 5$ bits/pixel. + +\item \begin{align*} +\hat{x}(n) = [a_1 +r = E(x(n)x_p(n) = \begin{pmatrix} +\mu_x(1)\\ +\vdots +\mu_x(p) +\end{pmatrix}\\ +R = \begin{pmatrix} +\mu_x(0) & &\\ +\vdots & \mu_x(|i-j|) & \\ +\mu_x(p) & & +\end{pmatrix} +\end{align*} + +Des résultats random :\\ +Par définition : \\ +$\sigma_e^2 = (e^2(n))= E((x(n)-\hat{x(n)})^2)$ +Par minimisation de $\sigma_e^2$ donc en dérivant: +$a_p = R^{-1} r$ puisque R est inversible.\\ +\begin{align*} +\sigma_e^2 = \mu_x(0) - 2(R^{-1}r)^Tr + (R^{-1}r)^TR(R^{-1}r)\\ +=\mu_x(0) - r^TR^{-1}r +\end{align*} + +\item L'écart entre deux pics est 256. Les ressemblances des pixels d'une même ligne qui sont séparés de 256 pixels dans $\hat{x}$. Les maximums décroissent. + +\item Pour p=1 r vaut $\mu_x(1)$ et $R = \mu_x(0)$, ainsi $a_p = 0.95$. +Et $\sigma_e^2 = 255.95$. + +\item $D_e = \sigma_e^2 2^{-2R}$ +$RSBA_{db} = 10 log_{10} \frac{\sigma_x^2}{D_e} \approx10.4 + 6R = 30.$ +Donc R = 33 bits/symbole + +\item Gain de codage: +$RSAB^{(p)} - RSAB = 10.4 db$ + + + +\end{enumerate} + + + + +\end{document} \ No newline at end of file diff --git a/455-Codage_Sources/TP/TP3/Manip1.m b/455-Codage_Sources/TP/TP3/Manip1.m new file mode 100644 index 0000000..8737907 --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip1.m @@ -0,0 +1,51 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Codage INTRA (1/3) + +clear all; +file = fopen('Foreman.qcif','r'); + +% Affichage d'une image de la séquence +% [compY,compU,compV]=yuv_readimage(file,'qcif'); +% +% figure(1) +% colormap(gray) +% subplot(131); imagesc(compY); title('Y') +% subplot(132); imagesc(compU'); title('U') +% subplot(133); imagesc(compV'); title('V') + + +% Codage d'une séquence d'image successives +[compY,compU,compV]=yuv_readimage(file,'qcif'); +Y=zeros(size(compY,1),size(compY,2),5); +Yc= zeros(size(compY,1),size(compY,2),5); +PSNR=[]; +bpp=[]; +gamma = 1; + +for i=1:5 + [compY,compU,compV]=yuv_readimage(file,'qcif'); + [I_rec,b,r] = encodeINTRA(compY,gamma); + Y(:,:,i) = compY; + Yc(:,:,i) = I_rec; + PSNR(i)=b; + bpp(i) = r; +end + +gamma +mean(PSNR) +mean(bpp)*size(compY,1)*size(compY,2)*15 + +% Affichage des images de bases et des images codées de la séquence +% figure(1) +% colormap(gray) +% for i=1:5 +% subplot(1,5,i); imagesc(Y(:,:,i)); +% end +% +% figure(2) +% colormap(gray) +% for i=1:5 +% subplot(1,5,i); imagesc(Yc(:,:,i)); +% end + \ No newline at end of file diff --git a/455-Codage_Sources/TP/TP3/Manip2.m b/455-Codage_Sources/TP/TP3/Manip2.m new file mode 100644 index 0000000..9af325e --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip2.m @@ -0,0 +1,33 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Codage INTRA (2/3) +% Question 7 - PSNR moyen en fonction du débit moyen + +%clear all; +PSNRmoy=[]; +bpsmoy=[]; +gamma=1:10; + + +for k=1:size(gamma,2) + g=gamma(k); + file = fopen('Foreman.qcif','r'); + + PSNR=[]; + bpp=[]; + + for i=1:5 + [compY,~,~]=yuv_readimage(file,'qcif'); + [~,b,r] = encodeINTRA(compY,g); + PSNR(i)=b; + bpp(i) = r; + end + + PSNRmoy(k)=mean(PSNR); + bpsmoy(k)=mean(bpp)*size(compY,1)*size(compY,2)*15; +end + +figure(1) +subplot(131); plot(gamma,PSNRmoy); xlabel('gamma'); ylabel('PSNR moyen'); +subplot(132); plot(gamma,bpsmoy); xlabel('gamma'); ylabel('Debit moyen (bps)'); +subplot(133); plot(bpsmoy,PSNRmoy); xlabel('Debit moyen (bps)'); ylabel('PSNR moyen'); \ No newline at end of file diff --git a/455-Codage_Sources/TP/TP3/Manip3.m b/455-Codage_Sources/TP/TP3/Manip3.m new file mode 100644 index 0000000..f7a302a --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip3.m @@ -0,0 +1,25 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Codage INTRA (3/3) +% Question 8 - Qualité visuelle (INTRA) pour différentes valeurs du débit + +clear all; + +gamma=[0.1 1 3 5]; %Pas de quantification + +file = fopen('Foreman.qcif','r'); +[compY,~,~]=yuv_readimage(file,'qcif'); + +figure(1) +subplot(2,length(gamma)+1,1); imagesc(compY); title('Image non compressee'); + +colormap(gray) + +for k=1:size(gamma,2) + g=gamma(k); + [Yc,~,bpp] = encodeINTRA(compY,g); + d=bpp*size(compY,1)*size(compY,2)*15; + + subplot(2,length(gamma)+1,k+1); imagesc(Yc); title(strcat('gamma=',num2str(g),',','Debit=',num2str(d), 'bps')); + subplot(2,length(gamma)+1,length(gamma)+k+2); imagesc(compY-Yc); +end diff --git a/455-Codage_Sources/TP/TP3/Manip4.m b/455-Codage_Sources/TP/TP3/Manip4.m new file mode 100644 index 0000000..9bffbad --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip4.m @@ -0,0 +1,44 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Codage INTER (1/3) +% Questions 9 à 11 + +clear all; + +n=5; %Nombre d'images à coder +gamma=1; %Pas + +file = fopen('Foreman.qcif','r'); + +[compY,~,~]=yuv_readimage(file,'qcif'); +Y=zeros(size(compY,1),size(compY,2),n); %images avant codage +Yc= zeros(size(compY,1),size(compY,2),n); %images codées + +%Codage de la première image +[I_rec,PSNR,bpp] = encodeINTRA(compY,gamma); +Y(:,:,1) = compY; +Yc(:,:,1) = I_rec; + +%Pour les images suivantes, soustraction de l'image n-1 à l'image n avant +%codage +for k=2:n + [compY,~,~]=yuv_readimage(file,'qcif'); + Yk = compY - Yc(:,:,k-1); % différences par rapport à l'image décodée précédente + [I_rec,PSNR,bpp] = encodeINTRA(Yk,gamma); + + Y(:,:,k) = Yk; + Yc(:,:,k) = I_rec + Yc(:,:,k-1); % reconstruction à l'aide de l'image décodée précédente +end + +% Affichage des images de bases et des images codées de la séquence +figure(1) +colormap(gray) +for i=1:n + subplot(1,n,i); imagesc(Y(:,:,i)); +end + +figure(2) +colormap(gray) +for i=1:n + subplot(1,n,i); imagesc(Yc(:,:,i)); +end diff --git a/455-Codage_Sources/TP/TP3/Manip5.m b/455-Codage_Sources/TP/TP3/Manip5.m new file mode 100644 index 0000000..221e3a3 --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip5.m @@ -0,0 +1,52 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Codage INTER (2/3) +% Questions 12 + +%clear all; + +n=5; %Nombre d'images à coder +gamma=1:10; %Pas + +PSNRmoy=[]; +bpsmoy=[]; + + + +for i=1:length(gamma) + g = gamma(i); + + file = fopen('Foreman.qcif','r'); + [compY,~,~]=yuv_readimage(file,'qcif'); + PSNR_seq=[]; + bpp_seq=[]; + + %Codage de la première image + [I_rec,PSNR,bpp] = encodeINTRA(compY,g); + Y(:,:,1) = compY; + Yc(:,:,1) = I_rec; + PSNR_seq(1) = PSNR; + bpp_seq(1) = bpp; + + %Pour les images suivantes, soustraction de l'image n-1 à l'image n avant + %codage + for k=2:n + [compY,~,~]=yuv_readimage(file,'qcif'); + Yk = compY - Yc(:,:,k-1); % différences par rapport à l'image décodée précédente + [I_rec,PSNR,bpp] = encodeINTRA(Yk,g); + + Y(:,:,k) = Yk; + Yc(:,:,k) = I_rec + Yc(:,:,k-1); % reconstruction à l'aide de l'image décodée précédente + PSNR_seq(k) = PSNR; + bpp_seq(k) = bpp; + end + + PSNRmoy(i) = mean(PSNR_seq); + bpsmoy(i) = mean(bpp_seq)*size(compY,1)*size(compY,2)*15; + +end + +figure(1); +subplot(131); plot(gamma,PSNRmoy); xlabel('gamma'); ylabel('PSNR moyen'); +subplot(132); plot(gamma,bpsmoy); xlabel('gamma'); ylabel('Debit moyen (bps)'); +subplot(133); plot(bpsmoy,PSNRmoy); xlabel('Debit moyen (bps)'); ylabel('PSNR moyen'); \ No newline at end of file diff --git a/455-Codage_Sources/TP/TP3/Manip6.m b/455-Codage_Sources/TP/TP3/Manip6.m new file mode 100644 index 0000000..8eb9d3b --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip6.m @@ -0,0 +1,47 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Codage INTER (3/3) +% Question 13 - Qualité visuelle (INTER) pour différentes valeurs du débit + +clear all; + +n=5; +gamma=[0.1 1 3 5]; %Pas de quantification + +file = fopen('Foreman.qcif','r'); + +[compY,~,~]=yuv_readimage(file,'qcif'); +Y=zeros(size(compY,1),size(compY,2),n); %images avant codage +Yc= zeros(size(compY,1),size(compY,2),n); %images codées + + + +for i=1:size(gamma,2) + g=gamma(i); + + file = fopen('Foreman.qcif','r'); + [compY,~,~]=yuv_readimage(file,'qcif'); + %Codage de la première image + [I_rec,PSNR,bpp] = encodeINTRA(compY,g); + Y(:,:,1) = compY; + Yc(:,:,1) = I_rec; + + figure(1) + colormap(gray) + + + for k=2:n + [compY,~,~]=yuv_readimage(file,'qcif'); + Yk = compY - Yc(:,:,k-1); % différences par rapport à l'image décodée précédente + [I_rec,PSNR,bpp] = encodeINTRA(Yk,g); + + Y(:,:,k) = Yk; + Yc(:,:,k) = I_rec + Yc(:,:,k-1); % reconstruction à l'aide de l'image décodée précédente + end + + + d=bpp*size(compY,1)*size(compY,2)*15; + + subplot(1,length(gamma)+1,1); imagesc(compY); title('Image non compressee'); + subplot(1,length(gamma)+1,i+1); imagesc(Yc(:,:,end)); title(strcat('gamma=',num2str(g),',','Debit=',num2str(d), 'bps')); +end diff --git a/455-Codage_Sources/TP/TP3/Manip7.m b/455-Codage_Sources/TP/TP3/Manip7.m new file mode 100644 index 0000000..4d4d6f3 --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip7.m @@ -0,0 +1,43 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Compensation de mouvement (1/2) +% Codage d'une séquence + +clear all + +n=5; %Nombre d'images à coder +gamma=1; +blksize = 16; %taille des blocs +SearchRange = 8; %portée des vecteurs mouvements + +file = fopen('Foreman.qcif','r'); + +[compY,~,~]=yuv_readimage(file,'qcif'); +Y= zeros(size(compY,1),size(compY,2),n); %images de base +Yc= zeros(size(compY,1),size(compY,2),n); %images (dé)codées +Yp= zeros(size(compY,1),size(compY,2),n); %images prédites + +%Codage de la première image +[I_rec,PSNR,bpp] = encodeINTRA(compY,gamma); +Y(:,:,1) = compY; +Yc(:,:,1) = I_rec; + +for k = 2:n + [compY,~,~]=yuv_readimage(file,'qcif'); + Y(:,:,k) = compY; + compYr = Yc(:,:,k-1); + [compPred,~,~,~] = PicturePred(compY,compYr,blksize,SearchRange); + [I_rec,~,~] = encodeINTRA(compY-compPred,gamma); + + Yc(:,:,k) = compPred + I_rec; + Yp(:,:,k) = compPred; +end + +% Affichage des images de bases et des images codées de la séquence +figure(1) +colormap(gray) +for i=1:n + subplot(3,5,i); imagesc(Y(:,:,i)); + subplot(3,5,i+n); imagesc(Yp(:,:,i)); + subplot(3,5,i+2*n); imagesc(Y(:,:,i)-Yp(:,:,i)); +end diff --git a/455-Codage_Sources/TP/TP3/Manip8.m b/455-Codage_Sources/TP/TP3/Manip8.m new file mode 100644 index 0000000..9b3cae4 --- /dev/null +++ b/455-Codage_Sources/TP/TP3/Manip8.m @@ -0,0 +1,58 @@ +% Aymeric Arnould, Tom Colinot +% TP3 +% Compensation de mouvement (2/2) +% PSNR moyen et débit moyen + +%clear all + +n=5; %Nombre d'images à coder +gamma=1:10; +blksize = 16; %taille des blocs +SearchRange = 8; %portée des vecteurs mouvements + +PSNRmoy=[]; +bpsmoy=[]; +bpsmoy2=[]; + +for i=1:length(gamma) + g=gamma(i); + file = fopen('Foreman.qcif','r'); + + PSNR_seq=[]; + bpp_seq=[]; + bppMV_seq=[]; + + [compY,~,~]=yuv_readimage(file,'qcif'); + Yc= zeros(size(compY,1),size(compY,2),n); %images (dé)codées + + %Codage de la première image + [I_rec,PSNR,bpp] = encodeINTRA(compY,g); + Yc(:,:,1) = I_rec; + PSNR_seq(1) = PSNR; + bpp_seq(1) = bpp; + + for k = 2:n + [compY,~,~]=yuv_readimage(file,'qcif'); + compYr = Yc(:,:,k-1); + [compPred,~,~,bppMV] = PicturePred(compY,compYr,blksize,SearchRange); + [I_rec,~,bpp] = encodeINTRA(compY-compPred,g); + + Yc(:,:,k) = compPred + I_rec; + + PSNR_seq(k) = PSNR; + bpp_seq(k) = bpp; + bppMV_seq(k-1) = bppMV; + end + + PSNRmoy(i) = mean(PSNR_seq); + bpsmoy(i) = mean(bpp_seq)*size(compY,1)*size(compY,2)*15; %en ne tenant pas compte de bppMV + bpsmoy2(i) = (mean(bppMV_seq)+mean(bpp_seq))*size(compY,1)*size(compY,2)*15; %en tenant compte de bppMV + + fclose('all'); + +end + +figure(2); +subplot(131); plot(gamma,PSNRmoy); xlabel('gamma'); ylabel('PSNR moyen'); +subplot(132); plot(gamma,bpsmoy,gamma,bpsmoy2); xlabel('gamma'); ylabel('Debit moyen (bps)'); legend('Sans bppMV','Avec bppMV'); +subplot(133); plot(bpsmoy,PSNRmoy,bpsmoy2,PSNRmoy); xlabel('Debit moyen (bps)'); ylabel('PSNR moyen'); legend('Sans bppMV','Avec bppMV');