Corps de la fonction

publicité
Traitement des données
TP : Codage entroprique de Shannon-Fanno
Le but de ce TP est de réaliser un programme, capable, à partir d’une densité de
probabilité discrète, de réaliser un code de type Shannon-Fanno. Pour ce faire, on propose
de réaliser un algorithme par étape.
Remarque : L’algorithme utilisé ici n’est absolument pas exhaustif.
1. Réaliser une fonction de dichotomie d’un vecteur de telle façon que :
v1, v2  dichotomie (v)
exemple :
v = [ 0.3, 0.2, 0.15, 0.125, 0.1, 0.05, 0.05,0.025 ]
v1 = [ 0.3,0.2, 0, 0, 0, 0, 0, 0 ]
v2 = [ 0.15, 0.125, 0.1, 0.05, 0.025 ]
2. Réaliser une fonction d’ajout dans une liste chaînée. Cette liste se présente sous la
forme d’une matrice, composée de n vecteurs ligne. Cette fonction possède le
prototype suivant :
nbf , ef  ajout (ei, v, v1,v2 )
ei est la matrice composée des n vecteurs lignes
v est le vecteur à trouver dans cette matrice
v1 et v2 sont les résultats de la décomposition dichotomique de v
nbf représente la taille de la matrice résultat, soit la taille de ei +1
ef est la matrice résultat
exemple :
ei =
12000
34500
67000
v=34500
ef =
12000
30000
45000
67000
nbf = 4
v1 = 3 0 0 0 0
v2= 4 5 0 0 0
3. Réaliser une fonction de codage permettant d’initialiser une matrice code.
On rappelle que sous Matlab la notion de type n’existe pas. De même, quel que
soit le langage utilisé, il est difficile de créer et manipuler des mots de longueurs
variables. On se propose sous Matlab de manipuler une matrice d’entiers ou
chaque eij sera assimilé à un bit.
De façon à distinguer la notion de bit non alloué, il est nécessaire de choisir une
valeur entière correspondante à la valeur vide ‘9 par exemple’. Avant l’appel de
cette fonction on va donc allouer une matrice de hauteur correspondante au
nombre de symbole, et de profondeur suffisante.
Le prototype de la fonction de codage peut être le suivant :
codef  codage (d, v1, v2, codei )
d est la densité de probabilité initiale
v1 et v2 représentent les deux vecteurs ensemble dans cette densité, obtenus
par la fonction de dichotomie.
codei est la matrice codage en cours de création
Exemple :
d = [ 0.3, 0.2, 0.15, 0.125, 0.1, 0.05, 0.05,0.025 ]
v1 = [ 0.15, 0.125, 0, 0, 0, 0, 0, 0 ]
v2 = [ 0.1, 0.05, 0.05, 0.025, 0, 0, 0, 0 ]
codei =
1999999
1999999
0999999
0999999
0999999
0999999
0999999
0999999
codef =
1999999
1999999
0199999
0199999
0099999
0099999
0099999
0099999
4. On se propose maintenant de se servir de ces fonctions dans une fonction de
création du code de Shannon-Fanno. Cette fonction a le prototype suivant :
code  sf (d)
Voici un début d’algorithme de cette fonction :
initialisation (codei)
…. des initialisations ……..
tant que fin  nulle
…. des initialisations ……..
pour i variant de 1 à nb
si taille e(i)  1
fin  nulle
v1, v2  dichotomie (e(i))
nbf , ef  ajout (ei, e(i), v1,v2 )
code  codage (d, v1, v2, code )
fin si
fin pour
…. des initialisations ……..
fin tant que
Remarque : La taille de e(i) correspond au nombre d’éléments non nuls dans le
vecteur. Elle pourra être obtenue par la réalisation d’une fonction, ou par l’utilisation
combinée des fonctions Matlab « find » et « max ».
5. Afin de tester la généricité de cette fonction, on se propose de réaliser une fonction
de création de densité de probabilité aléatoire. Cette fonction a le prototype
suivant :
d  densite (nbsymbole )
Elle retournera une densité, ou les probabilités seront classées par ordre
décroissant.
Annexes
Les fichiers de commandes Matlab « nomdefichier.m » doivent se trouver sous le répertoire
Matlab\Work
Ils s’appellent depuis le shell de la façon suivante :
nomdefichier
Pour plus de détail sur le fonctionnement des commandes, on peut se reporter à l’aide du shell
de Matlab :
help nom_de_la_commande
De même il est possible d’utiliser des fichiers de commande Matlab annexe sous forme de
fonction : Exemple de structure du fichier ma_fonction.m :
function result = ma_fonction(arg1,arg2,arg3)
…………… Corps de la fonction ……………
result = ………… valeur à retourner ……………
Téléchargement