信息论实验报告2信源编码Word格式文档下载.doc
《信息论实验报告2信源编码Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《信息论实验报告2信源编码Word格式文档下载.doc(8页珍藏版)》请在冰豆网上搜索。
本次实验的收获、体会、经验、问题和教训:
1、香农编码Matlab源码
function[W,L,q]=shannon(p)
if(length(find(p<
=0))~=0)
error('
Notaprob.vector,negativecomponent'
);
end
if(abs(sum(p)-1)>
10e-10)
Notaprob.vector,componentdonotaddupto1'
n=length(p);
x=1:
n;
[p,x]=array(p,x);
%1)排序
l=ceil(-log2(p));
%2)计算代码组长度l
P
(1)=0;
%3)计算累加概率P
fori=2:
nP(i)=P(i-1)+p(i-1);
end
fori=1:
n%4)求得二进制代码组W
forj=1:
l(i)
temp(i,j)=floor(P(i)*2);
P(i)=P(i)*2-temp(i,j);
end
end
n
if(temp(i,j)==0);
W(i,j)=48;
elseW(i,j)=49;
end
L=sum(p.*l);
%计算平均码字长度H=entropy(p,2);
%计算信源熵
q=H/L;
%计算编码效率
fori=1:
nB{i}=i;
[n,m]=size(W);
TEMP=32*ones(n,6);
W=[W,TEMP];
W=W'
;
W=reshape(W,1,n*m);
W=sprintf('
%s'
W);
s0='
很好!
输入正确,编码结果如下:
'
s1='
Shannon编码所得码字W:
s2='
Shannon编码平均码字长度L:
s3='
Shannon编码的编码效率q:
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);
functionH=entropy(P,r)
if(length(find(P<
=0))~=0)%判断是否符合概率分布条件
if(abs(sum(P)-1)>
H=(sum(-P.*log2(P)))/(log2(r)+eps);
2、香农编码数值试验算例
单符号离散无记忆信源
=
p=[0.25,0.25,0.2,0.15,0.1,0.05];
[W,L,q]=shannon(p)
[1][2][3][4][5][6]
0001100101110111110
2.7000
0.8975
W=
L=
q=
3、费诺编码Matlab源码
(1)编写M文件compare.m
function[next_P,code_num,next_index]=compare(current_P,current_index)
n=length(current_P);
add
(1)=current_P
(1);
n%1)求概率的依次累加和
add(i)=0;
add(i)=add(i-1)+current_P(i);
s=add(n);
%2)求概率和最接近的两小组
ntemp(i)=abs(s-2*add(i));
[c,k]=min(temp);
if(current_index<
=k)
next_index=current_index;
code_num=48;
next_P=current_P(1:
k);
else
next_index=current_index-k;
code_num=49;
next_P=current_P((k+1):
n);
(2)编写M文件fano.m
function[W,L,q]=fano(P)
)end
n=length(P);
[P,x]=array(P,x);
current_index=i;
j=1;
current_P=P;
while1[next_P,code_num,next_index]=compare(current_P,current_index);
current_index=next_index;
current_P=next_P;
W(i,j)=code_num;
j=j+1;
if(length(current_P)==1)break;
l(i)=length(find(abs(W(i,:
))~=0));
end%得到各码字的长度
L=sum(P.*l);
%计算平均码字长度
H=entropy(P,2);
%计算信源熵
%计算编码效率
nB{i}=i;
TEMP=32*ones(n,5);
Fano编码所得码字W:
Fano编码平均码字长度L:
s3='
Fano编码的编码效率q:
=0))~=0)
4、费诺编码数值试验算例
P=[1/4,1/4,1/8,1/8,1/16,1/16,1/16,1/16];
[W,L,q]=fano(P)
[1][2][3][4][5][6][7][8]
00011001011100110111101111
2.7500
1.0000
5、霍夫曼编码Matlab源码
(1)编写M文件huffman.m
function[W,L,q]=huffman(P)
)end
%计算输入元素个数
p=P;
mark=zeros(n-1,n);
%mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序
%1)确定概率大小值的排列,得到mark矩阵。
n-1
[p,num]=sort(p);
mark(i,:
)=[num(1:
n-i+1),zeros(1,i-1)];
p=[p
(1)+p
(2),p(3:
n),1];
end
%2)生成一个n-1行、n1(n×
n)列矩阵table,每行可看做n个段,
%每段长为n,记录一个码字(每个码字的长度不会超过n)。
n-1table(i,:
)=blanks(n*n);
%3)计算各个元素码字,循环n-2次,决定矩阵table
%从倒数第二行开始到第一行的每段的码字值,到编码表格table
table(n-1,n)='
1'
table(n-1,2*n)='
0'
table(n-i,1:
n-1)=table(n-i+1,n*(find(mark(n-i+1,:
)==1))...
-(n-2):
n*(find(mark(n-i+1,:
)==1)));
%按mark的记录依次赋值
table(n-i,n)='
table(n-i,n+1:
2*n-1)=table(n-i,1:
n-1);
table(n-i,2*n)='
end
forj=1:
i-1
table(n-i,(j+1)*n+1:
(