Free考研资料 - 免费考研论坛

 找回密码
 注册
打印 上一主题 下一主题

关于信息论与编码技术的试验 求c++程序 很急 忘高手能帮忙

[复制链接]
跳转到指定楼层
楼主
heatonkk001 发表于 08-6-3 00:17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验一:信息量及信道容量的计算
实验目的:通过该实验,掌握通过计算机实验信息量和信道容量的计算方法
实验要求:对一个离散的无记忆信源,给定信源的输入概率分布,给定一个信道特性,计算各种信息量和熵,并计算信道容量。
实验原理:
n设输入X∈{x1,x2,…,xi,…,xn}
        输出Y∈{y1,y2,…,yj,…,ym} ,信道的一般数学模型如下图:




在给定信源概率分布条件下,



各种熵的求解方法如下:
1)       
信源熵


条件熵





联合熵



交互熵


信道容量
n一般离散信道容量对计算步骤总结如下:


实验设备:计算机  c++
五、实验报告要求
1、        画出程序设计的流程图,2、       
3、        写出程序代码,4、       
5、        写出在调试过程中出现的问题 ,6、       
7、        对实验的结果进行分析。


实验二 香农编码
一 实验目的、掌握通过计算机实现香农编码
二实验要求
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现.
三、实验原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码
信源符号按概率从大到小排列
对信源符号求累加和,表达式: Pi=Pi-1+p(xi)
求自信息量,确定码字长度。自信息量I(xi)=-log(p(xi));码字长度取大于等于自信息量的最小整数。
将累加和用二进制表示,并取小数点后码字的长度的码 。

四、实验设备  计算机  c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。


实验三 费诺编码
一 实验目的:掌握通过计算机实现费诺编码
二实验要求:
对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现.
三实验原理
费诺编码的步骤:
A  将概率按从大到小的顺序排列
B  按编码进制数将概率分组,使每组概率和尽可能接近或相等。
C 给每组分配一位码元
D 将每一分组再按同样原则划分,重复b和c,直到概率不再可分为止
四 实验设备  计算机  c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
#include<stdlib.h>
class T
{
public:
T() {}
~T();
void Create();
void Coutpxj();
void Coutk();
void Coutz();
void Print();
protected:
int n;
double *p;
double *pxj;
int *k;
    double *mz;
};

void T::Create()
{
cout<<"请输入信源符号个数:";
    cin>>n;
    p=new double[n];
    cout<<"请分别输入这"<<n<<"个概率:\n";
    for(int i=0;i<n;i++)
        cin>>p;
    pxj=new double[n];
    k=new int[n];
    mz=new double[n];
double sum=0.0;
for(i=0;i<n;i++)
     sum+=p;
if(sum!=1.0)
  throw 1;
    else
{
  for(i=0;i<n;i++)
  {
            int k=i;
            for(int j=i+1;j<n;j++)
      if(p[k]<p[j]) k=j;
         double m=p;
         p=p[k];
         p[k]=m;
  }
}
}

T::~T()
{
    delete p;
    delete pxj;
    delete k;
    delete mz;
}

void T::Coutpxj()
{
    pxj[0]=0;
    for(int i=1;i<n;i++)
{
        pxj=0;
     for(int j=0;j<i;j++)
      pxj+=p[j];
}
}

void T::Coutk()
{
for(int i=0;i<n;i++)
{
     double d=(-1)*(log(p)/log(2));
  if(d-(int)d>0)    k=(int)d+1;
        else    k=(int)d;
}
}

void T::Print()
{
cout<<"Xi"<<setw(8)<<"P(xi)"
        <<setw(8)<<"Pa(xj)"
     <<setw(8)<<"Ki"
     <<setw(8)<<"码字"
     <<endl;
    for(int i=0;i<n;i++)
    {    cout<<"X"<<i+1
       <<setw(8)<<setprecision(2)<<p
    <<setw(8)<<setprecision(2)<<pxj
    <<setw(8)<<k<<"    ";
         mz=pxj;
   for(int j=0;j<k;j++)
   {
       if(2*mz-1>=0)   
    {
     cout<<1;
     mz=2*mz-1;
    }
    else   
    {
     cout<<0;
     mz=2*mz;
    }
   }
   cout<<endl;
}
double K=0.0,H=0.0,Y;
for(i=0;i<n;i++)
{
  K+=(double)p*k;
  H+=(-1)*p*(log10(p)/log10(2.0));
}
  Y=H/K;
  cout<<"平均码长:"<<K<<endl;
  cout<<"信源熵:"<<H<<endl;
  cout<<"编码效率:"<<Y<<endl;

}

void main()
{
    T t;int e;
try
{
     t.Create();
        t.Coutpxj();
        t.Coutk();
        t.Print();
}
catch(int e)
{if(e==1) cout<<"输入错误,请重新运行";}
}



