如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
实验项目可变长信源编码方法所属课程信息论基础实验目的通过该实验,掌握通过计算机实验可变长信源编码方法,进一步熟悉香农编码,费诺编码以及霍夫曼编码方法。实验内容1.对于给定的信源的概率分布,用MATLAB语言实现香农编码。(2学时)2.对于给定的信源的概率分布,用MATLAB语言实现霍夫曼编码。(2学时)3.对于给定的信源的概率分布,用MATLAB语言实现费诺编码。(2学时)实验过程及结果︵不够可另附纸︶香农编码:functionc=shannon(p)%p=[0.250.250.200.150.100.05]%shannon(p)[p,index]=sort(p);p=fliplr(p);%从大到小n=length(p);pa=0;%累加概率fori=2:npa(i)=pa(i-1)+p(i-1);endk=ceil(-log2(p));c=cell(1,n);fori=1:nc{i}='';tmp=pa(i);forj=1:k(i)tmp=tmp*2;iftmp>=1tmp=tmp-1;c{i}(j)='1';elsec{i}(j)='0';endendendc=fliplr(c);c(index)=c;霍夫曼编码:functionc=huffman(p)n=size(p,2);ifn==1%此时已合并到一棵树上了,直接返回c=cell(1,1);c{1}='';returnend%找最小的[p1,i1]=min(p);index=[(1:i1-1),(i1+1:n)];%这里的index是一个trick%他跟踪了现在的p的每个分量,在原来的p里面的下标%在最后,将依据这个下标来成码p=p(index);n=n-1;%找第二小的。[p2,i2]=min(p);index2=[(1:i2-1),(i2+1:n)];%index2是在上一个p中的下标p=p(index2);i2=index(i2);%i2变为在原p中次小值的下标index=index(index2);%继续跟踪现在的p在原p中的下标p(n)=p1+p2;%生成一个新节点,即合并的两个最小节点的和c=huffman(p);%对新的p的序列做huffman编码c{n+1}=strcat(c{n},'1');%p(n)是开始合并的节点c{n}=strcat(c{n},'0');%这里从c(n)分出两枝,对开始合并的两节点成码%恢复原顺序index=[index,i1,i2];c(index)=c;3.费诺编码:functionc=fano(p)n=size(p,2);ifn==1c=cell(1,1);c{1}='';returnend[p,index]=sort(p);%按概率排序p=fliplr(p);total=sum(p);%总概率acc=0;%累积概率flag=0;%是否到达尾部的标志fori=1:n-1newacc=acc+p(i);ifabs(total-2*newacc)>=abs(total-2*acc)flag=1;break;endacc=newacc;endif~flagi=n;endsplit=i;%从分界点对两边的码递归做fanoc1=fano(p(1:split-1));c2=fano(p(split:n));c=cell(1,n);%添加前缀0,1fori=1:split-1c{i}=strcat('0',c1{i});endfori=split:nc{i}=strcat('1',c2{i-split+1});end%将顺序调整回去c=fliplr(c);c(index)=c;运行结果:输入p=[0.25000.25000.20000.15000.10000.0500]调用函数得:c1=shannon(p)c2=huffman(p)c3=fano(p)p=0.25000.25000.20000.15000.10000.0500香农编码c1='01''00''100''101''1101''11110'霍夫曼编码c3='01''10''00''110''1111''1110'费诺编码c2='00''01''10''110''1110''1111'实验总结教师评语