一绘制二元熵函数曲线报告.docx
《一绘制二元熵函数曲线报告.docx》由会员分享,可在线阅读,更多相关《一绘制二元熵函数曲线报告.docx(11页珍藏版)》请在冰点文库上搜索。
一绘制二元熵函数曲线报告
实验一绘制二元熵函数曲线实验报告
一、实验目的
1.熟悉MATLAB工作环境及工具箱
2.理解熵函数表达式及其性质
二、实验内容
用MATLAB软件编程绘制二元熵函数曲线
三、实验过程
1.复习二元熵函数,理解二元信源的熵H(w)=-wlogw-(1-w)log(1-w)表达式。
2.熟悉MATLAB软件。
1)MATLAB的操作界面
MATLAB操作界面主要分为:
任务栏、命令窗、命令历史窗、当前目录浏览器、工作空间浏览器及一个“启动按钮”。
任务栏:
位于软件的正上方。
各个菜单分别为:
文件、编辑、视窗、调试、桌面、窗体、帮助这几个窗口,点击每个窗口可以选择需要的操作。
命令窗(CommandWindow):
位于软件操作界面的右侧。
在此窗口里,可以输入各种指令、函数、变量表达式并进行各种操作。
该窗口用于输入命令并显示除图形以外的所有执行结果。
窗口中的“>>”为命令提示符,直接在其后面输入命令并按下回车键后,会出现计算结果在命令后面。
命令历史窗(CommandHistory):
位于软件操作界面的左下方。
这个窗口记录了命令窗口已经运行过的所有命令(指令、函数等),允许用户对这些命令进行选择、复制。
2)MATLAB的函数
绘制二维图形最常用的就是plot函数,调用plot函数的三种形式:
plot(x)、plot(x,y)、plot(x,y,’r:
x’)。
还有就是如何添加横坐标和纵坐标标题的命令语句。
3.实验程序。
w=0.000001:
0.0001:
0.999999999%定义w的取值范围
y=-w.*log2(w)-(1-w).*log2(1-w)%定义二元熵函数的表达式
plot(w,y,'r')%画出二元熵函数的曲线图
xlabel('w')%x轴的名称
ylabel('H(w)')%y轴的名称
gridon%给图形加上网格
title('二元熵函数H(w)')%函数曲线的名称
运行结果如下:
四、实验结果分析
从图中可以看出熵函数的一些性质,如果二元信源的输出概率是1或0(即二元信源的输出是确定的),则该信源不提供任何信息。
当二元信源符号等概率发生时,即w=0.5时,信源的熵达到最大值,等于1比特信息量,曲线关于w=0.5左右对称。
五、实验总结
对MATLAB掌握不够,还缺少很多的MATLAB知识,应加强学习MATLAB。
实验二一般信道容量迭代算法实验报告
一、实验目的
1.熟悉MATLAB工作环境及工具箱
2.掌握一般信道容量迭代算法原理
二、实验内容
用MATLAB软件编程实现一般信道容量迭代算法
三、实验过程
1.复习一般信道容量迭代算法,了解其基本思路。
2.熟悉MATLAB的工作界面及所要用到的基本函数及语句,如:
输入语句、循环语句、exp函数等。
3.实验程序。
N=input('输入信源符号X的个数N=')
M=input('输出信源符号Y的个数M=')
p_yx=zeros(N,M)%程序设计需要信道矩阵初始化为零
fprintf('输入信道矩阵概率\n')
fori=1:
N
forj=1:
M
p_yx(i,j)=input('p_yx=');%输入信道矩阵概率
ifp_yx(i)<0
error('不符合概率分布')
end
end
end
fori=1:
N%各行概率累加求和
s(i)=0;
forj=1:
M
s(i)=s(i)+p_yx(i,j);
end
end
fori=1:
N%判断是否符合概率分布
if(s(i)<=0.999999||s(i)>=1.000001)
error('不符合概率分布')
end
end
b=input('输入迭代精度:
')%输入迭代精度
fori=1:
N
p(i)=1.0/N;%取初始概率为均匀分布
end
forj=1:
M%计算q(j)
q(j)=0;
fori=1:
N
q(j)=q(j)+p(i)*p_yx(i,j);
end
end
fori=1:
N%计算a(i)
d(i)=0;
forj=1:
M
if(p_yx(i,j)==0)
d(i)=d(i)+0;
else
d(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j));
end
end
a(i)=exp(d(i));
end
u=0;
fori=1:
N%计算u
u=u+p(i)*a(i);
end
IL=log2(u)%计算IL
IU=log2(max(a))%计算IU
n=1
while((IU-IL)>=b)%迭代计算
fori=1:
N
p(i)=p(i)*a(i)/u;%重新赋值p(i)
end
forj=1:
M%计算q(j)
q(j)=0;
fori=1:
N
q(j)=q(j)+p(i)*p_yx(i,j);
end
end
fori=1:
N%计算a(i)
d(i)=0;
forj=1:
M
if(p_yx(i,j)==0)
d(i)=d(i)+0;
else
d(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j));
end
end
a(i)=exp(d(i));
end
u=0
fori=1:
N%计算u
u=u+p(i)*a(i);
end
IL=log2(u)%计算IL
IU=log2(max(a))%计算IU
n=n+1
end
fprintf('信道矩阵为:
\n')
disp(p_yx)
fprintf('迭代次数n=%d\n',n)
fprintf('信道容量C=%f比特/符号',IL)
实验结果为:
输入信源符号X的个数N=3
输出信源符号Y的个数M=4
输入信道矩阵概率
p_yx=0.5
p_yx=0.25
p_yx=0.1
p_yx=0.15
p_yx=0.23
p_yx=0.4
p_yx=0.27
p_yx=0.1
p_yx=0.19
p_yx=0.21
p_yx=0.6
p_yx=0
输入迭代精度:
0.00001
信道矩阵为:
0.50000.25000.10000.1500
0.23000.40000.27000.1000
0.19000.21000.60000
迭代次数n=85
信道容量C=0.271258比特/符号
四、实验分析与总结
信道容量与输入信源的概率分布无关,它只是信道传输概率的函数,只与信道的统计特性有关。
信道容量是完全描述信道特性的参量,是信道能够传输的最大信息量。
只要信道的平均互信息达到极大值即等于信道容量,那么就说此输入概率分布是最佳的,因此达到信道容量的最佳输入分布并不是唯一的。
迭代精度越小,计算的结果越准确,但加重了算法的重复计算量,即迭代次数越多。
迭代精度越大,迭代次数越少,计算结果相对差些。
因此,可以根据实际情况来定迭代精度。
实验三编程实现哈夫曼编码实验报告
一、实验目的
1.熟悉MATLAB工作环境及工具箱
2.掌握哈夫曼编码的原理
二、实验内容
用MATLAB软件编程实现哈夫曼编码
三、实验过程
1.复习哈夫曼编码,掌握其编码的原理。
2.熟悉MATLAB的工作界面及所要用到的基本函数及语句。
3.实验程序。
function[h,l]=huffman(p)%h为每个符号对应的码字,l为输出码字的平均码长
if(length(find(p<0))~=0)%判断输入矩阵概率是否全为大于零的有效值
error('Notaprob,negativecomponent');
end
if(abs(sum(p)-1)>10e-10)
error('Notaprob.vector,componentdonotaddto1')%判断总概率是否为1
end
n=length(p);%编码的元素个数
q=p;
m=zeros(n-1,n);%构造n-1行、n列的零矩阵
fori=1:
n-1%按概率大小排列得到m矩阵
[q,l]=sort(q);%返回一个列升序排列的矩阵
m(i,:
)=[l(1:
n-i+1),zeros(1,i-1)];
q=[q
(1)+q
(2),q(3:
n),1];
end
fori=1:
n-1%生成一个n-1行、n*n列的矩阵c,每行看作n个段,每段长为n,记录一个码字
c(i,:
)=blanks(n*n);
end
c(n-1,n)='1';%c矩阵的n-1行的第一个段赋值1
c(n-1,2*n)='0';%c矩阵的n-1行的第二个段赋值0
fori=2:
n-1%确定从倒数第二开始到第一行前二段的码字
c(n-i,1:
n-1)=c(n-i+1,n*(find(m(n-i+1,:
)==1))-(n-2):
n*(find(m(n-i+1,:
)==1)));
c(n-i,n)='1';
c(n-i,n+1:
2*n-1)=c(n-i,1:
n-1);
c(n-i,2*n)='0';
forj=1:
i-1%每次循环时其他元素的码字
c(n-i,(j+1)*n+1:
(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:
)==j+1)-1)+1:
n*find(m(n-i+1,:
)==j+1));
end
end
fori=1:
n%根据m矩阵第一行纪录的概率排序,给每个概率对应的符号分配码字
h(i,1:
n)=c(1,n*(find(m(1,:
)==i)-1)+1:
find(m(1,:
)==i)*n);
ll(i)=length(find(abs(h(i,:
))~=32));
end
l=sum(p.*ll);
以p=[1/6,1/4,5/12,1/6]为例
n=4
l=1.9167
ans=
001
01
1
000
四、哈夫曼编码的流程图
是
否
五、实验分析与总结
哈夫曼编码是一种无损压缩方法,其编码方式有以下几步:
1、首先统计信源中各符号出现的概率,按符号出现的概率从大到小排序;2、把最小的两个概率相加合并成新的概率,与剩余的概率组成新的概率集合;3、对新的概率集合重新排序,再次把其中最小的两个概率相加,组成新的概率集合。
如此重复进行,直到最后两个概率的和为l;4、分配码字:
码字分配从最后一步开始反向进行,对于每次相加的两个概率,大的赋0,小的赋1,将从该符号开始一直走到最后的概率和“1”的路线上所遇到的0和1按最低位到最高位的顺序排好,就是该符号的哈大曼编码。
哈夫曼编码方法得到的码字并不是唯一的。
原因有两个:
1、对概率大小的0、1编码方法是随便定义的,定义的方法不同,得到的最后的码字也不一样。
2、在合并后的概率中若出现与原来概率相同的,这两个概率放在什么位置,方法也不是唯一的,所以最后编码也不一样。