信息论实验报告Word格式文档下载.docx
- 文档编号:16789426
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:16
- 大小:132.10KB
信息论实验报告Word格式文档下载.docx
《信息论实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《信息论实验报告Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
信源熵hh=sum(p.*(-log2(p)));
;
编码效率t=hh/l。
Fano码:
费诺编码属于概率匹配编码,但它不是最佳的编码方法。
不过有时也可以得到紧致码的性能。
信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字。
费诺码编码的一般步骤如下:
(1)将信源消息符号按其出现的概率大小依次排列排列:
。
(2)将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并且对各组赋予一个二进制码元“0”和“1”。
(3)将每一大组的信源符号再分成两组,使划分后的两个组的概率之和近似相同,并且对各组赋予一个二进制符号“0”和“1”。
以上两部分在程序中。
(4)如此重复,直到每个组只剩下一个信源符号为止。
在程序中本部分采用递归思想。
信源符号所对应的码字即为费诺编码。
Hamming码:
汉明码是用于数据传送,能检测所有一位和双位差错并纠正所有一位差错的二进制代码。
与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。
利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。
汉明码的编码一般步骤如下:
(1)码长n=7,信息元k=4,检验元r=n-k=3。
长为3的二元序列共有23=8个。
我们将其中7个非全零序列按列排成如下矩阵
H矩阵称为:
一致监督矩阵。
(2)设码字C=(c6c5c4c3c2c1c0),有:
H×
CT=0T
其中:
0=(000),0T是0矢量的转置,即满足:
c3+c2+c1+c0=0
c5+c4+c1+c0=0
c6+c4+c2+c0=0
得出汉明码。
(3)汉明码译码,由H·
=H·
+H·
=
求出伴随式S
(4)给出生成矩阵
满足:
m·
[G]=cG·
=0
(5)其译码纠错功能原理如下图所示,按照错误图样找到错误码字:
图1
4.实验分析
运行结果:
>
pleaseinputanumber:
[0.20.50.3]
p=
0.20000.50000.3000
q=
0.20000.30000.5000
l=
132
a=
000
0.50000.50001.0000
123
120
c=
0
01
00
000
0001
00011
h=
00
ll=
2
1
21
01
212
huffmancode:
thehuffmaneffciency:
t=
0.9903
l=
1.5000%平均码长
hh=
1.4855%信源熵
平均码长十分接近信源熵,编码效率t=hh/l=0.9903。
inputtheA:
[0.150.10.20.050.20.20.1]
encoding=
0.200000-1.0000-1.0000-1.0000
0.200001.0000-1.0000-1.0000-1.0000
0.20001.000000-1.0000-1.0000
0.15001.000001.0000-1.0000-1.0000
0.10001.00001.00000-1.0000-1.0000
0.10001.00001.00001.00000-1.0000
0.05001.00001.00001.00001.0000-1.0000
%编码过程
A=
0.20000.20000.20000.15000.10000.10000.0500
%原码排序,与下面的编码相对应
CODE=
[0,1,100,101,110,1110,1111]
avlen=
2.3500%平均码长
y=encoding([1101])
y=
1101010
%(7,4)汉明码
x=decoding(y)
x=
1101
%解码
x2=decoding([1001010])
x2=
%模拟传输中第二个码字发生了错误,进行译码纠错
5.实验结论
本次对信源编码与信道编码在MATLAB上的实现,通过对网上资料的参考与自己的思考,给出了HUFFMAN码、FANO码、HAMMING码的matlab程序,更深入地了解了三种编码的编码原理及特征,收获颇丰。
附(相关代码):
1.
p=input('
pleaseinputanumber:
'
)
n=length(p);
fori=1:
n
ifp(i)<
fprintf('
\nTheprobabilitiesinhuffmancannotlessthan0!
\n'
);
p=input('
)%如果输入的概率数组中有小于0的值,则重新输入概率数组
end
end
ifabs(sum(p)-1)>
fprintf('
\nThesumoftheprobabilitiesinhuffmancanmorethan1!
)%如果输入的概率数组总和大于1,则重新输入概率数组
end
q=p;
a=zeros(n-1,n);
n-1
[q,l]=sort(q)%对概率数组q进行从小至大的排序,并且用l数组返回一个数组,该数组表示概率数组q排序前的顺序编号
a(i,:
)=[l(1:
n-i+1),zeros(1,i-1)]
q=[q
(1)+q
(2),q(3:
n),1];
c(i,1:
n*n)=blanks(n*n);
%生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编码中与a矩阵有一定的对应关系
c(n-1,n)='
0'
;
c(n-1,2*n)='
1'
%后两个概率,因此其值为0或1,在编码时设第n-1行的第一个空白字符为0,第二个空白字符1。
fori=2:
c(n-i,1:
n-1)=c(n-i+1,n*(find(a(n-i+1,:
)==1))-(n-2):
n*(find(a(n-i+1,:
)==1)))%矩阵c的第n-i的第一个元素的n-1的字符赋值为对应于a矩阵中第n-i+1行中值为1的位置在c矩阵中的编码值
c(n-i,n)='
c(n-i,n+1:
2*n-1)=c(n-i,1:
n-1)
c(n-i,2*n)='
forj=1:
i-1
c(n-i,(j+1)*n+1:
(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:
)==j+1)-1)+1:
n*find(a(n-i+1,:
)==j+1))%矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值
n
h(i,1:
n)=c(1,n*(find(a(1,:
)==i)-1)+1:
find(a(1,:
)==i)*n)%用h表示最后的huffman编码,矩阵h的第i行的元素对应于矩阵c的第一行的第i个元素
ll(i)=length(find(abs(h(i,:
))~=32))%计算每一个huffman编码的长度
l=sum(p.*ll);
%计算平均码长
\nhuffmancode:
h
hh=sum(p.*(-log2(p)));
%计算信源熵
\nthehuffmaneffciency:
t=hh/l%计算编码效率
2.
A=input('
inputtheA:
A=fliplr(sort(A));
%降序排列
[m,n]=size(A);
encoding(i,1)=A(i);
%生成B的第1列
%生成B第2列的元素
a=sum(encoding(:
1))/2;
fork=1:
n-1
ifabs(sum(encoding(1:
k,1))-a)<
=abs(sum(encoding(1:
k+1,1))-a)
break;
end
n%生成B第2列的元素
ifi<
=k
encoding(i,2)=0;
else
encoding(i,2)=1;
%生成第一次编码的结果
CODE=encoding(:
2)'
CODE=sym(CODE);
%生成第3列及以后几列的各元素
j=3;
while(j~=0)
p=1;
while(p<
=n)
x=encoding(p,j-1);
forq=p:
ifx==-1
ifencoding(q,j-1)==x
y=1;
continue;
y=0;
ify==1
q=q+1;
ifq==p|q-p==1
encoding(p,j)=-1;
ifq-p==2
encoding(p,j)=0;
CODE(p)=[char(CODE(p)),'
];
encoding(q-1,j)=1;
CODE(q-1)=[char(CODE(q-1)),'
a=sum(encoding(p:
q-1,1))/2;
fork=p:
q-2
ifabs(sum(encoding(p:
=abs(sum(encoding(p:
k+1,1))-a);
fori=p:
q-1
encoding(i,j)=0;
CODE(i)=[char(CODE(i)),'
encoding(i,j)=1;
p=q;
C=encoding(:
j);
D=find(C==-1);
[e,f]=size(D);
ife==n
j=0;
j=j+1;
encoding
A
CODE
[u,v]=size(char(CODE(i)));
L(i)=v;
avlen=sum(L.*A)
3.
function[y]=encoding(m)
n=length(m);
%n为原始码字的长度,即为4
%(7,4)汉明
y=[];
ifmod(n,4)~=0
n=n+4-mod(n,4)
m=[mzeros(1,4-mod(n,4))];
n/4
a=m((i-1)*4+1:
i*4);
4
b=mod(sum(a(1:
3)),2);
c=mod(sum([a(1:
2)a(4)]),2);
d=mod(a
(1)+a(3)+a(4),2);
y=[ya,b,c,d];
end;
function[y]=decoding(m)
H=[1110100;
1101010;
1011001];
s=mod(m*(H'
),2);
ifsum(s==[000])==3
y=m(1:
4);
elseifsum(s==[001])==3
elseifsum(s==[010])==3
elseifsum(s==[100])==3
elseifsum(s==[011])==3
y=[m(1:
3)~m(4)];
elseifsum(s==[101])==3
2)~m(3)m(4)];
elseifsum(s==[110])==3
y=[m
(1)~m
(2)m(3:
4)];
elseifsum(s==[111])==3
y=[~m
(1)m(2:
参考文献:
《信息理论基础》北京航空航天大学出版社周荫清主编
《MATLAB程序设计与典型应用》电子工业出版社张德丰主编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 实验 报告