日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Huffman編碼用MTLAB的實(shí)現(xiàn)及編碼注釋

 aixuexidewau1 2019-05-09

一、實(shí)驗(yàn)內(nèi)容

1、用Matlab實(shí)現(xiàn)Huffman編碼算法程序;

2、要求程序輸出顯示所有的碼字以及編碼效率;

        3、設(shè)計(jì)簡(jiǎn)單的輸入界面(可以是簡(jiǎn)單的文字提示信息),程序運(yùn)行時(shí)提示用 戶輸入代表信源符號(hào)概率的向量;要對(duì)用戶輸入的概率向量進(jìn)行合法性檢查。

二、實(shí)驗(yàn)原理

1、二進(jìn)制Huffman編碼的基本原理及算法

(1) 把信源符號(hào)集中的所有符號(hào)按概率從大到小排隊(duì)。

(2) 取概率最小的兩個(gè)符號(hào)作為兩片葉子合并(縮減)到一個(gè) 節(jié)點(diǎn)。

(3) 視此節(jié)點(diǎn)為新符號(hào),其概率等于被合并(縮減)的兩個(gè)概率之和,參與概率排隊(duì)。

(4) 重復(fù)(2)(3)兩步驟,直至全部符號(hào)都被合并(縮減)到根。 

(5) 從根出發(fā),對(duì)各分枝標(biāo)記0和1。從根到葉的路徑就給出了各個(gè)碼字的編碼和碼長(zhǎng)。

2、程序設(shè)計(jì)的原理

 (1)程序的輸入:以一維數(shù)組的形式輸入要進(jìn)行huffman編碼的信源符號(hào)的概率,在運(yùn)行該程序前,顯示文字提示信息,提示所要輸入的概率矢量;然后對(duì)輸入的概率矢量進(jìn)行合法性判斷,原則為:如果概率矢量中存在小于0的項(xiàng),則輸入不合法,提示重新輸入;如果概率矢量的求和大于1,則輸入也不合法,提示重新輸入。

(2)huffman編碼具體實(shí)現(xiàn)原理:

      1>在輸入的概率矩陣p正確的前提條件下,對(duì)p進(jìn)行排序,并用矩陣L記錄p排序之前各元素的順序,然后將排序后的概率數(shù)組p的前兩項(xiàng),即概率最小的兩個(gè)數(shù)加和,得到新的一組概率序列,重復(fù)以上過程,最后得到一個(gè)記錄概率加和過程的矩陣p以及每次排序之前概率順序的矩陣a。

2>新生成一個(gè)n-1行n列,并且每個(gè)元素含有n個(gè)字符的空白矩陣,然后進(jìn)行huffman編碼:

      將c矩陣的第n-1行的第一和第二個(gè)元素分別令為0和1(表示在編碼時(shí),根 節(jié)點(diǎn)之下的概率較小的元素后補(bǔ)0,概率較大的元素后補(bǔ)1,后面的編碼都遵守這個(gè)原則)

      然后對(duì)n-i-1的第一、二個(gè)元素進(jìn)行編碼,首先在矩陣a中第n-i行找到值為1所在的位置,然后在c矩陣中第n-i行中找到對(duì)應(yīng)位置的編碼(該編碼即為第n-i-1行第一、二個(gè)元素的根節(jié)點(diǎn)),則矩陣c的第n-i行的第一、二個(gè)元素的n-1的字符為以上求得的編碼值,根據(jù)之前的規(guī)則,第一個(gè)元素最后補(bǔ)0,第二個(gè)元素最后補(bǔ)1,則完成該行的第一二個(gè)元素的編碼,

     最后將該行的其他元素按照“矩陣c中第n-i行第j+1列的值等于對(duì)應(yīng)于a矩陣中第n-i+1行中值為j+1的前面一個(gè)元素的位置在c矩陣中的編碼值”的原則進(jìn)行賦值,重復(fù)以上過程即可完成huffman編碼。

3>計(jì)算信源熵和平均碼長(zhǎng),其比值即為編碼密碼效率。

n-i行的第一、二個(gè)元素的n-1的字符為以上求得的編碼值,根據(jù)之前的規(guī)則,第一個(gè)元素最后補(bǔ)0,第二個(gè)元素最后補(bǔ)1,則完成該行的第一二個(gè)元素的編碼,

      最后將該行的其他元素按照“矩陣c中第n-i行第j+1列的值等于對(duì)應(yīng)于a矩陣中第n-i+1行中值為j+1的前面一個(gè)元素的位置在c矩陣中的編碼值”的原則進(jìn)行賦值,重復(fù)以上過程即可完成huffman編碼。

P=input('please input a nuber:'); %提示輸入界面
  if(find(P<0))
        disp('The probabilities in huffman can not less than 0!');  
        P=input('please input a number:') 
  end 
  if  abs(sum(P))>1
      disp('The sum of the probabilities in huffman can more than 1!');
      P=input('please input a number:') 
  end 
 [w,k]=Huffman(P);
 disp('碼字');
 disp(w)
 disp('碼長(zhǎng)');
 disp(k)

調(diào)用函數(shù):


function [a,b]=Huffman(P)
P=sort(P)
A=P;
B=[];
i=1;
LL=length(P);
L=LL;
B(1,:)=P;
while(L>2)
      i=i+1;
      B(i,1)=A(1)+A(2);
      C(i-1)=B(i,1);
  for j=2:(L-1)
     B(i,j)=A(j+1);
  end
 L=L-1;
 B(i,1:L)=sort(B(i,1:L));
 A=B(i,1:L);
end
K=zeros(i,LL);
K(i,1:2)=1;
for ll=1:i
    for n=1:LL
W(ll,n)={'0'};
    end
end
W(i,1)={'1'};
 
for m=(i-1):-1:1
    BB=B(m,1)+B(m,2);
     BBB=find(B(m+1,:)==BB);
     BBB=BBB(1);
     
        W(m,1:2)=W(m+1,BBB);
        K(m,1:2)=K(m+1,BBB);  
        W(m,1)=strcat(W(m,1),'1');
        W(m,2)=strcat(W(m,2),'0');
        K(m,1:2)=K(m,1:2)+1;
        uu=zeros(1,LL);
        uu(1)=BBB;
        y=1;
         for n=3:(LL+1-m)
              fd3=find(B(m,n)==B(m+1,:));
              for pp=1:length(fd3)
                  kk=isempty(find(uu==fd3(pp)));
                 if(kk==1)
                     y=y+1;                   
                     fd3=fd3(pp);
                     uu(y)=fd3;
                     break;
                 end
              end
                  W(m,n)=W(m+1,fd3);
                  K(m,n)=K(m+1,fd3);  
         end
end
a=W(1,:);
b=K(1,:);

結(jié)果顯示:


please input a nuber:[0.1 0.18 0.4 0.05 0.06 0.1 0.07 0.04]

P =
    0.0400    0.0500    0.0600    0.0700    0.1000    0.1000    0.1800    0.4000
碼字
    '00011'    '00010'    '0101'    '0100'    '0000'    '011'    '001'    '1'
碼長(zhǎng)
     5     5     4     4     4     3     3     1  

 




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多