資源描述:
《離散信源無失真信源編碼》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、離散信源無失真信源編碼目的:熟練掌握無失真信源編碼的方法;熟練掌握Huffman編碼的平均碼長和編碼效率的Huffman編碼的基本原理及特點:Huffman編碼是一種可變長編碼算法,該方法完全依據(jù)字符出現(xiàn)概率來構(gòu)造異字頭的平均長度最短的碼字,有時稱之為最佳編碼。Huffman編碼一般利用二叉樹結(jié)構(gòu)實現(xiàn),其基本原理是頻繁使用的數(shù)據(jù)用較短的代碼代替,較少使用的數(shù)據(jù)用較長的代碼代替,每個數(shù)據(jù)的代碼各不相同。Huffman編碼在信源符號表示平均所需要的比特數(shù)方面是最優(yōu)的,而且也滿足前綴條件(即唯一可譯碼)。在編碼效率方面,Huffman編
2、碼是基于二叉樹算法的特點以及性質(zhì)。從書本的例題看出Huffman編碼方法得到的碼是不唯一的。不同的排序準則以及不同的符號分配都會影響到最后的結(jié)果,雖然編碼的效率相同,但是影響到了編碼的質(zhì)量。從課本上的例題可以看出,二叉樹的層數(shù)較少的,編碼質(zhì)量較高(從碼方差得出)。在編碼的時候,要盡量避免二叉樹的稀疏性給編碼質(zhì)量帶來的影響。要減少二叉樹的稀疏性就要提高二叉樹的利用率,減少二叉樹的層數(shù)。Huffman編碼基本步驟,畫出程序流程圖:Huffman編碼步驟:(1)將信源符號按概率遞減的次序排序(2)將兩個最小概率的分支分別標記為‘1’和‘
3、0’,他們的結(jié)合點為兩分支概率之和(3)將上面的概率和看作一個新符號的概率。(4)重新排列后,重復(fù)上面的步驟。(5)從最后的節(jié)點開始讀取,到要找的符號,路徑的分支標號就是碼字流程圖:利用二叉樹原理建一個數(shù)組,并加上相應(yīng)的編碼序號提取出Huffman樹的編碼信息并且輸出數(shù)據(jù)輸入并且判斷是否符合要求數(shù)據(jù)排序Huffman樹構(gòu)建源程序:clearall;clc;p=1;place=1;total=0;require='youcaninputthemaxprobability:';disp('readme:whenprobabilityi
4、s-1endinput.');disp('inputprobabilitymustlessthan1,andthetotalprobabilityalsolessthan1');disp('wewillpointoutthemaxprobabilityyoucaninput');%%%inputdatawhile(1)q=num2str(p);r=strcat(require,q);disp(r);temp=input('probably=');if((temp-p)>5e-010)disp('inputprobablyisove
5、rflow,inputagain');endif(temp==-1)if(p==0)break;elsedisp('thetotalprobabilityisnotenough,doyouexit?');if(input('(y/n)','s')=='y')break;endendendif(temp<=(p+5e-010)&&temp>=5e-010)node(place).prob=temp;node(place).signal=input('signal=');p=p-temp;place=place+1;total=tot
6、al+1;if(p<5e-09)disp('enoughdata');break;endendend%%%p-pdatasort,smalltobigif(total==0)warning('youhavetoinputmorethanonedata!');elseif(total==1)disp('-__-
7、
8、
9、codeis1,soeasy.');elsefori=1:totalforj=i:totalif(node(i).prob>node(j).prob)tempn=node(i).prob;node(i).prob=nod
10、e(j).prob;node(j).prob=tempn;tempn=node(i).signal;node(i).signal=node(j).signal;node(j).signal=tempn;endendend%nodesortisright%%%huffmantree,probabilitybigis0,whenequal,deeplyis0temp2(1:total)=node(1:total);fori=1:totaltemp2(i).deep=1;temp2(i).pre=-1;end%createatreefo
11、ri=1:total*2-1tree(i).signal=-1;tree(i).prob=-1;tree(i).pre=-1;tree(i).deep=1;tree(i).code=-1;tree(i).next.right=-1;tree(i).