费诺编码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西华数学与计算机学院上机实践报告

课程名称:信息与编码理论年级: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

{

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

#include

#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

{

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<<"输入信源符号个数"<

cin>>n;

cout<<"输入各信源符号概率"<

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;}

相关文档
最新文档