信息论实验报告2信源编码_第1页
信息论实验报告2信源编码_第2页
信息论实验报告2信源编码_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、辽宁工程技术大学上机实验报告成绩实验名称信源编码院系姓名实验目的简述本次实验目的:1、理解并掌握香农编码2、理解并掌握费诺编码3、理解并掌握霍夫曼编码实验准备你为本次实验做了哪些准备:认真阅读信息论教材,熟悉三种编码的原理以及相应的MATLAB函数指令实验 进度本次共有6个练习,完成 6实验总结本次实验的收获、体会、经验、问题和教训:1、香农编码 Matlab源码fun cti on W,L,q=sha nnon(p)if (le ngth(fi nd(p<=0) =0)error('Not a prob.vector, negative comp onen t'); e

2、ndif (abs(sum(p)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1'); end n=len gth(p); x=1: n;p,x=array(p,x);% 1)排序l=ceil(-log2(p); % 2)计算代码组长度1P(1)=0; n=le ngth(p);%3)计算累加概率 P for i=2:n P(i)=P(i_1)+p(i_1); endfor i=1: n % 4)求得二进制代码组Wfor j=1:l(i)temp(i,j)=floor(P(i)*2); P(

3、i)=P(i)*2-temp(i,j); endendfor i=1: nfor j=1:l(i)if (temp(i,j)=O); W(i,j)=48;else W(i,j)=49; endendendL=sum(p.*l); %计算平均码字长度 H=e ntropy(p,2); %计算信源熵q=H/L; % 计算编码效率for i=1: n Bi=i; endn, m=size(W);TEMP=32*o nes( n,6);W=W,TEMP;W=W; n,m=size(W);W=resh ape(W,1, n*m);W=spri ntf('%s', W);s0='很

4、好!输入正确,编码结果如下:'s仁'Shannon 编码所得码字 W:'s2='Shannon编码平均码字长度 L:' s3='Shannon编码的编码效率 q:'disp(sO);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);fun cti on H=en tropy(P,r)if (le ngth(fi nd(P<=0)=0) %判断是否符合概率分布条件error('Not a prob.vector, negative comp onen t

5、9;); endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1'); endH=(sum(-P.*log2(P)/(log2(r)+eps);2、香农编码数值试验算例单符号离散无记忆信源X =a1,a2,a3,a4,a5, a6p( X)0.25,0.25,0.2,0.15,0.1,0.05p=0.25,0.25,0.2,0.15,0.1,0.05;W,L,q=sha nnon(p)很好!输入正确,编码结果如下:Sha nnon编码所得码字 W:12345600

6、 01 100 101 1101 11110Sha nnon编码平均码字长度L:2.7000Sha nnon编码的编码效率 q:0.8975W =00 01 100 101 1101 11110L =2.7000q =0.89753、费诺编码 Matlab源码(1)编写 M文件 compare.mfun ctio nn ext_P,code _nu m, next_i ndex=compare(curre nt_P,curre nt_i ndex) n=len gth(curre nt_P);add(1)=curre nt_P(1);for i=2:n % 1)求概率的依次累加和add(i)=

7、0; add(i)=add(i-1)+curre nt_P(i); ends=add( n); % 2)求概率和最接近的两小组for i=1: n temp(i)=abs(s-2*add(i); endc,k=mi n( temp);if (curre nt_i ndex<=k)n ext_ in dex=curre nt_in dex; code_ num=48;next_P=curre nt_P(1:k);elsen ext_ in dex=curre nt_in dex-k; code_ num=49;n ext_P=curre nt_P(k+1): n); end编写M文件fan

