费诺编码的C语言实现

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

摘要:
用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。

编码在电子计算机、电视、遥控和通讯等方面广泛使用。

其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。

关键字:信息论,费诺编码,C语言
正文:
费诺编码也是一种常见的信源编码方法。

信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同.
费诺编码的C语言实现
设有一个离散信源,概率分布P(x)保存在in.dat文件中,实现对文件的读取,并根据P(x)给出对应的费诺编码,将结果保存在另一文件out.dat中。

程序代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#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<a.low;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<t;n++)
{
f[n]=fabs(getsum(h,n,a)-getsum(n+1,t,a));
}
temp=f[h];
t1=h;
for(n=h;n<t;n++)
{
if(f[n]<temp)
{
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<N;i++)
for(j=1;j<N-i+1;j++)
if(a[j].x<a[j+1].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
总结:。

相关文档
最新文档