实验四 哈夫曼编码
一 实验目的:掌握通过计算机实现哈夫曼编码
二实验要求:
对于给定的信源的概率分布,按照哈夫曼编码的方法进行计算机实现.
三实验原理
哈夫曼编码的步骤:
(1). 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。      
  (2). 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率
(3). 把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。   
   (4). 完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为零,概率小的赋为1。

四实验设备  计算机  c++

五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
六 参考程序
哈夫曼编码:
根据二叉树思想,将二叉树的程序改编




#include<iostream> #include<string> using namespace std; typedef struct {     int weight;     int flag;     int parent;     int lchild;     int rchild; }hnodetype; typedef struct {     int bit[10];     int start;     char leaf; }hcodetype; void huf(char cha[],int m[],int n) {                                        int i,j,m1,m2,x1,x2,c,p;     hnodetype *huffnode=new hnodetype[2*n-1];     hcodetype *huffcode=new hcodetype[n],cd;     for(i=0;i<2*n-1;i++)     {                                     //初始化哈夫曼树         huffnode.weight=0;         huffnode.parent=0;         huffnode.flag=0;         huffnode.lchild=-1;         huffnode.rchild=-1;     }     for(i=0;i<n;i++)     {                                    //哈夫曼结点赋初值         huffnode.weight=m;         huffcode.leaf=cha;     }     for(i=0;i<n-1;i++)     {                                    //对结点进行编码         m1=m2=10000000;         x1=x2=0;         for(j=0;j<n+i;j++)         {             if(huffnode[j].weight<=m1&&huffnode[j].flag==0)             {                 m2=m1;                 x2=x1;                 m1=huffnode[j].weight;                 x1=j;             }             else if(huffnode[j].weight<=m2&&huffnode[j].flag==0)             {                 m2=huffnode[j].weight;                 x2=j;             }         }         huffnode[x1].parent=n+i;         huffnode[x2].parent=n+i;         huffnode[x1].flag=1;         huffnode[x2].flag=1;         huffnode[n+i].weight=huffnode[x1].weight+huffnode[x2].weight;         huffnode[n+i].lchild=x1;         huffnode[n+i].rchild=x2;     }     for(i=0;i<n;i++) {                                         //生成哈夫曼树             cd.start=n-1;             c=i;             p=huffnode[c].parent;             while(p!=0)             {                 if(huffnode[p].lchild==c)                     cd.bit[cd.start]=0;                 else                     cd.bit[cd.start]=1;                 cd.start--;                 c=p;                 p=huffnode[c].parent;             }             cout<<huffcode.leaf<<":";             for(j=cd.start+1;j<n;j++)             {                 huffcode.bit[j]=cd.bit[j];                 cout<<cd.bit[j];             }             cout<<endl;             huffcode.start=cd.start;     }     delete[] huffcode;     delete[] huffnode; } void main() {     int i=0; int m[10]={30,23,10,10,9,8,7,3};     char cha[10]="abcdefgh"; float f;     cout<<"该字符串为:\t"; for (i=0;i<strlen(cha);i++) { cout<<cha<<"\t"; } cout<<"字符加权为:\t"; for (i=0;i<strlen(cha);i++) {   f=(float)m/100;   cout<<f<<"\t"; }
    cout<<"各字符的哈夫曼码为:"<<endl; i=strlen(cha);     huf(cha,m,i);


实验五 循环码编码
一 实验目的:掌握通过计算机实现系统循环码编码
二实验要求:
对于给定的消息序列,按照循环码编码的方法进行计算机实现.
三实验原理
循环码的编码步骤:
循环码的系统码构造的步骤为:
  1)消息多项式乘x n-k
  2) x n-km(x)/g(x)=q(x) +r(x)/g(x)
       其中:q(x)是商,r(x)是余数
  3)C(x)= x n-km(x)+r(x)


四实验设备
计算机  c++

五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。




实验六  模p信道编码实验

一 实验目的:掌握通过计算机实现模p信道编码
二实验要求:
对于给定的消息序列,按照模p信道编码的方法进行计算机实现.
三实验原理
在实际生活中,有时侯“1”和“I”很相似。
    p=37(符号的个数)
      数字“0”-“9”和字母“A”-“Z”和空格共37种符号。
      “0”           0
      “1”           1
       ¨
     “A”            10
     “B”             11
设有某消息的符号序列为X=X1X2X3X4,
  用下表的方式来求它们的和及累加和,然后加上适当的监督元,使累加和是模37的倍数。



四实验设备
计算机  c++

五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
沙发
yx19850621 发表于 08-6-3 10:26:59 | 只看该作者
还没有接触过信息论!
帮不到你了
板凳
蓑燚 发表于 12-6-1 13:00:05 | 只看该作者
好不错啊 !!
地板
蓑燚 发表于 12-6-1 13:00:34 | 只看该作者
就是关于实验的流程图没有 啊!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系我们|Free考研资料 ( 苏ICP备05011575号 )

GMT+8, 24-11-26 19:47 , Processed in 0.096346 second(s), 11 queries , Gzip On, Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表