信息论实验报告2信源编码Word格式文档下载.doc
《信息论实验报告2信源编码Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《信息论实验报告2信源编码Word格式文档下载.doc(8页珍藏版)》请在冰点文库上搜索。
![信息论实验报告2信源编码Word格式文档下载.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/8f5c0bc1-ec5d-484d-9ea6-24b72a9d0789/8f5c0bc1-ec5d-484d-9ea6-24b72a9d07891.gif)
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:
(j+2)*n)=table(n-i+1,...n*(find(mark(n-i+1,:
)==j+1)-1)+1:
n*find(mark(n-i+1,:
)==j+1));
%4)得到编码后的码字
n
W(i,1:
n)=table(1,n*(find(mark(1,:
)==i)-1)+1:
find(mark(1,:
)==i)*n);
l(i)=length(find(abs(W(i,:
))~=32));
end
nB{i}=i;
[m,n]=size(W);
TEMP=blanks(m);
W=[W,TEMP'
TEMP'
];
W=reshape(W'
1,m*n);
Huffman编码所得码字W:
Huffman编码平均码字长度L:
Huffman编码的编码效率q:
(2)编写M文件huffman_better.m
function[W,L,V,q]=huffman_better(P)
end
mark=zeros(n-1,n);
t=1;
%对输入元素排序并纪录
if(i~=1)
if(count~=0)
k=max(a(t,:
));
fors=count:
-1:
1
num(k-s)=num(k-s+1);
num(k)=1;
end
t=t+1;
end
mark(i,:
count=0;
%用于计数
forj=2:
n-i
if(p
(1)==p(j))%判断p中是否有与求和后的新项相等的项
count=count+1;
a(t,count)=j;
end
n-1table(i,:
table(n-1,2*n)='
table(n-i,1:
-(n-2):
table(n-i,n)='
table(n-i,2*n)='
i-1
table(n-i,(j+1)*n+1:
(j+2)*n)=table(n-i+1,...n*(find(mark(n-i+1,:
end
nW(i,1:
))~=32));
H=entropy(P,2);
V=sum(P.*((l-L).^2));
Huffman编码所得码字W的方差V:
s4='
disp(s2),
disp(L);
disp(s3),disp(V);
disp(s4),disp(q)
6、霍夫曼编码数值试验算例
P=[0.4,0.2,0.2,0.1,0.1];
[W,L,q]=huffman(P)
[1][2][3][4][5]
10000100110010
2.2000
0.9645
10000100110010
教师
评语