资源描述
信息论与编码
实验讲义
2
学生实验守则
1、进实验室前,必须根据每个实验的预习要求,阅读有关资料。
2、按时进入实验室,保持安静和整洁,独立完成实验。
3、实验开始前,应仔细检查仪器、设备是否齐备和完好。若有不全或损坏情况,应及时报告指导教师。
4、爱护公物,正确使用实验仪器和设备,不得随意动用与本实验无关的仪器和设备。
5、接线完毕,先自行检查,再请指导教师检查,确认无误后,方可接通电源。
6、在实验过程中必须服从教师指导,严格遵守操作规程,精力高度集中,操作认真,要有严格的科学态度。
7、实验进行中,严禁用手触摸线路中带电部分,严禁在未切断电源的情况下改接线路;若有分工合作的情况,必须要分工明确,责任分明,操作要有序,以确保人身安全和设备安全。
8、实验中若出现事故或发现异常情况,应立即关断电源,报告指导教师,共同分析事故原因。
9、实验完毕,应报请指导教师检查实验报告,认为达到要求后,方可切断电源。并整理好实验装置,经指导教师检查后才能离开实验室。
9
实验一 绘制二进制熵函数曲线
一、实验目的
1.掌握二进制符号熵的计算;
2.掌握MATLAB的应用;
3.掌握Matlab绘图函数;
4.掌握、理解熵函数表达式及其性质
二、实验条件
计算机一台,MATLAB仿真软件。
三、实验内容
(1)MATLAB的应用(请参阅相关书籍)
(2)打开MATLAB,在命令窗口中输入eidt,弹出编辑窗口,如图1:
图1 MATLAB的编辑窗口
(3)输入源程序:
clear;
x=0.001:0.001:0.999
y=-x.*log2(x)-(1-x).*log2(1-x);
plot(x,y);
grid on
(4)保存文件为entropy.m;
(5)单击Debug菜单下的Run,或直接按F5执行;
(6)执行后的结果图2:
四、实验分析
(1)熵函数是一个严格上凸函数
(2)熵的极大值,二进符号的熵在p(x1)=p(x2)=0.5取得极大值
(3)调调整p(x1)的取值步长,重画该曲线
图2 二进制符号熵函数图
实验二 一般信道容量迭代算法
一、实验目的
1.掌握准对称信道信道容量的计算方法
2.掌握准对称信道信源输入概率分布的计算
3.掌握一般信道容量迭代算法的原理
4.掌握应用MATLAB计算准对称信道的方法
5.掌握准对称信道的性质
6.掌握互信量的概念及与信道容量的关系
二、实验条件
计算机一台,MATLAB仿真软件。
三、实验内容
(1)MATLAB的应用(请参阅相关书籍)
(2)打开MATLAB,在命令窗口中输入eidt,弹出编辑窗口,如图3:
图3 MATLAB的编辑窗口
(3)MATLAB仿真
建立一个函数Channel.m输入如下代码:
function []=Channel(ArrayP)
Hxy=0;
for i=1:size(ArrayP,2)
Hxy=Hxy-ArrayP(1,i)*log2(ArrayP(1,i));
end
%Hxy=-1/2*log2(1/2)-1/4*log2(1/4)-1/8*log2(1/8)-1/8*log2(1/8)
x=0:0.01:1;
Py=ArrayP'*[x;1-x];
Y=Py';
result=[];
for i=1:size(Y,1)
result(i)=0;
for j=1:size(Y,2)
result(i)=result(i)-Y(i,j)*log2(Y(i,j)) ;
end
result(i)=result(i)-Hxy;
end
plot(x,result,'r');
grid on
在命令窗口输入:
p=[1/2 1/4 1/8 1/8;1/4 1/2 1/8 1/8];
channel(p);
得到计算结果如图4
图4 对于给定P后互信息量图
实验三 Huffman编码
一、实验目的
1.掌握变长编码原理
2.掌握二进制Huffman编码原理
3.掌握Huffman编码的最佳性
二、实验条件
计算机一台,MATLAB仿真软件。
三、实验内容
(1)MATLAB的应用(请参阅相关书籍)
(2)打开MATLAB,在命令窗口中输入eidt,弹出编辑窗口,如图3:
图3 MATLAB的编辑窗口
(3)MATLAB仿真
建立一个函数huffman.m输入如下代码:
function [h,H,L]=huffman(p)
%变量p为所有符号出现概率所组成的概率向量
%返回值h为利用Huffman编码算法编码后最后得到的编码结果
%返回值H为信源熵
%返回值为进行Huffman编码后所得到的编码的码字长度
if length(find(p<0))~=0
error('Not a prob.vector,negaative component(s)')
end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add to 1')
end
H=-sum(p.*log2(p))
n=length(p);
q=p;
m=zeros(n-1,n);
for i=1:n-1
[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
for i=1:n-1
c(i,:)=blanks(n*n);
end
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=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)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1';
for j=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
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
L1(i)=length(find(abs(h(i,:))~=32));
end
L=sum(p.*L1)
在命令窗口中输入:
p=[0.2 0.19 0.18 0.17 0.15 0.1 0.01]
[h,H,L]=huffman(p)
得到该信源的熵: H =2.6087
平均编码长度: L =2.7200
编码结果发如下:
h = 01
00
111
110
101
1001
1000
可计算出编码效率为:
实验四 线性分组码的信道编码和译码
一、内容
编程实现线性分组码的信道编码和译码。
二、要求
1. 掌握线性分组码的编码和译码原理以及纠错原理
2. 掌握matlab开发环境的使用(尤其是程序调试技巧)
3. 掌握matlab语言编程(尤其是位运算的操作)
三、实验内容
(1)MATLAB的应用(请参阅相关书籍)
(2)打开MATLAB,在命令窗口中输入eidt,弹出编辑窗口,如图3:
图3 MATLAB的编辑窗口
(3)MATLAB仿真
建立一个函数linecode.m输入如下代码:
clear;
K=3;
for i=1:2^k
for j=K:-1:1
if rem(i-1,2^(-j+K+1))>2^(-j+k)
m(i,j)=1;
else
m(i,j)=0;
end
end
end
g=[1 0 0 1 1 1 0;
0 1 0 0 1 1 1;
0 0 1 1 1 0 1];
%产生码字空间
code=m*g;
c=rem(m*g,2)
%找出最小汉明距离
d_min=min(sum((c(2:2^k,:))'))
dcode=rem(code/g,2)
执行程序得到结果如下:
c =
0 0 0 0 0 0 0
0 0 1 1 1 0 1
0 1 0 0 1 1 1
0 1 1 1 0 1 0
1 0 0 1 1 1 0
1 0 1 0 0 1 1
1 1 0 1 0 0 1
1 1 1 0 1 0 0
d_min =
4
dcode =
0 0 0
0.0000 0.0000 1.0000
-0.0000 1.0000 0.0000
0.0000 1.0000 1.0000
1.0000 0.0000 0.0000
1.0000 0.0000 1.0000
1.0000 1.0000 0.0000
1.0000 1.0000 1.0000
(4)测试线性分组码的纠错能力
在命令窗口输入:
>>g=[ 1 0 0 1 1 1 0;
0 1 0 0 1 1 1;
0 0 1 1 1 0 1];
>>H=[1 0 1 1 0 0 0;
1 1 1 0 1 0 0;
1 1 0 0 0 1 0;
0 1 1 0 0 0 1];
>> A = [1 1 0];
>> B = [A*G]
B =
1 1 0 1 2 2 1
这不是我们想要的7 位编码字,MATLAB做的是传统的矩阵乘法。为了得到击破要的码字,必须把所有偶数值改为0,把奇数值改为1。在这里使用除2 的余数
>> B = mod(B,2)
B =
1 1 0 1 0 0 1
注意到B 中前3位是A,后3位是约束位。
解码器探询误差时使用矩阵H:
>> C = mod(B*H’,2)
C =
0 0 0 0
C完全是0,这表示没有需要校正的误差,所以解码器只是简单地去除掉约束位。现在假设在第3位发生了误差,所以解码器收到的信息是[1 1 1 1 0 0 1],而不是[1 1 0 1 0 0 1]。现在,
>> B(3) = ~B(3);
>> C = mod(B*H’,2)
C =
1 1 0 1
由于我们选择的H,得到的结果是1 1 0 1,与H矩阵的第3列相同,即第3位发生了错误,可以纠正为1 1 0 1 0 0 1。
四、实验总结
通过该实验可以验证,(7,3)线性分组码可以检测并同时纠正1位错误。
展开阅读全文