1、实 验 报 告课程名称 信息论与编码 实验项目 霍夫曼编码、率失真函数的计算 实验仪器 计算机 系 别 信息与通信工程学院 专 业 电子信息工程 班级/学号 学生姓名 实验日期 成 绩 _ 指导教师 实验项目:霍夫曼编码、率失真函数的计算实验项目性质:验证性实验课程:信息论与编码计划学时:4 学时一、实验目的掌握使用计算机进行霍夫曼编码、计算率失真函数的方法。二、实验内容利用 matlab 语言编程实现霍夫曼编码、计算率失真函数。三、实验原理1参照教材(焦瑞莉等编著信息论基础教程 )第 111 页表 4-8 理解霍夫曼编码的过程2参照教材(焦瑞莉等编著信息论基础教程 )第 148 页式(6-7
2、)理解率失真函数的定义四、实验方法与实验步骤(一)参照教材第 223 页信源熵程序建立文件 huffman.m文件 huffman.m 的代码:% huffman 编码生成器 % % 函数说明: % % W,Lq=huffman(P)为 huffman 编码函数 % % P 为信源的概率矢量,W 为编码返回的码字 % % L 为编码返回的平均码字长度,q 为编码效率 % % *% function W,L,q=huffman(P)if(length(find(P10e-10)error(Not a ponent do not add up to 1) % 判断是否符合概率和为 1endn=le
3、ngth(P); % 计算输入元素个数p=P;mark=zeros(n-1,n); % mark 为 n-1 行、n 列矩阵,用来记录每行最小两概率叠加后概率排列次序% 1) 确定概率大小值的排列,得到 mark 矩阵。for i=1:n-1p,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(nn)列矩阵 table,每行可看做 n 个段,% 每段长为 n,记录一个码字(每个码字的长度不会超过 n)。for i=1:n-1table(i,
4、:)=blanks(n*n);end% 3)计算各个元素码字,循环 n 2 次,决定矩阵 table% 从倒数第二行开始到第行的每段的码字值,到编码表格 tabletable(n-1,n)=l; % 小值赋 1table(n-1,2*n)=0; % 大值赋 0for i=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);ta
5、ble(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);% 按 mark 的记录依次赋值endend% 4)得到编码后的码字for i=1:nW(i,1:n)=table(1,n*(find(mark(1,:)=i)-1)+1:n*find(mark(1,:)=i);l(i)=length(find(abs(W(i,:)=32);endL=sum(P.*l); % 计算平均码字长度H=entropy(
6、P,2); % 计算信源熵V=sum(P.*(l-L).2); %计算码字的方差,以判断编码方法的优劣q=H/L;% 计算编码效率% 打印输出结果for i=1:nBi=i;endm,n=size(W);TEMP=blanks(m);W=W,TEMP,TEMP,TEMP;m,n=size(W);W=reshape(W,1,m*n);s0=很好!输入正确,Huffman 编码 1 结果如下:;s1=Huffman 编码所得码字 W:;s2=Huffman 编码平均码字长度 L:;s3=Huffman 编码所得码字 W 的方差 V:;s4=Huffman 编码的编码效率 q:;disp(s0);d
7、isp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(V);disp(s4),disp(q);(二)建立文件 exercise4_8_1.m 通过调用 huffman.m 计算教材第 117 页练习 4.8(1)信源 Y文件 exercise4_8_1.m 的代码和运行结果:clc;P=0.2,0.19,0.18,0.17,0.15,0.10,0.01;Y=huffman(P);运行结果:(三)参照教材第 232 页信息率失真函数的迭代计算程序建立文件 ratedf.m文件 ratedf.m 的代码:%信息率失真函数的迭代计算,选代精度取
8、为 10(-7) %在信源的输入概率分布 Pa 和失真矩阵 d 已知的条件下求出信息率失真函数 %函数说明: %Pha,Rmin,Dmax,Smax=RateDF(P,d,s)为信息率失真函数 %变量说明: %Pa:信源的输入概率矩阵,d:失真矩阵,S:拉氏乘子 %Pba:最佳正向转移概率矩阵,Smax:最大拉氏乘子 %Rmin:最小信息率,Dmax:允许的最大失真度 %Pb:信源的输出概率矩阵,D:允许的失真度,R:信息率 %r:输入信源数,s:输出信源数 %*%function Pba,Rmin,Dmax,Smax=ratedf(Pa,d,S)% 提示错误信息r,s=size(d);if
9、(length(find(Pa=10e-10)error(Not a prob.vector, component do not add up to 1!)%判断是否符合概率和为 1endif (r=length(Pa)error(The parameters do not match!); %判断参数是否一致end%第一步pba=;RS=; %R(s)函数初始化DS=; %D(s)函数初始化m=1; %m 为 S 循环的次数while(1) % 外层循环对 S 的循环Pba(1:r,1:s, 1)=1/s*ones(r,s); %求信道正向转移矩阵 Pba%第二步for j=1:sPb(j,
10、1)=0;for i=1:rPb(j,1 )=Pb(j, 1)+Pa(i)*Pba(i,j,1 );%求信源的输出概率矩阵,即 Pb(j,1)endendfor i=1:rtemp(i)=0;for j=1:stemp(i)=temp(i) + Pb(j,1)*exp(S(m) *d(i,j);% temp 为临时项,求 Pha(i,j,2)时表达式的分母endendfor i=1:rfor j=1:sPba(i,j,2)=(Pb(j,1)*exp(S(m)*d(i,j)/temp(i);endendD(1)=0;for i= 1:rfor j=1:sD(1)=D(1)+Pa(i)*Pba(i
11、,j,1)*d(i,j); % 求 D(1)endendR(1)=0;for i=1:rfor j=1:sif (Pba(i,j, 1 ) =0)R(1)=R(1)+Pa(i)*Pba(i,j,1)*log2(Pba(i,j,1)/Pb(j,1); % 求 R(1)endendendn=2; %n 为内层循环次数while(1) %内层循环,对精度的循环%第三步for j=1:sPb(j,n) = 0;for i= 1:rPb(j,n)=Pb(j,n)+Pa(i)*Pba(i,j,n); % 求输出的信源概率分布endendfor i=1 :rtemp(i)=0;for j=1:stemp(i
12、) =temp (i)+Pb (j,n) *exp(S(m) *d(i,j);%temp 为临时项,求 Pba(i,j,n+1)时表达式的分母endendfor i=1:rfor j=1:sif(temp(i) =0)Pba(i,j,n+1)=(Pb(j, n)*exp(S(m)*d(i,j)/temp(i);%求 Pba(i, j, n+1)endendend%第四步D(n)=0;for i=1:rfor j=1:sD(n)=D(n)+Pa(i)*Pba(i,j,n)*d(i,j); % 隶 D(n)endendR(n)=0;for i=1:rfor j=1:sif(Pba(i,j,n)=0
13、)R(n)=R(n)+Pa(i)*Pba(i,j,n)*log2(Pba(i,j,n)/Pb(j,n);%求 R(n)endendend%判断差别是否在允许的精度范围之内if(abs(R(n)-R(n-1)=10(-7) %R(n)精度判断if(abs(D(n)-D(n-1)=10(-7) %D(n)精度判断break;endendn=n+1; %内层循环次数加 1end %内层循环结束%第五步S(m+1)=S(m)+0.5;%第六步if(abs(R(n)10(-7)if(m=10)disp(此时 S 的值为:),disp(S(m);error(初始拉氏乘子 S 取得大了,请取小些!);%判断
14、拉氏乘子 S 的初始值是否合适elsek,l,q=size(pba);Pba=pba(:,:,q);Rmin=min(RS)Dmax=max(DS);Smax=S(m-1);break;endendpba=Pba(:,:,:);RS=RS R(n);DS=DS D(n);m=m+1;%外层循环次数加 1end %外层循环结束%打印输出结果s0=很好!输入正确,选代结果如下:;s1=最佳转移概率分布 Pba:;s2=最小信息率 Rmin:;s3=最大失真度 Dmax:;s4=最大拉氏乘于 Smax:;disp(s0);disp(s1),disp(Pba);disp(s2),disp(Rmin);
15、disp(s3),disp(Dmax);disp(s4),disp(Smax);%画出信息率失真函数 R(D)plot(DS,RS)xlabel(允许的失真度 D)ylabel(信息率失真函数 R(D)title(信息率失真函数 R(D)的曲线图)(四)建立文件exercise6_2.m通过调用ratedf.m计算教材第161页练习6.2(%注意拉式因子s的取值范围为负无穷大到零(小于零),可从一个绝对值充分大的负数取起,如s=-100。)文件 exercise6_2.m 的代码和运行结果:clc;Pa=1/2,1/2;d=0,1,1/4;1,0,1/4;S=-1000000;ratedf(Pa,d,S);运行结果:五、心得与体会通过本次试验我掌握了利用 matlab 语言编程实现霍夫曼编码、计算率失真函数不仅如此,通过本次试验,还让我对书本上的本部分知识有了跟深刻的了解,更加熟悉了 MatLab 软件的使用。总而言之,我认为这次试验我还是很有收获的。