信息论实验二报告

更新时间:2023-08-13 01:46:01 阅读量: 小学教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实 验 报 告

课程名称 信息论与编码 实验项目

实验仪器

系 别

专 业 电子信息工程

班级/学号 电信1103/2011010550

学生姓名 实验日期

成 绩

指导教师

实验项目:霍夫曼编码、率失真函数的计算

实验项目性质:验证性实验

课程:《信息论与编码》

计划学时:4学时

一、实验目的

掌握使用计算机进行霍夫曼编码、计算率失真函数的方法。

二、实验内容

利用matlab语言编程实现霍夫曼编码、计算率失真函数。

三、实验原理

1.参照教材(焦瑞莉等编著《信息论基础教程》)第111页表4-8理解霍夫曼编码的过程

2.参照教材(焦瑞莉等编著《信息论基础教程》)第148页式(6-7)理解率失真函数的定义

四、实验方法与实验步骤

(一)参照教材第223页信源熵程序建立文件huffman.m

文件huffman.m的代码:

% huffman编码生成器 %

% 函数说明: %

% [W,L.q]=huffman(P)为huffman编码函数 %

% P为信源的概率矢量,W为编码返回的码字 %

% L为编码返回的平均码字长度,q为编码效率 %

% ***************************************%

function [W,L,q]=huffman(P)

if(length(find(P<=0))~=0)

error('Not a prob.vector.negative component'); % 判断是否符合概率分布条件 end

if(abs(sum(P)-1)>10e-10)

error('Not a ponent do not add up to 1') % 判断是否符合概率和为1

end

n=length(P); % 计算输入元素个数

p=P;

mark=zeros(n-1,n); % mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序

% 1) 确定概率大小值的排列,得到mark矩阵。

for i=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)。

for i=1:n-1

table(i,:)=blanks(n*n);

end

% 3)计算各个元素码字,循环n 2次,决定矩阵table

% 从倒数第二行开始到第行的每段的码字值,到编码表格table

table(n-1,n)='l'; % 小值赋1

table(n-1,2*n)='0'; % 大值赋0

for i=2:n-1

table(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';

for j=1:i-1

table(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的记录依次赋值

end

end

% 4)得到编码后的码字

for i=1:n

W(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));

end

L=sum(P.*l); % 计算平均码字长度

H=entropy(P,2); % 计算信源熵

V=sum(P.*((l-L).^2)); %计算码字的方差,以判断编码方法的优劣

q=H/L;% 计算编码效率

% 打印输出结果

for i=1:n

B{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='很好!输入正确,Huffman编码1结果如下:';

s1='Huffman编码所得码字W:';

s2='Huffman编码平均码字长度L:';

s3='Huffman编码所得码字W的方差V:';

s4='Huffman编码的编码效率q:';

disp(s0);

disp(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的代码:

%信息率失真函数的迭代计算,选代精度取为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 (length(find(Pa<=0)) ~=0)

error('Not a prob.vector, should be pesitive component!');

%判断是否符台概率分布条件

end

if (abs(sum(Pa)- 1 )>=10e-10)

error('Not a prob.vector, component do not add up to 1!')

%判断是否符合概率和为1

end

if (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:s

Pb(j,1)=0;

for i=1:r

Pb(j,1 )=Pb(j, 1)+Pa(i)*Pba(i,j,1 );

%求信源的输出概率矩阵,即Pb(j,1)

end

end

for i=1:r

temp(i)=0;

for j=1:s

temp(i)=temp(i) + Pb(j,1)*exp(S(m) *d(i,j));

% temp为临时项,求Pha(i,j,2)时表达式的分母

end

end

for i=1:r

for j=1:s

Pba(i,j,2)=(Pb(j,1)*exp(S(m)*d(i,j)))/temp(i);

end

end

D(1)=0;

for i= 1:r

for j=1:s

D(1)=D(1)+Pa(i)*Pba(i,j,1)*d(i,j); % 求D(1)

end

end

R(1)=0;

for i=1:r

for j=1:s

if (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) end

end

end

n=2; %n 为内层循环次数

while(1) %内层循环,对精度的循环

%第三步

for j=1:s

Pb(j,n) = 0;

for i= 1:r

Pb(j,n)=Pb(j,n)+Pa(i)*Pba(i,j,n); % 求输出的信源概率分布 end

end

for i=1 :r

temp(i)=0;

for j=1:s

temp(i) =temp (i)+Pb (j,n) *exp(S(m) *d(i,j));

%temp为临时项,求Pba(i,j,n+1)时表达式的分母

end

end

for i=1:r

for j=1:s

if(temp(i) ~=0)

Pba(i,j,n+1)=(Pb(j, n)*exp(S(m)*d(i,j)))/temp(i); %求Pba(i, j, n+1)

end

end

end

%第四步

D(n)=0;

for i=1:r

for j=1:s

D(n)=D(n)+Pa(i)*Pba(i,j,n)*d(i,j); % 隶D(n)

end

end

R(n)=0;

for i=1:r

for j=1:s

if(Pba(i,j,n)~=0)

R(n)=R(n)+Pa(i)*Pba(i,j,n)*log2(Pba(i,j,n)/Pb(j,n)); %求R(n)

end

end

end

%判断差别是否在允许的精度范围之内

if(abs(R(n)-R(n-1))<=10^(-7)) %R(n)精度判断

if(abs(D(n)-D(n-1))<=10^(-7)) %D(n)精度判断

break;

end

end

n=n+1; %内层循环次数加1

end %内层循环结束

%第五步

S(m+1)=S(m)+0.5;

%第六步

if(abs(R(n)<10^(-7)))

if(m<=10)

disp('此时S的值为:'),disp(S(m));

error('初始拉氏乘子S取得大了,请取小些!');

%判断拉氏乘子S的初始值是否合适

else

[k,l,q]=size(pba);

Pba=pba(:,:,q);

Rmin=min(RS)

Dmax=max(DS);

Smax=S(m-1);

break;

end

end

pba=[Pba(:,:,:)];

RS=[RS R(n)];

DS=[DS D(n)];

m=m+1;%外层循环次数加1

end %外层循环结束

%打印输出结果

s0='很好!输入正确,选代结果如下:';

s1='最佳转移概率分布Pba:';

s2='最小信息率Rmin:';

s3='最大失真度Dmax:';

s4='最大拉氏乘于Smax:';

disp(s0);

disp(s1),disp(Pba);

disp(s2),disp(Rmin);

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软件的使用。通过老师的提问和讲解,还让我明白了很多关于霍夫曼编码的实质性,这次试验使我懂得了不少知识点。

本文来源:https://www.bwwdw.com/article/vyij.html

Top