2019-01-15 15:56:28 +01:00
\documentclass [main.tex] { subfiles}
\begin { document}
L'idée du codage prédictif est d'utiliser les corrélations (ressemblances) temporelles ou spatiales du signal à compresser.
2019-03-18 14:50:23 +01:00
\paragraph { Rappels sur la corrélation}
2019-01-15 15:56:28 +01:00
On considère une source $ X $ qui émet un signal constitué de $ x _ 1 , \dots ,x _ N $ considérés comme une réalisation d'une suite de variables aléatoires $ X _ 1 , \dots ,X _ N $ de moyenne nulle.
2019-04-30 18:28:12 +02:00
2019-01-15 15:56:28 +01:00
La fonction de corrélation permet de mesurer la ressemblance entre échantillons voisins :
\[ \gamma _ x ( n,k ) = E ( X _ nX _ { n + k } ) \]
Pour un signal stationnaire (dont les caractéristiques statistiques n'évoluent pas au cours du temps :
\[ \gamma _ x ( n,k ) = \gamma _ x ( k ) = E ( X _ nX _ { n + k } ) , \forall n \]
En pratique, on estime la corrélation à partir des échantillons du signal à compresser.
2019-03-18 14:50:23 +01:00
\begin { itemize}
\item Estimateur biaisé :
\[ \hat { \gamma _ x ^ { B } } ( k ) =
\begin { cases}
\displaystyle \frac { 1} { N} \sum _ { i=1} ^ { N-k} x_ i x_ { i+k} , \forall k \geq 0 \\ [2em]
\displaystyle \frac { 1} { N} \sum _ { i=-k} ^ N x_ i x_ { i+k} , \forall k \leq 0
\end { cases}
\]
\item Estimateur non biaisé
\[
\hat { \gamma _ x^ { NB} } (k) =\frac { 1} { N-|k|} \sum _ { i=1} ^ { N-k} x_ i x_ { i+k} \forall k \geq 0
\]
2019-01-15 15:56:28 +01:00
2019-03-18 14:50:23 +01:00
\end { itemize}
\begin { rem}
On préfère l'estimateur biaisé car il est plus stable numériquement.
\end { rem}
2019-01-15 15:56:28 +01:00
Avec Matlab, on l'obtient avec :
2019-03-18 14:50:23 +01:00
\begin { minted} { matlab}
[c,k] = xcorr(x,'biased');
plot(k,c); grid;
\end { minted}
2019-01-15 15:56:28 +01:00
$ \gamma _ x ( k ) $ est maximale en 0 et est égale à l'énergie $ \sigma ^ 2 $ du signal.
2019-03-11 16:31:32 +01:00
\section { Codage prédictif en boucle ouverte}
Schéma en boucle ouverte:
\begin { figure} [H]
\centering
2019-04-30 18:28:12 +02:00
\begin { tikzpicture} [scale=0.8,transform shape]
2019-03-11 16:31:32 +01:00
\sbEntree { E}
2019-03-18 14:50:23 +01:00
\node [above left] (X) at (E) { $ x _ n $ } ;
\draw (E.east) -- ++(-2em,0) (E.south) -- ++(0,4pt) ;
2019-03-11 16:31:32 +01:00
\sbDecaleNoeudy [5] { E} { mem}
\sbBloc { mem2} { Mémoire} { mem}
\sbBlocL { pred} { Prédiction} { mem2}
\sbRelieryx { E} { mem2}
\sbDecaleNoeudy [-5] { pred} { comp2}
\sbComp { comp} { comp2}
\sbRelierxy { pred} { comp}
\sbRelier { E} { comp}
\sbBlocL { Q} { Quantif} { comp}
\sbBlocL { C} { Codage entropique} { Q}
\sbSortie [5] { S} { C}
\sbRelier [0100..1] { C} { S}
\end { tikzpicture}
\caption { Emetteur en boucle ouverte}
\end { figure}
\begin { figure} [H]
\centering
2019-04-30 18:28:12 +02:00
\begin { tikzpicture} [scale=0.8,transform shape]
2019-03-11 16:31:32 +01:00
\sbEntree { E}
\sbBlocL { Dc} { Décodeur entropique} { E}
\sbBlocL { Di} { Desindexation} { Dc}
\sbSumb [7] { comp} { Di}
\sbRelier { Di} { comp}
\sbDecaleNoeudy [5] { comp} { comp2}
\sbBloc { pred} { Prédicteur} { comp2}
\sbBlocL { mem} { Mémoire} { pred}
\sbDecaleNoeudy [-5] { mem} { S}
\sbSortie [5] { X} { S}
\sbRelierxy { pred} { comp}
\sbRelieryx { X} { mem}
\sbRelier { comp} { X}
\end { tikzpicture}
\caption { Recepteur en boucle ouverte}
\end { figure}
Ca marche mais la quantification introduit des erreurs qui peuvent s'accumuler. On s'en sort en réinitialisant le codeur régulièrement.
\subsection { Prédicteur linéaire optimal à 1 pas}
2019-01-15 15:56:28 +01:00
On souhaite prédire la valeur de $ X _ n $ à partir de la valeur de $ X _ { n - 1 } $ .
Le prédicteur sera linéaire :
\[ \hat { X _ n } = a _ 1 X _ { n - 1 } \]
On cherche la valeur de $ a _ 1 $ qui minimise $ e = E ( ( X _ n - \hat { X _ n } ) ^ 2 ) $
\begin { align*}
e & = E((X_ n-a_ 1X_ { n-1} )^ 2) \\
& = E(X_ n^ 2 -a_ 1^ 2 X_ { n-1} ^ 2 - 2a_ 1X_ { n-1} X_ n) \\
& = E(X_ n^ 2) + a_ 1^ 2E(X_ { n-1} ^ 2) - 2a_ 1E(X_ { n-1} X_ n)\\
e & = \gamma _ x(0) + a_ 1^ 2 \gamma _ x(0) - 2a_ 1 \gamma _ x(1) \text { par stationnarité} \\
\derivp [e] { a_ 1} |_ { \hat { a_ 1} } = 0 & \Leftrightarrow 2 \hat { a_ 1} \gamma _ x(0) - 2 \gamma _ x(1) = 0\\
& \Rightarrow \hat { a_ 1} = \frac { \gamma _ x(1)} { \gamma _ x(0)}
\end { align*}
\begin { rem}
Lorsque le signal sera très corrélé, $ \gamma _ x ( 1 ) \approx \gamma _ x ( 0 ) $ et $ \hat { a _ 1 } \approx 1 $ . Pour un signal peu corrélé, $ \gamma _ x ( 1 ) \approx 0 $ et $ \hat { a _ 1 } \approx 0 $ .
\end { rem}
Pour la valeur de $ \hat { a _ 1 } $ obtenue, on a
\begin { align*}
\hat { e} & = \gamma _ x(0) + (\frac { \gamma _ x(1)} { \gamma _ x(0)} )^ 2 \gamma _ x(0) - 2 \frac { \gamma _ x(1)^ 2} { \gamma _ x(0)} \\
& = \frac { \gamma _ x(0)^ 2-\gamma _ x(1)^ 2} { \gamma _ x(0)} \leq \gamma _ x(0)
\end { align*}
$ \hat { e } $ est l'énergie de la partie qui n'a pas pu être prédite de $ x _ 1 , \dots ,x _ N $ .\\
2019-03-11 16:31:32 +01:00
Lorsque le signal est fortement corrélé, $ \gamma _ x ( 1 ) \simeq \gamma _ x ( 0 ) $ et $ \hat { a _ 1 } \simeq 1 $ .
2019-01-15 15:56:28 +01:00
Le résidu de prédiction a une variance plus faible. Si on le quantifie, il permettra de reconstituer le signal initial avec une distorsion plus faible.
2019-03-18 14:50:23 +01:00
\subsection { Prédiction à $ p $ pas}
2019-01-15 15:56:28 +01:00
2019-03-11 16:31:32 +01:00
On cherche à prédire $ \vec { X _ n } $ à partir des échantillons précédents $ X _ { n - 1 } , \dots ,X _ { n - p } $ .
\newcommand { \ap } { \vec { a} }
\newcommand { \Xn } { \vec { X_ n} }
\newcommand { \cp } { \vec { c} }
\newcommand { \Rp } { \vec { R} }
2019-01-15 15:56:28 +01:00
2019-03-11 16:31:32 +01:00
\[ \hat { X _ n } = a _ 1 X _ { n - 1 } + \dots + a _ pX _ { n - p } = \ap ^ T \Xn \quad \text { avec } \quad \ap ^ T = ( a _ 1 \dots a _ p ) \text { et } \Xn ^ T = ( X _ { n - 1 } \dots X _ { n - p } ) \]
2019-01-15 15:56:28 +01:00
On cherche $ \ap $ minimisant
\begin { align*}
e & = E((X_ n-\hat { X_ n} )^ 2) \\
& = E((X_ n-\ap ^ T\Xn )^ 2) \\
& = E(X_ n^ 2) + \ap ^ T E(\Xn \Xn ^ T) \ap -2\ap ^ t E(X_ n\Xn ) \\
\text { Or, } E(X_ n\Xn )& =(E(X_ nX_ { n-1} ),\dots ,E(X_ nX_ { n-p} ))^ T \\
& = (\gamma _ x(1), \gamma _ x(2),\dots ,\gamma _ x(p))^ T = \cp \\
\text { De plus, } E(\Xn \Xn ^ T) & =
\left [
\begin { array} { cccc}
E(X_ { n-1} X_ { n-1} ) & E(X_ { n-1} X_ { n-2} ) & \dots & E(X_ { n-1} X_ { n-p} ) \\
E(X_ { n-2} X_ { n-1} ) & \ddots & & \vdots \\
\vdots & & \ddots & \vdots \\
E(X_ { n-p} X_ { n-1} ) & \dots & \dots & E(X_ { n-p} X_ { n-p} )
\end { array}
\right ] \\
& =
\left [
\begin { array} { cccc}
\gamma _ x(0) & \gamma _ x(1) & \dots & \gamma _ x(p-1) \\
\gamma _ x(1) & \gamma _ x(0) & & \vdots \\
\vdots & & \ddots & \gamma _ x(1) \\
\gamma _ x(p-1) & \dots & \gamma _ x(1) & \gamma _ x(0)
\end { array}
\right ] = \Rp \\
\text { donc } e & = \gamma _ x(0) + \ap ^ T \Rp \ap - 2 \ap ^ T \cp
\end { align*}
2019-03-11 16:34:58 +01:00
\[ \left . \derivp [ e ] { \ap } \right | _ { \hat { \ap } } = 0 \quad \Leftrightarrow \quad \vec { 0 } + 2 \Rp \hat { \ap } - 2 \cp = 0 \quad \Rightarrow \quad \hat { \ap } = \Rp ^ { - 1 } \cp \]
2019-01-15 15:56:28 +01:00
Pour cette valeur de $ \hat { \ap } $ , on a
\begin { align*}
\hat { e} & = \gamma _ x(0) + \cp ^ T \Rp ^ { -1} \Rp \Rp ^ { -1} \cp -2\cp ^ T\Rp ^ { -1} \cp \\
& = \gamma _ x(0) - \cp ^ T \Rp ^ { -1} \cp \leq \gamma _ x(0)
\end { align*}
Ce prédicteur à $ p $ pas est en général plus efficace que le prédicteur à 1 pas mais il est plus complexe.
2019-03-18 14:50:23 +01:00
\subsection { Mise en oeuvre du prédicteur}
2019-01-15 15:56:28 +01:00
2019-03-18 14:50:23 +01:00
Il faut que le récepteur disposent également des coefficients de prédiction optimal. Il peuvent :
2019-01-15 15:56:28 +01:00
\begin { itemize}
2019-03-18 14:50:23 +01:00
\item être transmis mais cela coute du débit
\item Etre réestimés au récepteur mais cela rend le récepteur plus complexe.
2019-01-15 15:56:28 +01:00
\end { itemize}
2019-03-18 14:50:23 +01:00
Pour le réglage du prédicteur, on distingue plusieurs méthodes :
2019-01-15 15:56:28 +01:00
2019-03-18 14:50:23 +01:00
\subsubsection { Fenêtres fixes}
On découpe le signal en blocs de $ M $ échantillons et on recalcule le prédicteur sur chaque bloc.
Les échantillons de la $ m $ -ième fenêtres (pour$ ( m - 1 ) M + 1 $ à $ mM $ ):
\begin { itemize}
\item servent à extimer $ \hat { \gamma } _ x ( k ) $ et les coefficients de prédiction utilisé pour la $ m + 1 $ -ème fenêtre.
\item sont comprimés en utilisant le prédicteur optimal calculé das la fenêtre $ m - 1 $ .
\item Le recepteur fait les mêmes opérations.
\end { itemize}
\begin { rem}
Pour la première fenêtre on utilise le prédicteur à 1 pas.
Cette méthode ne fonctionne que pour des compressions sans pertes ou a débit élevé.
\end { rem}
Avantages :
\begin { itemize}
\item sa simplicité de mise ne œuvre
\item permet de s'adapter aux non-stationnarités
\end { itemize}
Inconvénient :
\begin { itemize}
\item débit nécessaire à la transmission des $ \vec { \hat { a } } _ { opt } $ .
\end { itemize}
\subsubsection { Fenêtres glissantes}
On travaille sur une fenêtre glissante contenant les N échantillons décalés : $ \vec { \hat { X } } _ n = ( \hat { x } _ { n - 1 } , ..., \hat { x } _ { n - N } ) ^ T $ .
2019-01-15 15:56:28 +01:00
\begin { itemize}
2019-03-18 14:50:23 +01:00
\item On estime $ \gamma _ x ( k ) $ à partir des échantillons.
\item On en déduit le prédicteur à $ p $ pas.
\item On prédi $ x _ n $ et on compresse le résidu.
\item Au récepteur dans le cas c'un codage sans pertes on dispose également de $ x _ { n - N } ... x _ { n - 1 } $ . et on va pouvoir faire les mêmes opérations pour obtenir $ \hat { x _ n } $ auquel il rajoutera le résidu du codeur.
2019-01-15 15:56:28 +01:00
\end { itemize}
2019-03-18 14:50:23 +01:00
\begin { rem}
Pour les $ N $ premiers échantillons on peux utiliser un prédicteur à 1 pas avec $ a = 0 $ ou $ a = 0 $
\end { rem}
2019-01-15 15:56:28 +01:00
2019-03-18 14:50:23 +01:00
Avantages :
\begin { itemize}
\item Il est très adaptatif.
\item On ne transmet plus $ \vec { \hat { a } } _ { opt } $
\end { itemize}
Inconvénient :
\begin { itemize}
\item et bien... c'est pas simple.
\end { itemize}
2019-03-18 16:45:12 +01:00
\section { Schéma de prédiction en boucle fermée}
Dans les schémas de codage avec pertes le récepteur dispose de $ \tilde { x } _ { n - M } ... \tilde { x } _ { n - 1 } $ qui sont différents de $ x _ { n - M } ... x _ { n - 1 } $ .
Les fonctions de corrélations estimées ainsi que les prédicteurs seront différents. L'erreur entre le signal initial et le signal reconstitué aura tendance à augmenter.
Pour résoudre ce problème le codeur va comprendre un décodeur ``local'' qui va permettre d'estimer $ \tilde { x } _ { n - M } ... \tilde { x } _ { n - 1 } $ . Ensuite $ \gamma _ x $ et le prédicteurs seront estimée à partir de $ \tilde { x } $ et non de $ x $ .
On montre qu'avec ce schéma les erreurs de quantification ne s'accumule pas.
\[
x_ n-\tilde { x} _ n= x_ n -\hat { x} _ n+\hat { x} _ n+\tilde { x} _ n = e_ n - \tilde { e} _ n
\]
Sur le $ n $ -ième échantillion on a seulement l'erreur de quantification associé a cet échantillon.
\begin { rem}
La qualité du prédicteur va influencer le débit et dans une moindre mesure la distorsion
\end { rem}
2019-01-15 15:56:28 +01:00
\end { document}
2019-01-28 13:08:24 +01:00
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "main"
%%% End: