partie 1 :Compression :

Codage Huffman 1

 

function [code_huff,dico]=traitement_huffman(coderle)

% Générer le code Huffman. (version modifiée)

 mat_occ=ocur (coderle);                  cliquez sur la fonction "ocur()" pour afficher son contenu

mat_occ=tri_cell_final (mat_occ); %matrice triée contient les éléments et leurs occurrences

cliquez sur la fonction "tri_cell_final()" pour afficher son contenu

[s1 taille]=size(mat_occ);

 % 1 seul élément

if taille==1

   dico{1,1}=mat_occ{1,1};

   dico{2,1}='0';

 for i=1:mat_occ{2,1}

    code_huff{i}=dico{2,1};

end % end if  

   return

end % end if

 % 2 éléments

if taille==2

   dico{1,1}=mat_occ{1,1};

   dico{2,1}='0';

   dico{1,2}=mat_occ{1,2};

   dico{2,2}='1';

  coderle=normaliser_type (coderle);        cliquez sur la fonction "normaliser_type()" pour afficher son contenu

  for i=1:length(coderle)

    if strcmp(dico{1,1},coderle{i})

     code_huff{i}=dico{2,1};

    else

      code_huff{i}=dico{2,2};

    end % end if

 end % end for

return

end % end if

 % 3 éléments

if taille==3

   dico{1,1}=mat_occ{1,1};

   dico{2,1}='10';

   dico{1,2}=mat_occ{1,2};

   dico{2,2}='1';

   dico{1,3}=mat_occ{1,3};

   dico{2,3}='0';

   coderle=normaliser_type (coderle);            

   code_huff=calcul_codehuff (coderle,dico); return  cliquez sur la fonction "calcul_codehuff()" pour afficher son contenu

end % end if

 %AUTRES cas

%modification du tableau

 taille2=round(taille/2);

 for i=1:2:taille2-1

    var=mat_occ{1,taille2+1-i};

    mat_occ{1,taille2+1-i}=mat_occ{1,taille-i};

    mat_occ{1,taille-i}=var;

    var=mat_occ{2,taille2+1-i};

    mat_occ{2,taille2+1-i}=mat_occ{2,taille-i};

    mat_occ{2,taille-i}=var;

  end % end for

 %Modification du tableau d'occurrrences

clear tab1;clear tab2;

 for i=1:taille2

   tab1{1,i}=mat_occ{1,i};

   tab1{2,i}=mat_occ{2,i};

end

k=1;

for i=taille2+1:taille

   tab2{1,k}=mat_occ{1,i};

   tab2{2,k}=mat_occ{2,i};

   k=k+1;

end

tab1=tri_cell_final (tab1);

tab2=tri_cell_final (tab2);

clear mat_occ;

mat_occ=[tab1 tab2];

% création des structures

 for i=1:taille

   st=struct('element',mat_occ{1,i},'occurrence',mat_occ{2,i});

   eval(['st' num2str(i) '=st;']);

end % end for

 %liaison des structures : création de l'arbre

% 0 > droit , 1 > gauche

%traitement sous-arbre gauche

k=1;

noeud_d=struct('noeudd',st1,'noeudg',st2,'racine',st1.occurrence+st2.occurrence); 

tab_bin{1,k}=st1.element;tab_bin{2,k}='1';

k=k+1;

tab_bin{1,k}=st2.element;tab_bin{2,k}='0';

k=k+1;

tab_bin{1,k}=noeud_d.racine;tab_bin{2,k}='1';

k=k+1;

 for i=3:round(taille2) 

  eval(['st_=st' num2str(i) ';' ]);

  noeud_d=struct('noeudd',noeud_d,'noeudg',st_,'racine',noeud_d.racine+st_.occurrence);

  tab_bin{1,k}=st_.element;tab_bin{2,k}='0';k=k+1;

  tab_bin{1,k}=noeud_d.racine;tab_bin{2,k}='1';k=k+1;

end % end for

 %traitement sous-arbre gauche

eval(['st_d=st' num2str(round(taille2)+1) ';']);

eval(['st_g=st' num2str(round(taille2)+2) ';']);

noeud_g=struct('noeudd',st_d,'noeudg',st_g,'racine',st_d.occurrence+st_g.occurrence); 

tab_bin{1,k}=st_d.element;tab_bin{2,k}='1';k=k+1;

tab_bin{1,k}=st_g.element;tab_bin{2,k}='0';k=k+1;

tab_bin{1,k}=noeud_g.racine;tab_bin{2,k}='1';k=k+1;

 if round((taille2)+2)==taille

tab_bin{1,k-1}=noeud_g.racine;tab_bin{2,k-1}='0'

tab_bin{1,k-2}=st_g.element;tab_bin{2,k-2}='1';

tab_bin{1,k-3}=st_d.element;tab_bin{2,k-3}='0';

end % end if

 if round(taille2+2)~=taille

for i=round(taille2)+3:taille-1

  eval(['st_=st' num2str(i) ';' ]);

  noeud_g=struct('noeudd',noeud_g,'noeudg',st_,'racine',noeud_g.racine+st_.occurrence);

  tab_bin{1,k}=st_.element;tab_bin{2,k}='0';k=k+1;

  tab_bin{1,k}=noeud_g.racine;tab_bin{2,k}='1';k=k+1;

end % end for

 i=taille;

  eval(['st_=st' num2str(i) ';' ]);

  noeud_g=struct('noeudd',noeud_g,'noeudg',st_,'racine',noeud_g.racine+st_.occurrence);

  tab_bin{1,k}=st_.element;tab_bin{2,k}='0';k=k+1;

  tab_bin{1,k}=noeud_g.racine;tab_bin{2,k}='0';

end %end if

%construction finale de l'arbre

arbre=struct('noeudg',noeud_g,'noeudd',noeud_d,'racine',noeud_d.racine + noeud_g.racine);

ta_inverse=inverser (tab_bin);         cliquez sur la fonction "inverser()" pour afficher son contenu

 %générer le code 0> gauche, 1> droite 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 if mod(2,taille)~=0

     taille2=round(length(ta_inverse)/2)-1;

 end

% sous-arbre gauche

i=1;

tab_code{1,i}=ta_inverse{1,i};

tab_code{2,i}=ta_inverse{2,i};

ch=ta_inverse{2,i};

 i=2;

 % -1 si length n'est pas un multiple de 2 sinon +0

 while i<=taille2

tab_code{1,i}=ta_inverse{1,i};

tab_code{2,i}=[ch ta_inverse{2,i}];

tab_code{1,i+1}=ta_inverse{1,i+1};

tab_code{2,i+1}=[ch ta_inverse{2,i+1}];

ch=tab_code{2,i+1};

i=i+2;

end % end while

 % sous-arbre droit

tab_code{1,i}=ta_inverse{1,i};

tab_code{2,i}=ta_inverse{2,i};

ch=ta_inverse{2,i};

i=i+1;

 while i<=length(ta_inverse)-1

tab_code{1,i}=ta_inverse{1,i};

tab_code{2,i}=[ch ta_inverse{2,i}];

tab_code{1,i+1}=ta_inverse{1,i+1};

tab_code{2,i+1}=[ch ta_inverse{2,i+1}];

ch=tab_code{2,i+1};

i=i+2;

end % end while

 %supprimer les racines

for i=1:length(tab_code)

if ischar(tab_code{1,i})   

    tab_code_final{1,i}=tab_code{1,i};

    tab_code_final{2,i}=tab_code{2,i};

end % end if

end % end for

 k=1;

for i=1:length(tab_code_final)

if ~isempty(tab_code_final{1,i})

dico{1,k}=tab_code_final{1,i};

dico{2,k}=tab_code_final{2,i};

      if strcmp(dico{2,k},'00') % si le code =00 on le remplace par 0

      dico{2,k}='0';     

      end % end if

      if strcmp(dico{2,k},'01') % si le code =01 on le remplace par 1

      dico{2,k}='1';     

      end %end if

k=k+1;

end % end if

end %end for

% construction du code huffman

coderle=normaliser_type (coderle);

code_huff=calcul_codehuff (coderle,dico);