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 : nbf , 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 nbf 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 nbf = 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)) nbf , 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 ……………