辽宁工程技术大学上机实验报告实验名称信源编码院系姓名实验目的简述本次实验目的:1、理解并掌握香农编码2、理解并掌握费诺编码3、理解并掌握霍夫曼编码实验准备你为本次实验做了哪些准备:认真阅读《信息论》教材,熟悉三种编码的原理以及相应的MATLAB函数指令实验进度本次共有6个练习,完成6实验总结日本次实验的收获、体会、经验、问题和教训:1、香农编码Matlab源码function[W,L,q]=shannon(p)if(length(find(p=0))~=0)error('Notaprob.vector,negativecomponent');endif(abs(sum(p)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1');endn=length(p);x=1:n;[p,x]=array(p,x);%1)排序l=ceil(-log2(p));%2)计算代码组长度lP(1)=0;n=length(p);%3)计算累加概率Pfori=2:nP(i)=P(i-1)+p(i-1);endfori=1:n%4)求得二进制代码组Wforj=1:l(i)temp(i,j)=floor(P(i)*2);P(i)=P(i)*2-temp(i,j);endendfori=1:nforj=1:l(i)成绩if(temp(i,j)==0);W(i,j)=48;elseW(i,j)=49;endendendL=sum(p.*l);%计算平均码字长度H=entropy(p,2);%计算信源熵q=H/L;%计算编码效率fori=1:nB{i}=i;end[n,m]=size(W);TEMP=32*ones(n,6);W=[W,TEMP];W=W';[n,m]=size(W);W=reshape(W,1,n*m);W=sprintf('%s',W);s0='很好!输入正确,编码结果如下:';s1='Shannon编码所得码字W:';s2='Shannon编码平均码字长度L:';s3='Shannon编码的编码效率q:';disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);functionH=entropy(P,r)if(length(find(P=0))~=0)%判断是否符合概率分布条件error('Notaprob.vector,negativecomponent');endif(abs(sum(P)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1');endH=(sum(-P.*log2(P)))/(log2(r)+eps);2、香农编码数值试验算例单符号离散无记忆信源)X(Xp=0.050.1,0.15,0.2,0.25,0.25,a6a5,a4,a3,a2,a1,p=[0.25,0.25,0.2,0.15,0.1,0.05];[W,L,q]=shannon(p)很好!输入正确,编码结果如下:Shannon编码所得码字W:[1][2][3][4][5][6]0001100101110111110Shannon编码平均码字长度L:2.7000Shannon编码的编码效率q:0.8975W=0001100101110111110L=2.7000q=0.89753、费诺编码Matlab源码(1)编写M文件compare.mfunction[next_P,code_num,next_index]=compare(current_P,current_index)n=length(current_P);add(1)=current_P(1);fori=2:n%1)求概率的依次累加和add(i)=0;add(i)=add(i-1)+current_P(i);ends=add(n);%2)求概率和最接近的两小组fori=1:ntemp(i)=abs(s-2*add(i));end[c,k]=min(temp);if(current_index=k)next_index=current_index;code_num=48;next_P=current_P(1:k);elsenext_index=current_index-k;code_num=49;next_P=current_P((k+1):n);end(2)编写M文件fano.mfunction[W,L,q]=fano(P)if(length(find(P=0))~=0)error('Notaprob.vector,negativecomponent');endif(abs(sum(P)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1')endn=length(P);x=1:n;%1)排序[P,x]=array(P,x);fori=1:ncurrent_index=i;j=1;current_P=P;while1[next_P,code_num,next_index]=compare(current_P,current_index);current_index=next_index;current_P=next_P;W(i,j)=code_num;j=j+1;if(length(current_P)==1)break;endl(i)=length(find(abs(W(i,:))~=0));end%得到各码字的长度L=sum(P.*l);%计算平均码字长度H=entropy(P,2);%计算信源熵q=H/L;%计算编码效率fori=1:nB{i}=i;end[n,m]=size(W);TEMP=32*ones(n,5);W=[W,TEMP];W=W';[n,m]=size(W);W=reshape(W,1,n*m);W=sprintf('%s',W);s0='很好!输入正确,编码结果如下:';s1='Fano编码所得码字W:';s2='Fano编码平均码字长度L:';s3='Fano编码的编码效率q:';disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);functionH=entropy(P,r)if(length(find(P=0))~=0)error('Notaprob.vector,negativecomponent');endif(abs(sum(P)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1');endH=(sum(-P.*log2(P)))/(log2(r)+eps);4、费诺编码数值试验算例单符号离散无记忆信源)X(Xp=1/16,1/16,1/161/16,1/8,1/8,1/4,1/4,a8a7,,a6a5,a4,a3,a2,a1,P=[1/4,1/4,1/8,1/8,1/16,1/16,1/16,1/16];[W,L,q]=fano(P)很好!输入正确,编码结果如下:Fano编码所得码字W:[1][2][3][4][5][6][7][8]00011001011100110111101111Fano编码平均码字长度L:2.7500Fano编码的编码效率q:1.0000W=00011001011100110111101111L=2.7500q=1.00005、霍夫曼编码Matlab源码(1)编写M文件huffman.mfunction[W,L,q]=huffman(P)if(length(find(P=0))~=0)error('Notaprob.vector,negativecomponent');endif(abs(sum(P)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1')endn=length(P);%计算输入元素个数p=P;mark=zeros(n-1,n);%mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序%1)确定概率大小值的排列,得到mark矩阵。fori=1:n-1[p,num]=sort(p);mark(i,:)=[num(1:n-i+1),zeros(1,i-1)];p=[p(1)+p(2),p(3:n),1];end%2)生成一个n-1行、n1(n×n)列矩阵table,每行可看做n个段,%每段长为n,记录一个码字(每个码字的长度不会超过n)。fori=1:n-1table(i,:)=blanks(n*n);end%3)计算各个元素码字,循环n-2次,决定矩阵table%从倒数第二行开始到第一行的每段的码字值,到编码表格tabletable(n-1,n)='1';table(n-1,2*n)='0';fori=2:n-1table(n-i,1:n-1)=table(n-i+1,n*(find(mark(n-i+1,:)==1))...-(n-2):n*(find(mark(n-i+1,:)==1)));%按mark的记录依次赋值table(n-i,n)='1';table(n-i,n+1:2*n-1)=table(n-i,1:n-1);table(n-i,2*n)='0';endforj=1:i-1table(n-i,(j+1)*n+1:(j+2)*n)=table(n-i+1,...n*(find(mark(n-i+1,:)==j+1)-1)+1:n*find(mark(n-i+1,:)==j+1));end%4)得到编码后的码字fori=1:nW(i,1:n)=table(1,n*(find(mark(1,:)==i)-1)+1:find(mark(1,:)==i)*n);l(i)=length(find(abs(W(i,:))~=32));endL=sum(P.*l);%计算平均码字长度H=entropy(P,2);%计算信源熵q=H/L;%计算编码效率fori=1:nB{i}=i;end[m,n]=size(W);TEMP=blanks(m);W=[W,TEMP',TEMP',TEMP'];[m,n]=size(W);W=reshape(W',1,m*n);s0='很好!输入正确,编码结果如下:';s1='Huffman编码所得码字W:';s2='Huffman编码平均码字长度L:';s3='Huffman编码的编码效率q:';disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);functionH=entropy(P,r)if(length(find(P=0))~=0)error('Notaprob.vector,negativecomponent');endif(abs(sum(P)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1');endH=(sum(-P.*log2(P)))/(log2(r)+eps);(2)编写M文件huffman_better.mfunction[W,L,V,q]=huffman_better(P)if(length(find(P=0))~=0)error('Notaprob.vector,negativecomponent');endif(abs(sum(P)-1)10e-10)error('Notaprob.vector,componentdonotaddupto1')endn=length(P);p=P;mark=zeros(n-1,n);t=1;fori=1:n-1[p,num]=sort