大三下信息论实验报告.docx
《大三下信息论实验报告.docx》由会员分享,可在线阅读,更多相关《大三下信息论实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
大三下信息论实验报告
实验1绘制二进熵函数曲线、串联信道容量曲线
一、实验内容
用Excel或Matlab软件制作二进熵函数曲线、串联信道容量曲线。
二、实验环境
1.计算机
2.Windows2000或以上
3.MicrosoftOffice2000或以上
4.Matlab6.0或以上
三、实验目的
1.掌握Excel的数据填充、公式运算和图表制作
2.掌握Matlab绘图函数
3.掌握、理解熵函数表达式及其性质
四、实验要求
1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。
3.认真填写实验报告。
五、实验原理
1.Excel的图表功能(略)
2.信源熵的概念及性质
3.串联信道的信道容量(图1)。
图1三个二元对称信道(BSC)的串联
串联
信道转移矩阵
信道容量
I
I,II
I,II,III
p=0.00001:
0.001:
0.9999;
h=Hp(p);
plot(p,h);
title('熵函数')
p=0.00001:
0.001:
0.9999;
c=1-Hp(p.^3+3.*p.*(1-p).^2);
plot(p,c);
title('信道容量')
p=0.00001:
0.001:
0.9999;
c1=1-Hp(p);
c2=1-Hp(2*p.*(1-p));
c3=1-Hp(p.^3+3.*p.*(1-p).^2);
subplot(3,1,1)
plot(p,c1);
title('CⅠ');
subplot(3,1,2)
plot(p,c2);
title('CⅠⅡ');
subplot(3,1,3)
plot(p,c3);
title('CⅠⅡⅢ');
实验4容量代价函数的计算程序设计
1、问题的提出:
假定一个离散无记忆信源(DMC)的输入符号集为AX={1,2,...,r},输出符号集为AY={1,2,....,s},信道的转移概率矩阵P(Y|X):
{p(y|x)};该信道不是免费的,其输入代价为b(x)。
容量代价函数C(β)=supCn(β)/n
n
如果单位时间内占用信道的平均代价必须≤β,则C(β)的值表示信道单位时间内能够可靠传输的最大信息量。
计算容量代价函数C(β)在通信领域,密码学等方面均有着很重要的用途。
对于一般信道要求出C(β)非常困难,计算过程繁琐,很容易计算错误。
2、解决问题的原理方法:
1.C()的一般计算方法:
计算bmin是很容易的。
;
当bmin£b£bmax时,设试验信源X达到了C(b),即C(b)=max{I(X;Y):
E([b(x)]=b}。
在数学上,就是在约束条件下:
(1)
并且P(x)³0
(2)
的约束下求平均互信息量
的条件极大值。
为此引入待定常数S和m,并作辅助函数
(3)
其中
由
得,
(4)
上式两边同乘以p(x)并对x求和。
即C(b)=loge+Sb+m(5)
显然(4)提供r个方程,再加上
(1)
(2)的方程,共r+2个方程;而有r个未知数p(x)、及S、m,共r+2未知数,显然可以求解。
一般来说,S、m是b的函数。
(1)
(2)(4)组成的r+2个方程是一个非常复杂的非线性方程组。
(4)式可以写成矩阵形式:
2.一般非线性方程组求解方法:
下面介绍求非线性方程组一组是实根的梯度法:
设非线性方程组为
并定义目标函数为:
则梯度法的计算过程如下:
(1)选取一组初值x0,x1,...,xn-1
(2)计算目标函数值F
(3)若F(4)计算目标函数在(x0,x1,...,xn-1)的偏导数
再计算
(5)计算
其中l=F/D。
重复
(2)~(5)直到满足精度要求为止。
在上述过程中,如果D=0,则说明遇到了目标函数的局部极值点,此时可改变初值在试试。
在我们的问题中,不会遇到该问题。
另在计算中我们限制一个最大循环次数,以防D过小,使计算时间过长的情况。
3、解决问题的具体方法:
用Matlab画出容量代价函数C(b)的曲线图。
为了计算一给定代价信道的容量函数,要用3个MATLAB函数,如下:
⏹Cfun
CFUN代价容量方程组,用于信道容量
x输入,一行m+2列(1*(m+2)
beta平均代价,标量
b代价矩阵,一行m列(1*m)
Py_x转移概率矩阵,m行n列(m*n)
代码:
functionF=Cfun(x,beta,b,Py_x)
%CFUN代价容量方程组,用于信道容量
%x输入,一行m+2列(1*(m+2)
%beta平均代价,标量
%b代价矩阵,一行m列(1*m)
%Py_x转移概率矩阵,m行n列(m*n)
sizePy_x=size(Py_x);
m=sizePy_x
(1);
n=sizePy_x
(2);
F=zeros(m+2,1);
i=1:
m;
P_y=x(1,1:
m)*Py_x;
TP_y=zeros([m,n]);
forj=1:
m
TP_y(j,:
)=P_y;
end
TP_y=TP_y';
t=Py_x(i,:
)'./TP_y;
t(find(t==0))=1;
F(i)=sum(Py_x(i,:
)'.*log2(t))-log2(exp
(1))-x(m+1)*b(i)-x(m+2);
F(m+1)=1-sum(x(1,1:
m));
F(m+2)=beta-sum(x(1,1:
m).*b);
⏹C
C求信道容量
beta平均代价,标量
b代价矩阵,一行m列(1*m)
Py_x转移概率矩阵,m行n列(m*n)
代码:
functionc=C(beta,b,Py_x)
%C求信道容量
%beta平均代价,标量
%b代价矩阵,一行m列(1*m)
%Py_x转移概率矩阵,m行n列(m*n)
sizeB=size(b);
sizePy_x=size(Py_x);
if~(sizeB
(2)==sizePy_x
(1))
disp('参数b的列数应和参数Py_x的行数相同');
c=-1;
return;
end
m=sizePy_x
(1);
n=sizePy_x
(2);
sumPy=sum(Py_x');
if~(all(Py_x>=0)&all(sumPy==1))
disp('参数Py_x的每个元素都要大于或等于0,且每行的和应等于1');
c=-1;
return;
end
minBeta=min(b);
ifbetadisp('参数beta太小');
c=-1;
return;
end
x0=ones(1,m+2)./m;
options=optimset('TolFun',0.000001,'Display','off');
r=fsolve(@Cfun,x0,options,beta,b,Py_x);
s=r(m+1);
u=r(m+2);
c=log2(exp
(1))+s*beta+u;
end
⏹plotCBeta
PLOTCBETA画信道的代价容量曲线
b代价向量,一行m列(1*m)
Py_x转移概率矩阵,m行n列(m*n)
代码:
function[minb,maxb]=plotCBeta(b,Py_x)
%PLOTCBETA画信道的代价容量曲线
%b代价向量,一行m列(1*m)
%Py_x转移概率矩阵,m行n列(m*n)
minBeta=min(b);
maxBeta=max(b);
beta=minBeta:
0.1:
maxBeta;
l=length(beta);
r=zeros(1,l);
fori=1:
l
r(i)=C(beta(i),b,Py_x);
end
minb=minBeta;
maxC=max(r);
maxb=maxC;
l=find(r==maxC);
plot(beta(1:
l),r(1:
l));
end
4、实验结果:
示例1:
Q=[100;010;001],b=[321],求其代价容量函数?
>>Q=[100;010;001];
>>b=[3,2,1];
>>plotCBeta(b,Q)
结果:
ans=
1
五、结果分析
C(b)的性质:
在βmin≤β≤βmax内,是一个严格上升函数。
C(βmin)=Cmin,C(βmax)=Cmax。
当β≥βmax时,C(β)是一个常数Cmax。
因此C(β)=max{I(X;Y):
E[b(x)]=β},βmin≤β≤βmax。
这说明,达到C(β)的试验信号,可以在E[b(x)]=β的区域中找到,实际上也只能在这个区域内找到。
实验6BCH循环码的编码与译码
一、实验内容
用VC或Matlab软件编写循环BCH码的编码与译码程序。
利用程序对教科书的例题做一个测试。
二、实验环境
1.计算机
2.Windows2000或以上
3.MicrosoftVisualC++6.0或以上
4.Matlab6.0或以上
三、实验目的
1.通过BCH循环码的编码与译码程序的编写,彻底了解并掌握循环BCH的编码与译码原理
2.通过循环BCH码的编码与译码程序的编写,提高编程能力。
四、实验要求
1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.对不同信道的进行误码率分析。
特别是对称信道,画出误码性能图。
即信道误码率与循环汉明码之间的关系。
3.认真填写实验报告。
五、实验原理
1.循环BCH的编码与译码原理(略)
2.循环BCH的程序实现。
六、实验步骤
bch_en_decode.m文件
functionbch_en_decode()
code=bch155
code=code+randerr(5,15,1:
3);
code=rem(code,2);
code=gf(code)%随机产生1-3位错误
decode=debch155(code)
end
functiondecode=debch155(code)
code=gf(code);
M=4;
code=gf(code.x,M);
[m,n]=size(code);decode=[];
code1=[];
fori=1:
m;code1=code(i,:
);
M=code1.m;T2=6;N=15;
S=code1*((gf(2,M,code1.prim_poly)).^([N-1:
-1:
0]'*([1:
T2])));
LambdaX=gf([1zeros(1,T2)],M,code1.prim_poly);
Tx=[01zeros(1,T2-1)];
L=0;
fork=1:
T2;
LambdaXTemp=LambdaX;
Delta=S(k)-LambdaXTemp(1+[1:
L])*(S(k-[1:
L]))';
ifDelta.x;
LambdaX=LambdaXTemp-Delta*Tx;
if2*LL=k-L;
Tx=LambdaXTemp/Delta;
end;
end;
Tx=[0Tx(1:
T2)];
end;
LambdaXValue=LambdaX.x;
LambdaX=gf(LambdaXValue(1:
max(find(LambdaXValue))),M,code1.prim_poly);
errLoc_int=roots(LambdaX);errLoc=log(errLoc_int);
fori=1:
length(errLoc);
errorMag=1;
code1(N-errLoc(i))=code1(N-errLoc(i))-errorMag;
end;
decode=[decode;code1];end;
ccode=gf(decode.x);
decoded=ccode(:
1:
5);
end
function[yout]=bch155(x)%定义函数
k=5;%信息码位,BCH(15,5)
ifnargin<1
x2=randint(5,k);
n=5;
msg=x2%判断输入信息,若未输入,系统自动产生5组信息码,并显示出信息位
elseifrem(length(x),k)==0;n=length(x)/k;x2=[];%判断msg是否为K的整数倍,并把输入码员分组
fori=0:
n-1
x2=[x2;x(i*k+1)x(i*k+2)x(i*k+3)x(i*k+4)x(i*k+5)];
end
ifrem(length(x),k)>0%把输入码员补零并分组
x=[x,zeros(size(1:
k-rem(length(x),k)))];
n=length(x)/k;x2=[];
fori=0:
n-1
x2=[x2;x(i*k+1)x(i*k+2)x(i*k+3)x(i*k+4)x(i*k+5)];
end
end
end
ik=[eye(5)zeros(5,10)];%输入信息码扩展
x3=x2*ik;
yout=[];
fori=1:
n
g=[10100110111];
[w,yo]=deconv(x3(i,:
),g);%产生余式
yo=abs(rem(yo,2));
yout=[yout;yo];
end
yout=yout+x3;%产生信息码
end
运行结果:
msg=
11010
01101
01000
11101
00100
code=
110101100100011
011011100001010
010001111010110
111010110010001
001000111101011
code=GF
(2)array.
Arrayelements=
110101010100011
011111100001010
000001111000110
110010111010001
001100111101011
decode=GF(2^4)array.Primitivepolynomial=D^4+D+1(19decimal)
Arrayelements=
110101100100011
011011100001010
010001111010110
111010110010001
001000111101011