1 课题描述
本文通过采用递归的思想进行费诺编码,求得了每个字符的二进制码字。并且对编码后的平均码长,以及编码的传输效率进行了求解。符合费诺编码的要求,得到了预期的编码结果。
2 信源编码的相关介绍
信源编码分为无失真信源编码和限失真信源编码。一般称无失真信源编码为第一机械定理;限失真信源编码定理称为第三极限定理。
由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。具体说,就是针对信源输出符号序列的统计特性,寻一定的方法把信源输出符号序列变换为最短码字序列的方法。信源编码的基本途径有两个:使编码中各个符号出现的概率尽可能地相等,即概率均匀化。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。其中无失真编码定理是可逆编码的基础。可逆是指当信源符号转换成代码后,可从代码无失真地恢复信源符号。当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载有的信息
量。编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,就是使概率与码长匹配。无失真编码或可逆编码只适用于离散信源。对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。信源编码定理出现后,编码方法就趋于合理化。
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。能获得最佳码的编码方法主要有:香农码(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。
3.费诺编码
3.1费诺编码算法
(1)将信源消息符号按其出现的概率大小依次排列:
(2)将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
(3)将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
(4)如此重复,直至每个组只剩下一个信源符号为止。
(5)信源符号所对应的码字即为费诺码。
3.2费诺编码特点
费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。
4.费诺编码C语言实现
4.1程序设计
/*FenoEncoding*/
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#include <algorithm>
using namespace std;
#define MaxStrLength  50 /*输入字符串的最大长度*/
#define MaxNode 24  /*设定最大不重复符号个数*/
#define MaxBit 5  /*设定最大编码长度*/
typedef struct{
    char Character;      /*字符*/
    float data;      /*字符的概率值*/
    int bit[MaxBit];  /*编码后的码字*/
    int length;      /*码字长度*/
}CodeType;
CodeType FanoNode[MaxNode];  /*定义结构体数组*/
int Group(CodeType FanoNode[],int low,int high){  /*一次分组(一分为二)并编码*/
    float MinSum=FanoNode[low].data,MaxSum=FanoNode[high].data;
    FanoNode[low].bit[FanoNode[low].length++]=1;
    FanoNode[high].bit[FanoNode[high].length++]=0;
    while(low+1<high){
        if(MinSum>MaxSum){
            MaxSum+=FanoNode[--high].data;
            FanoNode[high].bit[FanoNode[high].length++]=0;  /*编码加0*/
        }
        else{
            MinSum+=FanoNode[++low].data;
            FanoNode[low].bit[FanoNode[low].length++]=1;  /*编码加1*/
        }
    }
    return low;  /*返回分组的第一部分的上界*/
}
void FanoEncoding(CodeType FanoNode[],int s,int t){/*递归进行费诺编码*/
    if(s<t){
        int pivotloc=Group(FanoNode,s,t);
        if(s<t-1){
            FanoEncoding(FanoNode,s,pivotloc);
            FanoEncoding(FanoNode,pivotloc+1,t);
        }
    }
}
void Disp(CodeType FanoNode[],int m,char str[],int SLength){  /*输出函数*/
    float K=0,R=0,H=0;
    printf("MessageSymbol  Character    Probability    CodeLength    Code\n");
    for(int i=0;i<m;i++){
字符串长度过长
        printf("FanoNode[%d]      %c            %.2f",i,FanoNode[i].Character,FanoNode[i].data);   
        printf("            %d          ",FanoNode[i].length);
        for(int j=0;j<FanoNode[i].length;j++)
            printf("%d",FanoNode[i].bit[j]);
        printf("\n");
        K+=FanoNode[i].data*FanoNode[i].length;        /*求平均码长*/
        H+=-FanoNode[i].data*log(FanoNode[i].data);    /*H(X)的大小*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。