费诺编码的C语言实现

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

摘要:

用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。

关键字:信息论,费诺编码,C语言

正文:

费诺编码也是一种常见的信源编码方法。信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同.

费诺编码的C语言实现

设有一个离散信源,概率分布P(x)保存在in.dat文件中,实现对文件的读取,并根据P(x)给出对应的费诺编码,将结果保存在另一文件out.dat中。

程序代码:

#include

#include

#include

#define N 8

struct event {

int n;

double x;

int code[N];

int low;

};

FILE *fp1,*fp2;

struct event A[N+1];

void inputcode(struct event *a,int b)/*input code*/

{

a->code[a->low]=b;

(a->low)++;

}

void outcode(struct event a)/*output code*/

{

int i;

for(i=0;i

fprintf(fp2,"%d",a.code[i]);

}

double getsum(int h,int t,struct event a[])/*get sum*/

{

int i=h;

double sum=0.0;

for(i=h;i<=t;i++)

{

sum=sum+a[i].x;

}

return sum;

}

int getbreakpoint(struct event a[],int h,int t)/*all right*/ {

int n,t1;

double f[N+1],temp=0.0;

for(n=h;n

{

f[n]=fabs(getsum(h,n,a)-getsum(n+1,t,a));

}

temp=f[h];

t1=h;

for(n=h;n

{

if(f[n]

{

temp=f[n];

t1=n;

}

}

return t1;

}

void group(int h,int t,struct event a[])

{

int i,breakpoint,zero=0,one=1;

if(t==h+1)

{

inputcode(&a[h],zero);

inputcode(&a[t],one);

}

else

if(t==h)

;

else

{

breakpoint=getbreakpoint(a,h,t);

for(i=h;i<=breakpoint;i++)

{

inputcode(&a[i],zero);

for(i=breakpoint+1;i<=t;i++)

{

inputcode(&a[i],one);

}

group(h,breakpoint,a);

group(breakpoint+1,t,a);

}

}

void sort(struct event a[])

{

int i,j;

struct event t;

for(i=1;i

for(j=1;j

if(a[j].x

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

void main()

{

int i;

int h=1,t=N;

float temp;

/*input data*/

if((fp1=fopen("in.dat","rb"))==NULL)

{

printf("不能打开文件!\n");

exit(1);

}

if((fp2=fopen("out.dat","a"))==NULL)

{

printf("不能打开文件!\n");

exit(1);

}

for(i=1;i<=N;i++)

{

fscanf(fp1,"%f",&temp);

A[i].x=temp;

}

/*initialize*/

for(i=1;i<=N;i++)

{

A[i].n=i;

A[i].low=0;

}

group(h,t,A);

/*Out put result*/

for(i=1;i<=N;i++)

{

fprintf(fp2,"%.4f:",A[i].x);

outcode(A[i]);

fprintf(fp2,"\n");

}

fclose(fp1);

fclose(fp2);

printf("费诺编码成功!\n"); }

文件in.dat内容:

0.25

0.25

0.125

0.125

0.0625

0.0625

0.0625

0.0625

总结:

相关文档
最新文档