信息理论与编码实验指导书.docx
- 文档编号:8924582
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:24
- 大小:196.08KB
信息理论与编码实验指导书.docx
《信息理论与编码实验指导书.docx》由会员分享,可在线阅读,更多相关《信息理论与编码实验指导书.docx(24页珍藏版)》请在冰点文库上搜索。
信息理论与编码实验指导书
《信息理论与编码》实验指导书
武汉理工大学教材中心
2009年7月
实验一绘制二进熵函数曲线
一、实验目的
1.熟悉Matlab工作环境及工具箱;
2.掌握Matlab绘图函数;
3.理解熵函数表达式及其性质。
二、实验内容
实验内容与要求
内容:
用Matlab软件绘制二进熵函数曲线。
要求:
1.提前预习实验,认真阅读教材及相应的参考书,熟悉实验原理;
2.遵守实验室规定,实验过程中服从实验室管理人员和实验指导老师的管理;
3.独立完成实验,认真做好实验记录;
4.实验结束后,认真填写实验报告。
知识要点
1.信源熵的概念及其性质。
参照教材及参考书。
2.二进熵公式:
注意:
虽然理论上定义0·log0=0,但是,在实际运算时,对数函数logx的变量x不能取0值,而应设置一个系统默认的最小值eps。
三、实验总结
1、绘制二进熵函数曲线,观察曲线形状。
2、结合熵函数的性质,分析二进熵函数曲线的特点。
四、思考与提高
1、绘制三元熵函数曲线,观察曲线形状。
2、结合熵函数的性质,分析三元熵函数曲线的特点。
p=0.00001:
0.00001:
0.99999;
h=-p.*log2(p)-(1-p).*log(1-p);
plot(p,h);
title('二进熵函数曲线');
ylabel('H(p,1-p)');
p=linspace(eps,1-eps,100);
q=linspace(eps,1-eps,100);
[P,Q]=meshgrid(p,q);
P_Q=P+Q;
forn=1:
100
form=1:
100
ifP_Q(n,m)>=1
Q(n,m)=nan;
end
end
end
H=-P.*log2(P)-Q.*log2(Q)-(1-P-Q).*log2(1-P-Q);
mesh(P,Q,H);
title('三维熵函数图像');
实验二一般信道容量迭代算法
一、实验目的
1、熟悉Matlab工作环境及工具箱;
2、掌握一般信道容量迭代算法的原理。
二、实验内容
实验内容与要求
内容:
用Matlab软件编程实现一般信道容量迭代算法。
要求:
1、提前预习实验,认真阅读相应的参考书,熟悉实验原理;
2、遵守实验室规定,实验过程中服从实验室管理人员和实验指导老师的管理;
3、独立完成实验,认真做好实验记录;
4、实验结束后,认真填写实验报告。
知识要点:
:
1、一般信道容量迭代算法的原理。
参照教材及参考书。
2、程序流程图如下:
其中:
(1)
(2)
实验提示:
1、设定不同的信道(对称信道、非对称信道),计算最佳输入分布,分析计算结果的异同。
2、设定不同的迭代精度,分析其对计算结果的影响。
三、实验总结
1、信道的性质与最佳输入分布的关系。
2、迭代精度对计算结果的影响。
四、思考与提高
1、编制一般信道容量迭代算法的通用程序,适应不同的信道特性。
2、优化程序,提高运算速度。
实验三二进制霍夫曼编码
一、实验目的
1、熟悉Matlab工作环境及工具箱;
2、掌握霍夫曼编码的基本步骤;
3、利用MATLAB实现霍夫曼编码。
二、实验内容
实验内容与要求
内容:
用Matlab软件编程实现二进制霍夫曼编码。
要求:
1、提前预习实验,认真阅读相应的参考书,熟悉实验原理;
2、遵守实验室规定,实验过程中服从实验室管理人员和实验指导老师的管理;
3、独立完成实验,认真做好实验记录;
4、实验结束后,认真填写实验报告。
知识要点:
1、霍夫曼编码的基本原理。
参照教材及参考书。
2、二进制霍夫曼编码方法。
基本原理:
变长编码
不要求所有码字长度相同,对不同概率的信源符号或序列,可赋予不同长度的码字。
变长编码力求平均码长最小,此时编码效率最高,信源的冗余得到最大程度的压缩。
1)几种常用变长编码方法:
霍夫曼编码
费若编码
香农编码。
2)霍夫曼编码:
二进制霍夫曼编码
r进制霍夫曼编码
符号序列的霍夫曼编码。
3)二进制霍夫曼编码的编码过程:
将信源中n个符号按概率分布的大小,以递减次序排列起来;
用0和1码分别分配给概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个新符号,并用这两个最小概率之和作为新符号的概率,从而得到只包含n-1个符号的新信源,称为其缩减信源;
把缩减信源的符号仍按概率大小以递减次序排列,再将最后两个概率最小的符号合并成一个新符号,并分别用0和1码表示,这样又形成一个新缩减信源;
依次继续下去,直到缩减信源最后只剩两个符号为止。
再将最后两个新符号分别用0和1码符号表示。
最后这两个符号的概率之和为1,然后从最后一级缩减信源开始,依编码路径右后向前返回,就得到各信源符号所对应得码符号序列,即对应得码字。
r进制霍夫曼编码
由二进制霍夫曼编码可推广到r进制霍夫曼编码,只是每次求缩减信源时,改求r个最小概率之和,即将r个概率最小符号缩减为一个新符号,直到概率之和为1。
但要注意,即缩减过程中可能到最后没有r个符号。
为达次目的,可给信源添加几个概率为零的符号。
符号序列的霍夫曼编码
对信源编码除了对信源符号编码以外,也可对信源符号序列编码,一般来说,对序列编码比对单个符号更为有效。
实验提示:
1、取得信源概率分布,并进行合法性判断;
2、对信源概率分布进行降序排列;
x=fliplr(sort(x))
3、建立空的编码表—构造一个零矩阵;
B=zeros(n,n-1)
4、将信源概率分布及以后产生的缩减序列放入矩阵的某一列;
5、利用得到的编码矩阵获得各元素的编码结果并输出。
三、实验总结
1、变长编码和定长编码的优缺点。
2、二进制霍夫曼编码的特点。
四、思考与提高
比较各种无失真信源编码算法的优缺点。
实验四线性分组码的信道编码和译码
一、实验目的
1、熟悉Matlab工作环境及工具箱;
2、掌握线性分组码的编码、译码原理以及纠错原理。
二、实验内容
实验内容与要求
内容:
用Matlab软件编程实现线性分组码的信道编码和译码。
要求:
1、提前预习实验,认真阅读相应的参考书,熟悉实验原理;
2、遵守实验室规定,实验过程中服从实验室管理人员和实验指导老师的管理;
3、独立完成实验,认真做好实验记录;
4、实验结束后,认真填写实验报告。
知识要点:
1、线性分组码的编码、译码原理。
参照教材及参考书。
2、线性分组码的设计。
基本原理:
首先,将信息序列分成K个符号一组,然后,在信息组中加入一些校验码元,组成N长码字,由此得到(N,K)分组码。
(N,K)分组码中任一码字的码长为N,所含的信息位数目为K,校验位数目为r=N-K,且码中任意两个码字的和仍为码字。
例如,对于(5,2)分组码,N=5,K=2,其编码函数f为
由编码函数可知:
c(码字)=m(信息矩阵)G(生成矩阵)
其中,生成矩阵
当生成矩阵G确定后,编码的问题就解决了。
又由编码函数的后3个方程可以确定校验方程,对应的矩阵形式为
或
,式中,H称为一致性校验矩阵。
一致性校验矩阵如下:
H与G的关系:
,
。
纠错译码时,若发送码字为c,则接收序列为y,校正子S=y*
=e*
。
因此,可以得到译码c=y
e(模2和)。
其中,e称为差错图样。
S是传输是否出错的标志,称为伴随式。
(5,2)线性分组码的最小汉明距离为dmin=3,能够检出2位错误或纠正1位错误。
线性分组码的信道编码和译码流程图:
图1线性分组码信道编码流程图
图2线性分组码信道译码流程图
实验提示:
1、线性分组码中生成矩阵、校验矩阵、伴随式之间的关系。
2、在计算矩阵时,注意位操作运算。
三、实验总结
1、根据不同的线性分组码,观察生成矩阵和校验矩阵的特性。
2、根据不同的线性分组码,分析检错和纠错能力。
四、思考与提高
1、编制线性分组码的信道编码和译码的通用程序,适应不同的生成矩阵和校验矩阵。
2、优化程序,提高运算速度。
实验五分组乘积Turbo码动态迭代译码算法
一、实验目的
1.熟悉Matlab工作环境及工具箱;
2.掌握分组乘积Turbo码的编码、译码原理。
二、实验内容
实验内容与要求
内容:
用Matlab编程实现分组乘积Turbo码动态迭代译码仿真、并试着对其算法提出优化方法。
要求:
1.提前预习实验,认真阅读教材及相应的参考书,熟悉实验原理;
2.遵守实验室规定,实验过程中服从实验室管理人员和实验指导老师的管理;
3.独立完成实验,认真做好实验记录;
4.实验结束后,认真填写实验报告。
知识要点
1.分组乘积Turbo码
(简称TPC码)是一类将分组码进行串行级联,并采用分组交织器构成的级联码,是一种构造十分简单的纠错码,它是香农信息理论提出后第一个在非零码率时可以实现无误码传输的纠错编码。
采用迭代译码方法,可发挥该码的良好性能,并特别适合于高速硬件译码。
2.TPC码的编码结构
在乘积码中,分量码一般采用线性分组码,其结构简单,易于实现。
乘积码的编码过程可以分为三个步骤:
(1)将信息元填入一个m2行m1列的矩阵;
(2)对矩阵的每一行用一个(n1,m1)系统分组码k1进行编码,得到一个m2行n1列的矩阵;
(3)对这个矩阵的每一列用一个(n2,m2)系统分组码k2进行编码,最终得到一个n2行n1列的矩阵。
这样得到的纠错码是一个(n1*n2,m1*m2)分组码,所以称为乘积码。
3.TPC码的译码算法
Chase算法是一种找码字D的低复杂度的次优算法。
4.TPC码的迭代译码
在迭代过程中行译码和列译码交替进行,相互之间提供外信息,每进行一次行译码或列译码可以看作半次迭代。
注意:
增加迭代次数可以提高TPC码的纠错性能,但是当迭代达到一定限度以后,译码性能就呈现出饱和的趋势。
三、实验总结
1、分组乘积Turbo码动态迭代译码分析、仿真。
2、针对相应算法提出改进意见。
四、思考与提高
1、当使用不同收敛率的两组参数,比较其迭代的次数,并分析那种参数可以起到改善译码性能的目的。
实验六MIMO系统信道容量分析
一、实验目的
1.熟悉Matlab工作环境及工具箱;
2.掌握Matlab绘图函数;
3.理解MIMO系统信道容量的分析方法。
二、实验内容
实验内容与要求
内容:
用Matlab软件实现对一些典型MIMO系统信道容量进行仿真。
要求:
1.提前预习实验,认真阅读教材及相应的参考书,熟悉实验原理;
2.遵守实验室规定,实验过程中服从实验室管理人员和实验指导老师的管理;
3.独立完成实验,认真做好实验记录;
4.实验结束后,认真填写实验报告。
知识要点
1.MIMO:
多输入多输出无线通信系统。
提高通信系统的容量和频谱利用率,是新一代移动通信系统采用的关键技术。
2.MIMO系统模型
MIMO系统的输入输出关系可表示为
式中,
,xn表示从第n根发射天线发射的信号。
3.MIMO信道容量
这里主要考虑当接收机已知信道状态信息而发射机不知道信道状态信息的信道条件.在这种信道条件下,可利用
三、实验总结
1、信道矩阵为一个确定性的数值矩阵时的信道容量。
2、信道传输矩阵H为全1矩阵时的情况。
四、思考与提高
1、比较MIMO系统与传统SISO系统之间的区别。
附录:
(参考程序)
1、计算任意多个符号信源的熵
functionH=entropy(p)
%该函数用来计算包含任意多个符号的信源熵(比特)
%p为DMS的概率分布,行向量
ifsum(p)~=1%判断是否满足概率完备性
error('!
!
!
不满足概率完备性,请重新输入信源分布')
return;
else
L=length(p)%得到信源符号的个数
H=0;%熵值初始化为零
fori=1:
L
H=H-p(i)*log2(p(i));%累加熵函数各个子项
end
end
Matlab函数说明:
(1)sum(A):
求数组A的元素之和
(2)length(X):
求矢量X的长度
(3)log2(X):
计算以2为底X的对数
(4)error:
显示错误信息
2、绘制二元信源熵函数曲线
clc
%让概率从一个很小的数0.000001开始变化,步长为0.001:
p=0.000001:
0.001:
1;
h=-p.*log2(p)-(1-p).*log2(1-p);%log2也可以计算矢量,结果也为矢量
plot(p,h);
title('二符号信源熵函数曲线');
ylabel('H(p,1-p)')
运行结果:
3、绘制三元熵函数曲线
p=linspace(eps,1-eps,100);
q=linspace(eps,1-eps,100);
[P,Q]=meshgrid(p,q);
P_Q=P+Q;
forn=1:
100
form=1:
100
ifP_Q(n,m)>=1
Q(n,m)=nan;
end
end
end
H=-P.*log2(P)-Q.*log2(Q)-(1-P-Q).*log2(1-P-Q);
mesh(P,Q,H)
title('三维熵函数的图形')
程序说明:
(1)eps:
极小值,避免0概率事件
(2)meshgrid:
语法[X,Y]=meshgrid(x,y)将矢量x和y规定的区域变换为数组X和Y,X和Y可用于计算2自变量函数或绘制3维网格/表面。
X的各行均为矢量x;Y的各列均为矢量y。
(3)nan:
无效值
(4)mesh:
绘制网格曲面
运行结果:
4.将迭代算法用matlab代码实现如下
functionanswer=chacap(Pt)
%Pt:
信道矩阵
%用matalb的eps代替信道矩阵内的元素0以避免对0取对数
%C:
信道容量
[r,s]=size(Pt);%确定输入和输出符号个数
Pi=ones(1,r)/r;%行向量,输入分布初始化为等概
Cn=0;%C(n)初始化为0
Cn1=inf;%C'(n)初始化为无穷大
beta=ones(1,r);%偏互信息的指数
I=1;%互信息初始化为1
whileabs(Cn-Cn1)>=1.0e-004%迭代误差限
fork=1:
r
Pi(k)=Pi(k)*beta(k)/I;%更新输入分布
end
%以下计算beta(k):
Po=Pi*Pt;%输出概率
fork=1:
r
bt=0;%中间变量
forj=1:
s
bt=bt+Pt(k,j)*log(Pt(k,j)/Po(j));
end
beta(k)=exp(bt);
end
I=Pi*beta';%各β的加权平均
Cn=log(I);%
Cn1=log(max(beta));%各β的最大值
end
C=Cn*log2(exp
(1));%比特
answer=sprintf('该信道的信道容量C=%f比特/信道符号',C);
程序说明:
(1)ones:
创建一个全1的数组
(2)inf:
无穷大
(3)abs:
求绝对值
(4)该程序返回字符串answer
5、绘制二进制对称信道平均互信息量Matlab实现
[p,q]=meshgrid(0.000001:
0.01:
1,0.000001:
0.01:
1);
Hnoise=-p.*log2(p)-(1-p).*log2(1-p);%噪声熵
x=(1-p).*q+p.*(1-q);
I=-x.*log2(x)-(1-x).*log2(1-x)-Hnoise;
mesh(p,q,I)
运行结果:
分析说明:
从图上可以看出:
信道给定的条件下,平均互信息随信源分布呈现上凸性,具有最大值。
而在信源给定的条件下,平均互信息随信道转移概率呈现下凸性,具有最小值。
6、编制LZW算法
function[CodeStream,CS_hexa,CS_binary,CompressionRatio]=lzw(SourceSeq)
%采用8比特LZW编码,首先构造一个包含256个“单词”的字典,
%可以对ASCII码表中字符构成的序列进行编码
%SourceSeq:
信源符号序列
%CodeStream:
单词位置构成的码流序列
%CS_hexa:
3位16进制数表示的位置码
%CS_binary:
12比特表示的位置码序列
%CompressionRatio:
压缩比
SourceSeq=uint8(SourceSeq);
dict=cell(1,256);%字典初始化
fori=1:
256,
dict{i}=uint8(i-1);%用2个字节表示前缀字符
end
CodeStream=SourceSeq;%输出码流初始化
i_CS=1;%码流索引
len_seq=length(SourceSeq);
W1=[];%前缀初始化为空
fori=1:
len_seq
W2=SourceSeq(i);%读取第i个序列符号W,必定存在于字典中
neword=[W1W2];%组成一个新单词neword
position=poscode(neword,dict);%在字典中查找新单词
ifisempty(position)%字典中没有neword
dict{end+1}=neword;%将新单词添加到字典中
ps=poscode(W1,dict);%获得W1的位置码
CodeStream(i_CS)=ps;%输出W1的位置码
W1=W2;%前缀更新为W2
i_CS=i_CS+1;%
else%字典中已有新单词
W1=neword;%更新前缀为新单词
end
end
CodeStream(i_CS+1:
end)=[];
CS_hexa=dec2hex(CodeStream,3);%每个位置码用12比特(3位16进制数)来表示
CS_binary=dec2bin(CodeStream,12);%每个位置码用12比特来表示
NumCodeword=length(CodeStream);%码字个数
CompressionRatio=len_seq*8/(12*NumCodeword);%计算压缩比
functionposition=poscode(word,dict)
position=[];%位置码初始化为空
iflength(word)==1%word只包含一个字符
position=word;%该字符的ASCII码即为其位置码
else%word包含多个字符
fori_dict=257:
length(dict)%在字典的初始位置码之外查找
ifisequal(dict{i_dict},word)%在字典中查找到新单词W1W2
position=i_dict;%word在字典中的位置序号即为其位置码
end
end
end
程序说明:
a)uint8:
转换为无符号整数(0~255)
b)cell:
创建胞元数组
c)poscode:
为自编的函数,实现在字典中查找单词位置的功能
d)end:
数组最后的下标
7、编制算术编码算法
functioncodestream=arithcoder(SourceSeq,P,SymbolSet)
%SourceSeq:
字符串,信源符号序列
%P:
行矢量,信源符号概率分布
%SymbolSet:
字符串,信源符号集合(顺序与P对应)
len_seq=length(SourceSeq);%信源序列长度
num_sym=length(SymbolSet);%信源符号个数
F=zeros(1,num_sym);%符号的累计分布初始化
fori=2:
num_sym
F(i)=F(i-1)+P(i-1);%计算信源符号的累积概率分布函数
end
FF=0;%序列的累积分布初始化
A=1;%序列对应的区间长度
fori=1:
len_seq
sym=SourceSeq(i);%读取信源序列的第i个符号
i_set=find(SymbolSet==sym);%确定当前符号sym种子符号集的位置
FF=FF+A*F(i_set);
A=A*P(i_set);
end
CodeLength=ceil(-log2(A));%确定码长
codeword=[];
fori=1:
CodeLength
FF=2*FF;
bit=floor(FF);
codeword=[codewordbit];
FF=FF-bit;
end
codeword
程序说明:
a)ceil:
ceil(A)返回不小于A的最小整数
b)floor:
floor(A)返回不超过A的最大整数
8、线性分组码的信道编码和译码MATLAB实现:
clear;clc;
%编码
G=input('请输入生成矩阵G,例如:
G=[10111;01101]\nG=');
[k,n]=size(G);
r=n-k;
m=input('请输入需传送信息m,如m=[00011011]\nm=');
l=length(m);
if(mod(l,k))
disp('输入的信息有误');
else
ge=l/k;
%将输入序列转化成矩阵m
temp1=[];
fori=1:
ge
temp1(i,:
)=m(k*(i-1)+1:
i*k);
end
m=temp1;
%求校验矩阵H
c=mod(m*G,2);A=G(:
k+1:
n);
H=[A',eye(r)];
disp('校验矩阵');H
disp('编码矩阵');c
e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息 理论 编码 实验 指导书