信息论实验2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《信息论与编码》
实验2 香农编码规则及其软件实现
一、实验目的
1、通过上机实践,实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。
2、通过信源编译码,理解香农第一定理
3、通过信源编译码,掌握信源编码的方法和手段
二、实验原理
信源编码主要可分为无失真信源编码和限失真信源编码。
无失真信源编码主要适用于离散信源或数字信号,如文本、表格及工程图纸等信源,它们要求进行无失真地数据压缩,要求完全能够无失真地可逆恢复。
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合都可称为最佳码。
为此必须将概率大的信息符号编以短的码字,概率小的符号编以长的码字,使得平均码字长度最短。
其中香农编码是能获得最佳码的编码方法之一。
香农第一定理指出,选择每个码字的长度i K 满足下式
I(i x )≤i K <I(i x )+1 ,i ∀
就可以得到这种码。
这种编码方法称为香农编码。
香农编码步骤:
设离散无记忆信源
二进制香农码的编码步骤如下:
(1)将信源符号按概率从大到小的顺序排列,为方便起见,令
p (x 1)≥ p (x 2)≥…≥ p (xn )
(2)令p (x 0)=0,用)(j a x P ,j =i +1表示第i 个码字的累加概率,则:
n j x P x P j i i j a ,...,2,1,)()(1
0==∑-=
121
12,,,,,,()1(),(),,(),,()()n i n i
i i n x x x x X p x p x p x p x p x P X =⎧⎫⎡⎤==⎨⎬⎢⎥⎣⎦⎩⎭∑
(3)确定满足下列不等式的整数i K ,并令i K 为第i 个码字的长度
-log2 p (xn )≤i K <- log2 p (xn )+1
(4)将)(j a x P 用二进制表示,并取小数点后i K 位作为符号xi 的编码。
三、实验内容
1)充分掌握信源编码方案之一的香农编码算法设计;
2)以教材例题为算例,将该编码方法用代码实现。
并进行静态检查,尽量减少语法错误和逻辑错误
3)以至少2组算例验证程序;
4)理解,总结香农编码算法。
核心代码及调试过程
例1(C 实现)
#include<iostream.h>
#include<math.h>
#define N 20
int string(float a)
{
float k,m;
k=-log(a)/log(2);
m=1-log(a)/log(2);
int n=k;
if(n<m-1)
{ n=n+1;}
return(n);
}
int main()
{
int i,j,k[N],n,flase=0;
float p[N],pa[N],m,H=0.0,K=0.0,sum=0.0;
cout<<"输入信源符号个数"<<endl;
cin>>n;
cout<<"输入各信源符号概率"<<endl;
{
cin>>p[i];
}
for(i=1;i<=n;i++)
{
sum=sum+p[i];
}
for(i=1;i<=n;i++)
{
if(p[i]<0||p[i]>1||sum!=1.0)
{ cout<<"input gai lv error!"; flase=1;break;}
}
if(flase==0)
{ cout<<" 信源香农编码如下: "<<endl;
pa[1]=0.0;
for(i=2;i<=n;i++)
{
pa[i]=p[i-1]+pa[i-1];
}
for(i=1;i<=n;i++)
{
k[i]=string(p[i]);
}
for(i=1;i<=n;i++)
{
m=pa[i];
cout<<"x"<<i<<"="<<p[i]<<"\t的码长为\t"<<k[i]<<" 码字为\t";
for(j=1;j<=k[i];j++)
{
m=m*2;
if(m>=1) {cout<<"1";m=m-1.0;}
else cout<<"0";
}
cout<<endl;
}
for(i=1;i<=n;i++)
{
H=-(p[i]*log(p[i])/log(2))+H;
}
cout<<"信源熵H(X)="<<H<<" (比特/符号)"<<endl;
{
K=p[i]*k[i]+K;
}
cout<<"平均码长K="<<K<<" (比特/符号)"<<endl;
cout<<"编码效率为"<<(H/K)*100<<"%"<<endl;
}
cout<<endl;
}
例2(Matlab实现)
clc;clear;
a=[0.3,0.2,0.20,0.15,0.10,0.05];%初始概率,也可为输入k=length(a);y=0;
s=zeros (k,1);b=zeros(k,1);p=zeros(8,1);
for m=1:k
s(m)=y;
y=y+a(m); %求和,
b(m)=ceil(-log2(a(m))); %取整,求位数
z=zeros(b(m),1);
x=s(m);
p=b2d10 (x); %调用子函数
for r=1:b(m)
z(r)=p(r);
end
disp('输出结果为:') %结果显示
disp('初始概率'), disp(a(m))
disp('求和结果'), disp(s(m))
disp('编码位数'), disp(b(m))
disp('最终编码'), disp(z')
end
四、使用环境
实验室PC 标准配置,winXP,matlab/C/C++等
五、实验报告要求
简述实验目的;
简述实验原理;
熟练掌握调试工具,调试正确后,认真整理源程序和注释,给出带有完整注释且格式良好的源程序清单和结果。
分析该编码特点及编码结果。
输出结果为:
初始概率
0.3000
求和结果
编码位数
2
最终编码
0 0
输出结果为:
初始概率
0.2000
求和结果
0.3000
编码位数
3
最终编码
0 1 0
输出结果为:
初始概率
0.2000
求和结果
0.5000
编码位数
3
最终编码
1 0 0
输出结果为:
初始概率
0.1500
求和结果
0.7000
编码位数
3
最终编码
1 0 1
输出结果为:
初始概率
0.1000
求和结果
0.8500
编码位数
4
最终编码
1 1 0 1
输出结果为:
初始概率
0.0500
求和结果
0.9500
编码位数
5
最终编码
1 1 1 1 0。