資源描述:
《二元霍夫曼編碼 - 信息論與編碼實驗報告》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、計算機與信息工程學院綜合性實驗報告專業(yè):通信工程年級/班級:2011級2013—2014學年第一學期課程名稱信息論與編碼指導教師劉艷芳本組成員學號姓名實驗地點計科樓111實驗時間周五5-6節(jié)項目名稱二元霍夫曼編碼實驗類型綜合性一、實驗目的根據霍夫曼編碼的原理,用MATLAB設計進行霍夫曼編碼的程序,并得出正確的結果。二、實驗儀器或設備1、一臺計算機。2、MATLABr2013a。三、二元霍夫曼編碼原理1、將信源消息符號按其出現的概率大小依次排列,p1>p2>…>pq2、取兩個概率最小的字母分別配以0和1兩個碼元,并將這兩個概率相加作為一個新字母的概率,從而得到只包含q-1個符號的新信源S1
2、。3、對重排后的縮減信源S1重新以遞減次序排序,兩個概率最小符號重復步驟(2)的過程。4、不斷繼續(xù)上述過程,直到最后兩個符號配以0和1為止。5、從最后一級開始,向前返回得到各個信源符號所對應的碼元序列,即相應的碼字。四、霍夫曼編碼實現程序function[outnum]=lml_huffman(a)%主程序,輸入一組概率,輸出此組概率的霍夫曼編碼%a:一組概率值,如a=[0.20.30.10.4]等%outnum:輸出的霍夫曼碼,以cell中的字符數組表示ifsum(a)~=1warning('輸入概率之和不為“1”,但程序仍將繼續(xù)運行')end[cho,sequ,i,l]=probali
3、ty(a);globallmlcode%用于輸出霍夫曼碼,定義為cell型globalcellnum%用于編碼的累加計算cellnum=1;lmlcode=cell(l,1);j=1;%第一部分add_num=char;[l_add]=addnum(add_num,i,j,l);[output,m]=disgress(sequ,i,j,l,l_add);dealnum(output,m);%在全局變量中輸出霍夫曼碼j=2;%第二部分[l_add]=addnum(add_num,i,j,l);[output,n]=disgress(sequ,i,j,l,l_add);dealnum(outp
4、ut,n);[outnum]=comset(lmlcode,cho(1,:));%將概率和編碼進行關聯(lián)function[output]=addnum(input,i,j,l)%對概率矩陣中每一行最后兩個不為0的數進行編碼,即在某個編碼后添加0,1或空%輸出:%input:輸入的某個未完成的編碼%(i,j):當前檢索目標在sequ矩陣中的位置%l:sequ矩陣的列數%PS:sequ矩陣在此函數中未用到%PS:此函數為編碼第一步ifj==(l-i)output=[input'0'];elseifj==(l-i+1)output=[input'1'];elseoutput=input;enden
5、dfunction[ecode]=comset(code,pro)%將概率和編碼進行關聯(lián)%code:已編成的霍夫曼碼%pro:輸入的一組概率%ecode:最終完成的碼l=length(code);ecode=cell(l,2);fori=1:llang(i)=length(code{i});end[a,b]=sort(lang);fori=1:lecode{i,1}=code{b(i)};ecode{i,2}=pro(i);endfunction[final,a]=dealnum(imput,m)%整理并在全局變量中輸出已完成的霍夫曼碼%輸入:imput:程序運算后的生成cell型矩陣%m
6、:標識數%輸出:final:整理后的霍夫曼碼%a:標識數globallmlcodeglobalcellnumifm==1lmlcode{cellnum}=imput;cellnum=cellnum+1;final='';a='';elseifm==2[final1,a1]=dealnum(imput{1,1},imput{1,2});[final2,a2]=dealnum(imput{2,1},imput{2,2});[final3,a3]=dealnum(final1,a1);[final4,a4]=dealnum(final2,a2);final=[final3final4];a=[a
7、3a4];elsefinal=imput;a=m;endendfunction[outnum,p]=findsumother(sequ,i,j,l,add_num)%當前檢索目標在sequ(i,j)處為非1時的處理程序,即跳轉到下一級進行整理%輸入:sequ:概率轉移矩陣%(i,j):當前檢索目標在sequ矩陣中的位置%l:sequ矩陣的列數%add_num:當前進行的編碼%輸出:(與disgress類同)%outnum