信息论与编码技术实验报告

  • 格式:doc
  • 大小:45.00 KB
  • 文档页数:4

《信息论与编码技术》实验报告

实验一:请根据公式-plogp,说明小概率事件和大概率事件对熵的贡献。

解:先做图,然后分析。

将公式写为

)(log)(2pppf

对它编写计算和画图程序如下:

p=0:0.01:1;

x=-p.*log2(p);plot(p,x);

从图中曲线看出,小概率事件和大概率事件的情况下,熵值都很低,贡献很小,在概率为0.5附近时熵值最大,故此时对熵的贡献最大。

实验二:请对a、b、c霍夫曼编码,它们的概率是0.6、0.3、0.1。并以此对符号串ababaacbaa编码和译码。

解:

编码步骤分为:事件排序,符号编码,信源编码,信道编码。

MATLAB程序:

clc;

a=0.3;b=0.3;c=0.4; %%%霍夫曼编码

A=[a,b,c];

A=fliplr(sort(A)); %%%降序排序

if (a==b)&(a>c), %%实现了当a,b,c其中两概率相同时的编码,及3值均不同时的编码

u='a';x=a;

v='b';y=b;

w='c';z=c;

elseif(a==b)&(a

u='c';x=c;

v='a';y=a;

w='b';z=b;

elseif(c==b)&(c>a),

u='b';x=b;

v='c';y=c;

w='a';z=a;

elseif(c==b)&(c

u='a';x=a;

v='b';y=b;

w='c';z=c; elseif(a==c)&(a>b),

u='a',x=a;

v='c',y=c;

w='b',z=b;

elseif(a==c)&(a

u='b';x=b;

v='a';y=a;

w='c';z=c;

else

if A(1,1)==a,u='a';x=a;

elseif A(1,1)==b,u='b';x=b;

elseif A(1,1)==c,u='c';x=c;

end

if A(1,2)==a,v='a';y=a;

elseif A(1,2)==b,v='b';y=b;

elseif A(1,2)==c,v='c';y=c;

end

if A(1,3)==a,w='a';z=a;

elseif A(1,3)==b,w='b';z=b;

elseif A(1,3)==c,w='c';z=c;

end

end %%%x,y,z按从大到小顺序存放a,b,c的值,u,v,w存对应字母

if x>=(y+z),U='0';V(1)='0';V(2)='1';W(1)='1';W(2)='1';

else U='1';V(1)='0';V(2)='0';W(1)='1';W(2)='0';

end

disp('霍夫曼编码结果:')

if u=='a',a=fliplr(U),elseif u=='b',b=fliplr(U),else c=fliplr(U),end

if v=='a',a=fliplr(V),elseif v=='b',b=fliplr(V),else c=fliplr(V),end

if w=='a',a=fliplr(W),elseif w=='b',b=fliplr(W),else c=fliplr(W),end

%%%编码步骤为:信源编码,信道编码

disp('信源符号序列:')

s='ababaacbaa' %%%信源编码

q=[];

for i=s;

if i=='a',d=a;

elseif i=='b';d=b;

else d=c;

end; q=[q,d];

end

m=[]; %%%符号变数字

for i=q;

m=[m,str2num(i)];

end

P=[1,1,1,0;0,1,1,1;1,1,0,1];G=[eye(3),P];%%%信道编码

%%%接下来的for循环在程序中多次使用,此处作用是将已编码组m每3个1组放入mk中进行运算之后存入Ck数组中,每次mk中运算结束之后清空,再进行下一组运算,而信道编码结果数组C则由C=[C,Ck]存入每组7个码。在其后的程序中,经常使用它进行每组固定个数(3或4或7)码的单独运算或比较。

mk=[];

C=[];

for i=m; %%%i逐个取m的值

mk=[mk,i];

if length(mk)==3; %%%每组取3个m值存在mk中

Ck=mk*G; %%%利用生成矩阵,计算得每组7个C值放入Ck中

Ck=Ck+randerr(1,7); %%%加信道干扰

C=[C,Ck]; %%%将每组Ck顺次排在C中

mk=[]; %%%清空mk值进入下一个循环

end

end

disp('信道编码结果如下:')

C=mod(C,2)

%%%解码步骤为信道译码,信源译码。

H=[P',eye(4)]; %%% 信道译码

Ci=[];

S=[];

N1=[];

for i=C;

Ci=[Ci,i];

if length(Ci)==7; %%%取得信道传送来码,每7位1组放入Ci

Sk=Ci*H'; %%%计算每组Ci的伴随式

Sk=mod(Sk,2); %%%二进制

for j=1:3; %%%取H的前三列与Sk转置逐次对比,若有相同项则对应Ci码加1

if Sk'==H(:,j);

Ci(j)=Ci(j)+1; end

end

N1=[N1,Ci(1:3)]; %%% 将纠错后的Ci前3个码逐次排进N1数组

Ci=[];

end

end

disp('信道译码结果如下:')

N1=mod(N1,2) %%%二进制化的N1为通过信道纠错译码后的全部码序列

M1=[];%%%数字变符号

for i=N1;

M1=[M1,num2str(i)];

end

Y=[];d=[];%%%信源译码

for i=M1;

d=[d,i];

switch d

case a,Y=[Y,'a'];d=[];

case b,Y=[Y,'b'];d=[];

case c,Y=[Y,'c'];d=[];

end

end

disp('最终译码结果如下:')

Y %%%译码输出

Matlab程序中运行时仅显示霍夫曼编码结果,信道编码结果,信道译码结果及最终结果。尝试几组不同的概率事件后验证,霍夫曼编码满足以下情况:1、三个概率互不相同的信源符号。2、三个信源符号中有两者概率相同。3、三个信源符号中有两者概率之和等于第三个概率。

译码后的结果重现了输入信源序列,但有时会省略最后几位信源符号。原因是3个一组的译码,会致使霍夫曼编码获得的码序列长度不为3的整倍数时,有码源丢失。但是只要继续输入信源符号,原未译出的符号序列就会继续顺次译出来。