- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Fano编码的C语言实现
信息论课程设计
(费诺编码)
班级
学号
姓名
目录
1课题描述 2
2 信源编码的相关介绍 3
3 费诺编码 3
3.1 费诺编码算法 3
3.2 费诺编码特点 4
4 费诺编码的C程序实现 4
4.1 程序设计 4
4.2 运行结果 9
总 结 9
参考文献 9
1课题描述2 信源编码的相关介绍为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对信源输出的符号序列所施行的变换。具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。信源编码的作用之一是设法减少码元数目和降低码元速率,即通常所说的数据压缩:作用之二是将信源的模拟信号转化成数字信号,以实现模拟信号的数字化传输。最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。但现代通信应用中常见的信源有:Huffman编码、算术编码、编码通信系统模型[信源]-[信源编码]-[信道编码]-[信道传输+噪声]-[信道解码]-[信源解码]-[信宿]一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:使序列中的各个符号尽可能地互相独立;使序列中各个符号的出现概率尽可能地相等。前者称为解除相关性,后者称为概率均匀化。3 费诺编码 费诺编码3.1 费诺编码算法 将信源符号按概率排列。在程序中由sort()函数处理,此函数是一个冒泡排序法。若想改进,可用其它的排序算法。
将3.2 费诺编码特点
由于赋码元时的任意性,因此费诺编码编出的码字不惟一。
费诺编码虽属于概率匹配范畴,但并未严格遵守匹配规则,即不全是按“概率大码长小、概率小码长大”来决定码长,有时会出现概率小码长反而小的情况。
4 费诺编码的C程序实现 4.1 程序设计 #includestdio.h
#includemath.h
#includestring.h
#define Bmax 10 //最长码长度
#define Smax 20 //数组最大长度
struct Bit
{
char b[Bmax];
int last;
};
typedef struct symbol
{
char c;
float probability;
struct Bit bit;
}sbl;
sbl s[Smax];
void sort(int n)//排序
{
float t;
char a;
int i,j;
for(i=1;in;i++)
for(j=0;jn-i;j++)
if(s[j].probabilitys[j+1].probability)
{t=s[j].probability;
a=s[j].c;
s[j].probability=s[j+1].probability;
s[j].c=s[j+1].c;
s[j+1].probability=t;
s[j+1].c=a;
}
}
void code(int low,int mid,int high)//编码
{
int i;
for(i=low;ihigh;i++)
{
if(imid)
{
s[i].bit.b[s[i].bit.last]=0;
s[i].bit.last++;
}
else
{
s[i].bit.b[s[i].bit.last]=1;
s[i].bit.last++;
}
}
}
void group1(int low,int mid,int high)//分组
{
float d,dmin;
d=0;
int i;
if(high==low+1)
return;
for(i=low;imid;i++)
d+=s[i].probability;
dmin=d-2*s[low].probability;
for(i=low+1;ihigh;i++)
{
d=fabs(dmin-2*s[i].probability);
if(ddmin)
dmin=d;
else
break;
}
mid=i;
code(low,mid,high);
group1(low,mid,mid);
group1(mid,high,high);
}
void group(int n)
{
int i,pmid,plow,phigh;
pmid=phigh=n;
plow=0;
for(i=0;in;i++)
s[i].bit.last=0;
文档评论(0)