Projet de Traitement Numérique du Signal L`Algorithme De Huffman

publicité
LE Ange
RALLE Laurine
GAILDRAUD Marine
MEKAMOU DAMOU Melissa
KHOURI Nadine
M1 MMD
Projet de Traitement Numérique
du Signal
L’Algorithme De Huffman
Julien SALOMON
Présentation du programme
Nous avons codé notre programme de compression sans perte à l’aide du logiciel Matlab. Notre
programme s’appelle “compression”, et est stocké dans le fichier compression.m. Il permet d’encoder un
fichier .txt avec l’algorithme d’Huffman , de Fano-Shannon et dans une moindre mesure avec l’algorithme
arithmétique, et offre la possibilité de décoder des fichiers .txt codés selon le fichier et l’algorithme
choisis. L’utilisation de notre programme est très simple, il suffit de l’exécuter dans Matlab (sans ajouter
d’argument) puis de se laisser guider :
Remarque : L’invite de commande de Matlab est >>, quand l’invite de commande est -> cela signifie que
l’utilisateur se trouve dans le programme compression, il est alors possible de le quitter à
tout moment en pressant la combinaison de touches crtl+c. Remarquons aussi qu’il est
impossible d’afficher le code source de compression quand celui-ci est en cours d’exécution.
Notre programme est composé de 12 fonctions : compression, importation, tri, affichage, details,
huffman, shannon, encodage, decodage, arithmetique, arithmetiquedetails, decodearithmetique et de
9 variables principales : choix, text, nom, alphabet, frequence, dictionnaire, code, borne_inf, borne_sup.
Les variables principales :
 choix : string égal à “Huffman” , “Shannon” ou “Arithmetique” en fonction de l’algorithme
choisis.
 text : Matrice de string contenant le texte du fichier .txt importé (les retours à la ligne sont
représentés par char(13) ).
 nom : string égal au nom du fichier .txt importé.
 alphabet : matrice de string contenant les différents caractères du fichier .txt importé.





fréquence : matrice d’entiers contenant les fréquences d’apparitions des différents caractères du
fichier .txt importé.
dictionnaire : matrice de string contenant les différents caractères du fichier .txt importé rangés
par ordre décroissant en fonction de leur fréquence d’apparition.
code : list de string contenant les codes Huffman (ou Shannon ou Arithmetique) des lettres du
fichier .txt importé.
Borne_inf : tableau contenant les bornes inférieurs des intervalles représentants les probabilités
pour le codage arithmétique.
Borne_sup : tableau contenant les bornes supérieurs des intervalles représentants les
probabilités pour le codage arithmétique.
Les fonctions :
 compression : fonction principale qui appelle les autres fonctions, qui affiche le menu de
sélection de d’algorithmes et qui définie la variable choix.
 importation : importe dans Matlab le fichier .txt choisi comme base pour l’algorithme de
Huffman (ou de Shannon ou Arithmetique) et définie les variables text et nom.
 tri : traite la variable text afin de définir les variables alphabet et frequence.
 huffman : algorithme d’Huffman, fonction qui définie les variables dictionnaire et code.
 shannon : algorithme de Shannon, fonction qui définie les variables dictionnaire et code.
 encodage : enregistre dans un fichier .txt le fichier importé codé selon l’algorithme de Huffman
(ou de Shannon).
 affichage : affiche le code Huffman (ou Shannon) du fichier importé et l’enregistre dans un fichier
.txt.
 details : affiches les détails de compression ainsi que l’entropie et les enregistre dans un fichier
.txt.
 decodage : importe et décode un fichier .txt codé et l’enregistre dans un fichier.txt.
 arithmétique : algorithme du codage arithmétique, fonction qui définie les variables Borne_inf
et Borne_sup .
 arithmetiquedetails : affiche les détails de compression de l’algorithme du codage arithmétique
et enregistre dans un fichier .txt le fichier importé codé.
 decodearithmetique : importe et décode un fichier .txt codé selon l’algorithme arithmétique.
Codage de Shannon-Fano
Le codage de Shannon-Fano est une construction d'un code préfixe qui repose sur la distribution de
probabilité des symboles de l'alphabet. Le principe est très simple ; il consiste à trier tous les symboles à
compresser selon leur probabilité. L’ensemble trié obtenu est alors coupé en deux parties de telle façon
que les probabilités des deux parties soient le plus proche possible de l'égalité (la probabilité d'une partie
étant égale à la somme des probabilités des différents symboles de cette partie). Chaque symbole de la
première partie aura un code qui commencera par 0 et chaque symbole de la seconde partie aura un code
qui commencera par 1. On recommence le processus récursivement sur les deux sous-parties jusqu'à ce
qu'il ne reste plus qu'un terme dans le tableau, le symbole correspondant aura pour code la
concaténation des 0 et 1 des différents appels récursifs.
Pour résumer, le codage de Shannon Fano peut se découper selon les 4 étapes suivantes :
1) on classe les symboles par ordre de probabilités,
2) on partage l’ensemble des symboles en deux sous-ensembles, les 2 sous-ensembles devant être de
probabilités aussi proches que possible,
3) on attribue à chaque sous-ensemble l’état 0 ou 1,
4) on re-partage chaque sous-ensemble en deux sous-ensembles de probabilités aussi proches que
possible, on attribue à chaque nouveau sous-ensemble l’état 0 ou 1, etc.
L’algorithme est arrêté lorsque l’on atteint des sous-ensembles ne comportant qu’un symbole.
Comparaison avec le codage de Huffman
La principale différence entre l'algortihme de Huffman et celui de Shannon Fano réside dans leur
approche:
-l'approche du codage de Shannon-Fano est descendante : l'algorithme part de l'ensemble des symboles
et divise cet ensemble récursivement jusqu'à arriver à des parties ne contenant qu'un seul symbole.
L'inconvénient de cette approche est que, lorsqu'il n'est pas possible de séparer un ensemble de symboles
et deux sous-ensembles de probabilités à peu près égales, les codes produits ne sont pas optimaux.
-l'approche du codage de Huffman est ascendante : l'algorithme part des symboles et regroupe ceux
ayant la probabilité la plus faible, jusqu'à avoir regroupé tous les symboles. Cette approche permet
d'obtenir systématiquement un code optimal au niveau du symbole, dans le pire cas de la même longueur
que le code de Shannon-Fano équivalent, dans tous les autres cas plus court. Cependant, l'algorithme de
Shannon-Fano donne de meilleurs résultats quand la dispersion des fréquences est importante.
En pratique, comme le codage de Huffman est très similaire au codage de Shannon-Fano et donne de
meilleurs résultats, ce dernier n'est pratiquement plus utilisé aujourd'hui.
Nous avons tester ces algorithmes sur des fichiers texts provenant d’articles de Wikipedia :
Téléchargement