信息论与编码实验程序与结果图(matlab)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结果图
信源熵实验程序:
clc; close all; clear;
linwidd=1
fontt=20
p0=0; pd=1; N=20
p=linspace(p0,pd,N);
I=-log2(p);
plot(p,I,'k');
title('I=-log2(p)函数图');
xlabel('p');ylabel('I');
clc; close all; clear;
linwidd=1
fontt=20
p0=0; pd=1; N=20
p=linspace(p0,pd,N);
H=-p.*log2(p)-(1-p).*log2(1-p);
plot(p,H,'k');
title('H=-p.*log2(p)-(1-p).*log2(1-p)函数图');
xlabel('p');ylabel('H');
信道容量实验程序:
clc; close all; clear;
linwidd=1
fontt=20
p0=0; pd=1; N=20
p=linspace(p0,pd,N);
r=4
c=log2(r)+(1-p).*log2(1-p)+p.*log2(p/(r-1));
plot(p,c,'k');
title('强对称信道容量数值模拟图');
有噪信道编码--费诺不等式程序:结果图clc;close all;clear;
r=3;p0=0.00001;pd=0.99999;N=2000;
p=linspace(p0,pd,N);
q=1-p;
H=-p.*log2(p)-q.*log2(q);
hold on
HH=H+p.*log2(r-1)
title('费诺不等式示意图');box on
xlabel('PE');
ylabel('H(X/Y)');
plot(p,HH,'k:')
hold on
hold on
fill([p,1],[HH,0],[0.6,0.6,0.6])
stem((r-1)/r,1.59,'--.r')
text(0.66,1.6,'最大值')
香农编码程序:
clc;clear all;close all;
p=[0.2 0.19 0.18 0.17 0.15 0.1 0.01]; if sum(p)<1||sum(p)>1
error('输入概率不符合概率分布')
end
[p index]=sort(p,'descend');
n=length(p);
pa=zeros(n,1);
for ii=2:n
pa(ii)=pa(ii-1)+p(ii-1);
end
k=ceil(-log2(p));%码字长度计算
c=cell(1,n);%生成元胞数组,用来存不同长度的码字
for ii=1:n
c{ii}='';
tmp=pa(ii);
for jj=1:k(ii)
tmp=tmp*2;
if tmp>=1
tmp=tmp-1;
%c{ii}{jj}='1';
c{ii}=[char(c{ii}),'1']; else
%c{ii}{jj}='0';
c{ii}=[char(c{ii}),'0']; end
end
end c(index)=c;%换回原来的顺序
codelength=zeros(1,n);%码长初始化
for ii=1:n
fprintf(['第',num2str(ii),'个消息对应为']);
disp(c{ii});%显示码字
codelength(ii)=length(c{ii});%
end
n_average=sum(codelength.*p) %平均码长
fprintf('平均码长为');disp(n_average);
H=-sum(p.*log2(p));
fprintf('信源熵');disp(H);
x=H/(n_average.*log2(2))
fprintf('编码效率');disp(x);
figure
h=stem(1:n,codelength);%
axis([0 n+1 0 n+1]);
set(h,'MarkerFaceColor','blue','linewidth',2)
实验结果结果图第1个消息对应为000
第2个消息对应为001
第3个消息对应为011
第4个消息对应为100
第5个消息对应为101
第6个消息对应为1110
第7个消息对应为1111110
n_average = 3.1400
平均码长为 3.1400
信源熵 2.6087
x =0.8308
编码效率 0.8308
费诺编码程序:
end
for rr=2:2:needgroupnum*2
index2=index_aftergroup(rr,:);
for ii=index2(1):index2(2)
c{ii}=[char(c{ii}),'1']; end
end
flag=0;
index_p=[];
for rr=1:needgroupnum*2
indextmp=index_aftergroup(rr,:); if(indextmp(2)-indextmp(1)+1>1) flag=1;
index_p=[index_p;indextmp]; end
end
jj=jj+1;
end
c(index)=c;
codelength=zeros(1,N);
for ii=1:N
fprintf(['第',num2str(ii),'个消息对应为']);
disp(c{ii});
codelength(ii)=length(c{ii}); end
n_average=sum(codelength.*p)
fprintf('平均码长为
');disp(n_average);
H=-sum(p.*log2(p));
fprintf('信源熵');disp(H);
x=H/(n_average.*log2(2))
fprintf('编码效率');disp(x); figure
h=stem(1:N,codelength);
axis([0 N+1 0 N+1]);
set(h,'MarkerFaceColor','blue','linewidth',2)
end
function index_aftergroup=func_group(p,index_p)
index=index_p(1):index_p(2);
n=length(index);
p0=p(index);
sump0=sum(p0);
half_sump0=sump0/2;
for ii=1:n-1
tmpsum=sum(p0(1:ii));
if abs(tmpsum-half_sump0)<=abs(tmpsum-half_sump0+p0(ii+1))
index_aftergroup=[index(1) index(ii);index(ii+1) index(n)]; break;
end
end
end
实验结果结果图
第1个消息对应为00
第2个消息对应为010
第3个消息对应为011
第4个消息对应为10
第5个消息对应为110
第6个消息对应为1110
第7个消息对应为1111
n_average = 2.7400
平均码长为 2.7400
信源熵 2.6087
x =0.9521
编码效率 0.9521
霍夫曼编码程序:clc;clear all;close all; A=[0.4 0.2 0.2 0.1 0.1]; A=sort(A,'descend');
T=A;
[m,n]=size(A);
B=zeros(n,n-1);
B(:,1)=T;
r=B(n,1)+B(n-1,1);
T(n-1)=r; T(n)=0;
T=sort(T,'descend');
t=n-1;
for j=2:n-1
B(1:t,j)=T(1:t);
K=find(T==r);
%B(n,j)=K(end);
B(n,j)=K(1);
r=(B(t-1,j)+B(t,j));
T(t-1)=r;
T(t)=0;
T=sort(T,'descend');
t=t-1;
end
B;
ENDc1=sym('[1,0]');
ENDc=ENDc1;
t=3;
d=1;
for j=n-2:-1:1
for i=1:t-2
if i>1&&B(i,j)==B(i-1,j)