西华数学与计算机学院上机实践报告
课程名称:信息与编码理论年级:2007级上机实践成绩:
指导教师:李月卉姓名:何龙
上机实践日期:2010.5.20上机实践名称:费诺编码学号:
312007*********
上机实践编号:2上机实践时间:14:30-15:50一、目的
通过上机实践,实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。
二、内容与设计思想
1)充分掌握信源编码方案之一的费诺编码算法设计;
2)以教材例题为算例,将该算法用代码实现;
3)以至少2组算例验证程序;
4)理解,总结费诺编码算法。
三、使用环境
实验室PC 标准配置,winXP,matlab/C/C++/Frotran 等
四、核心代码及调试过程
核心代码:
void fano(float p[],int a[N][N],int n,int m,int k)
{
float g=0.0,h=0.0,d,b,c;
int i,j,flase;
if(n<m)
{
for(i=n;i<=m;i++)
{
g=p[i]+g;
} g=g/2;
for(i=n;i<=m;i++)
{
h=h+p[i];
if(h>g)
{
d=h-p[i];b=h-g;c=g-d;
if(c>b)
{
for(j=n;j<=i;j++) a[j][k]=0;
fano(p,a,n,i,k+1);
for(j=i+1;j<=m;j++) a[j][k]=1;
fano(p,a,i+1,m,k+1);
}
else
{
for(j=n;j<=i-1;j++) a[j][k]=0;
fano(p,a,n,i-1,k+1);
for(j=i;j<=m;j++) a[j][k]=1;
fano(p,a,i,m,k+1);
}
break;
}
}
}
}
调试过程:
(1)当输入信源符号个数为:3
输入各信源符号概率分别为:0.2 0.3 0.5时
(2)当输入信源符号个数为:3
输入各信源符号概率分别为:0.3 0.3 0.3时
(3)当输入信源符号个数为:4
输入各信源符号概率分别为:0.1 0.2 0.3 0.4 时
(4)当输入信源符号个数为:4
输入各信源符号概率分别为:0.25 0.25 0.25 0.25 时
五、总结
费诺码编码方法不是唯一。
费诺码比较适合于对分组概率相等或接近的信源编码。
费诺码也可以编。
m进制码,但m越大,信源的符号数越多,可能的编码方案就越多,编码过程就越复杂,有时短码未必能得到充分利用。
一般情况下,当信源符号个数越多,编码效率越低,信源符号概率相等或越接近,编码效率越高。
六、附录
#include<iostream.h>
#include<math.h>
#define N 15
int pa[N][N];
void fano(float p[],int a[N][N],int n,int m,int k)
{
float g=0.0,h=0.0,d,b,c;
int i,j,flase;
if(n<m)
{
for(i=n;i<=m;i++)
{
g=p[i]+g;
} g=g/2;
for(i=n;i<=m;i++)
{
h=h+p[i];
if(h>g)
{
d=h-p[i];b=h-g;c=g-d;
if(c>b)
{
for(j=n;j<=i;j++) a[j][k]=0;
fano(p,a,n,i,k+1);
for(j=i+1;j<=m;j++) a[j][k]=1;
fano(p,a,i+1,m,k+1);
}
else
{
for(j=n;j<=i-1;j++) a[j][k]=0;
fano(p,a,n,i-1,k+1);
for(j=i;j<=m;j++) a[j][k]=1;
fano(p,a,i,m,k+1);
}
break;
}
}
}
}
void main()
{
int i,j,k[N],n,flase=0;
float p[N],m,H=0.0,K=0.0,sum=0.0;
cout<<"输入信源符号个数"<<endl;
cin>>n;
cout<<"输入各信源符号概率"<<endl;
for(i=1;i<=n;i++)
{
cin>>p[i];
}
for(i=1;i<=n;i++)
{
sum=sum+p[i];
}
for(i=1;i<=n;i++)
{
if(p[i]<0.0||p[i]>1.0||sum!=1.0)
{ cout<<"input gai lv error!"; flase=1;break;}
}
if(flase==0)
{
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{ pa[i][j]=10;}
fano(p,pa,1,n,1);
cout<<"信源费诺编码如下:\n";
for(i=1;i<=n;i++)
{ k[i]=0;
cout<<"x"<<i<<"="<<p[i]<<"\t码字为\t";
for(j=1;j<=n;j++)
{
if(pa[i][j]!=10)
{ cout<<pa[i][j];k[i]++;}
}
cout<<"\t码长为\t"<<k[i]<<endl;
}
for(i=1;i<=n;i++)
{
H=-(p[i]*log(p[i])/log(2))+H;
}
cout<<"信源熵H(X)="<<H<<" (比特/符号)"<<endl;
for(i=1;i<=n;i++)
{
K=p[i]*k[i]+K;
}
cout<<"平均码长K="<<K<<" (比特/符号)"<<endl;
cout<<"编码效率为"<<(H/K)*100<<"%"<<endl;
}//if(flase==0)
cout<<endl;
}//main()。