5
实验二
费诺编码
一、实验目的
掌握通过计算机实现费诺编码。
二、实验要求
对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。
三、实验基本原理
费诺编码的步骤:
1. 将概率按从大到小的顺序排列;
2. 按编码进制数将概率分组,使每组概率和尽可能接近或相等;
3. 给每组分配一位码元;
4. 将每一分组再按同样原则划分,重复 2 和 3,直到概率不再可分为止。
四 实验内容
1. 对给定信源
X
(
Xq
)
x
x
2
1
19.02.0
x
3
18.0
x
4
17.0
x
5
15.0
x
x
6
7
01.01.0
进行二进
制费诺编码。
2. 对给定信源
X
(
Xq
)
x
1
25.0
x
2
25.0
x
3
20.0
x
4
15.0
x
5
10.0
x
6
05.0
进行二进制
费诺编码。
3. 自已选择一个例子进行费诺编码。
五、 实验设备
PC 计算机 ,C++
六、实验报告要求
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
6
七、参考程序(仅供参考)
//********费诺编码参考程序 1****
//全局变量定义
int n;
string *sign;
double *p;
string *code;
void fano(int a,int b)
{
//费诺编码函数
if((b-a)>=1)
{
//判断该组中符号个数是否大于 2
double sum=0;
for(int i=a;i<=b;i++)
sum+=p[i];
//计算该组概率累加和
double s1=0, *s=new double[10];
for(int i=a;i<=b;i++)
{
s1+=p[i];s[i]=fabs(2*s1-sum)/sum;
}
double min=s[a]; int c;
for(int i=a;i<=b;i++)
if(s[i]<=min)
{
min=s[i]; c=i;
}
for(int i=a;i<=b;i++)
{
//定位使两组概率和尽可能相近或相等的位置 c
if(i<=c) code[i]+=”0”;
else code[i]+=”1”;
//码字加“0”
//码字加“1”
7
}
//判断分组点位置,进而分情况自身调用
if(c==a)
fano(c+1,b);
else if(c==b-1)
fano(a,c);
else
{ fano(a,c);fano(c+1,b); }
}
}
void main()
{
cout<<””请输入信源符号个数 n:”;
cin>>n;
p=new double[n];
sign=new string[n];
code=new string[n];
cout<<”请输入信源符号:” ;
for(int i=0;i
>sign[i];
cout<<”请输入信源符号的概率:” ;
for(int i=0;i>p[i];
for(int i=0;i8
//费诺编码
fano(0,n-1);
cout<
#include
using namespace std;
class DATA//数据类,采用双向表
{
public://初始化 PXi=1 是为了在排序迭代时方便
DATA(){next=NULL;pre=NULL;r=NULL;PXi=1;key[0]='\0';key[1]='
\0';key[2]='\0';key[3]='\0';key[4]='\0';key[5]='\0';
key[6]='\0';key[7]='\0';key[8]='\0';key[9]='\0';key[10]='\0';}
char Xi;//信源符号
double PXi;//信源概率
char key[11];//码字
DATA *next,*pre,*r;//地址
};
DATA *head=new DATA,*p=head;
int k=(-1);//编码函数用
void encoding(DATA * pp);//编码函数声明
DATA * sort(DATA * pp);//排序函数声明
DATA *HEAD=new DATA,*tt=HEAD,*T;//排序函数用