8、o.mfun ctio n W,L ,q=fa no(P)if (len gth(fi nd(P<=0) =0)error('Not a prob.vector, negative comp onen t'); endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1') endn=length(P); x=1:n;% 1)排序P,x=array(P,x);for i=1: ncurre nt_i ndex=i;j=1;curre nt_P=P

9、;while 1n ext_P,code_ nu m, next_i ndex=compare(curre nt_P,curre nt_i ndex);curre nt_i ndex=n ext_i ndex;curre nt_P=n ext_P;W(i,j)=code nu m; j=j+1;if (le ngth(curre nt_P)=1) break; endl(i)=length(find(abs(W(i,:) =0);end %L=sum(P.*l); % 计算平均码字长度H=e ntropy(P,2); %计算信源熵q=H/L; %计算编码效率for i=1: n Bi=i; e

10、nd得到各码字的长度n, m=size(W);TEMP=32*o nes( n, 5);W=W,TEMP;W=W;n, m=size(W);W=reshape(W,1, n*m);W=spri ntf('%s', W);s0='很好!输入正确,编码结果如下:;s1='Fano编码所得码字 W:'s2='Fano编码平均码字长度 L:'s3='Fano编码的编码效率disp(sO);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);fun cti on H=en t

11、ropy(P,r)if (le ngth(fi nd(P<=0)=0)error('Not a prob.vector, negative comp onen t'); endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1'); endH=(sum(-P.*log2(P)/(log2(r)+eps);4、费诺编码数值试验算例 单符号离散无记忆信源a1,a2,a3,p( X)1/4,1/4,1/8,P=1/4,1/4,1/8,1/8,1/16

12、,1/16,1/16,1/16;W,L ,q=fa no(P)很好!输入正确,编码结果如下:Fano编码所得码字W:123400 01 100 101Fano编码平均码字长度2.7500561100L:Fano编码的编码效率 q:1.000000 01 100 101 1100a4,a5,1/8,811011101q:'a6,1/16, 1/16,1110 11111110 1111a7,a81/16,1/162.7500q =1.00005、霍夫曼编码 Matlab源码(1)编写 M文件 huffman.mfun ctio n W,L ,q=huffma n(P)if (len gt

13、h(fi nd(P<=0) =0)error('Not a prob.vector, negative comp onen t'); endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1') endn=le ngth(P); %计算输入兀素个数p=P; mark=zeros( n-1, n);% mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序% 1)确定概率大小值的排列,得到mark矩阵。for i=1: n-1p,

14、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 x n)列矩阵table,每行可看做n个段,%每段长为n,记录一个码子(每个码子的长度不会超过n)。for i=1: n-1 table(i,:)=bla nks( n*n); end% 3)计算各个元素码字,循环 n-2次,决定矩阵table%从倒数第二行开始到第一行的每段的码字值,到编码表格tabletable( n-1, n)='1'table( n-1,2* n)='0'f

15、or i=2: n-1table( n-i,1: n-1)=table (n-i+1, n*(fi nd(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' endfor j=1:i-1table (n-i,(j+1)* n+1:(j+2)* n)=table( n-i+1,.n*(find(mark(n-i+1,:)=j

16、+1)-1)+1:n*find(mark(n-i+1,:)=j+1); end% 4)得到编码后的码字for i=1: nW(i,1: n)=table(1, n*(fi nd(mark(1,:)=i)-1)+1:fi nd(mark(1,:)=i)* n);I(i)=length(find(abs(W(i,:) =32); endL=sum(P.*l); %计算平均码字长度H=e ntropy(P,2); %计算信源熵q=H/L; %计算编码效率for i=1: n Bi=i; endm,n =size(W);TEMP=bla nks(m);W=W,TEMP',TEMP',T

17、EMP'm,n =size(W);W=reshape(W,1,m* n);s0='很好!输入正确,编码结果如下:'s仁'Huffman 编码所得码字 W:'s2='Huffman编码平均码字长度 L:' s3='Huffman编码的编码效率 q:'disp(sO);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);fun cti on H=en tropy(P,r)if (len gth(fi nd(P<=0)=0)error('Not a

18、prob.vector, negative comp onen t'); endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1'); endH=(sum(-P.*log2(P)/(log2(r)+eps);(2)编写 M文件 huffman_better.mfun ctio n W丄,V,q=huffman_better(P)if (len gth(fi nd(P<=0) =0)error('Not a prob.vector, negat

19、ive comp onen t');e ndif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,comp onent do not add up to 1') endn=len gth(P);p=P; mark=zeros( n-1, n); t=1;for i=1: n-1p,n um-sort(p); %对输入兀素排序并纪录if (i=1)if (coun t=0)k-max(a(t,:);for s-co un t:-1:1num(k-s)= num(k-s+1); endnu m(k)-1;endt-t+1;

20、endmark(i,:)= nu m(1: n-i+1),zeros(1,i-1);p=p(1)+p(2),p(3:n ),1;cou nt=O; %用于计数for j=2: n-iif (p(1)=p(j) %判断p中是否有与求和后的新项相等的项coun t=co un t+1; a(t,co un t)=j;endendend% 2)生成一个n-1行、n1(n x n)列矩阵table,每行可看做n个段,%每段长为n,记录一个码字(每个码字的长度不会超过n)。for i=1: n-1 table(i,:)=bla nks(n*n); end% 3)计算各个元素码字,循环n-2次,决定矩阵t

21、able%从倒数第二行开始到第一行的每段的码字值,到编码表格tabletable(n-1,n)='1' table(n-1,2*n)='0'for i=2: n-1table( n-i,1: n-1)=table( n-i+1, n*(fi nd(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'for j=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); endend% 4)得到编码后的码字for i=1: nW(i,1: n)=table(1, n*(fi nd(mark(1,:)=i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论