• 重复码编译码


    又一个实验,供以后参考

    实验原理

        一般的通信信道中总是不可避免的存在噪声或者干扰,因此在信息传输的过程中也就必然会造成信息的损失,或者说,信源符号在有噪信道中的传输过程中会产生失真。为了降低这种信息损失,就需要我们在信源符号输入到信道之前,对其进行有效的信道编码。

        信道编码是通信系统中的一个重要环节,目的就是为了降低传输过程中错误发生的概率,从而提高通信系统的可靠性。信道编码的基本思想是附加冗余信息,增加信源的剩余度,这样在接收端就可以利用相关性进行检错或者纠错。根据有噪信道编码定理,附加冗余位可以降低信息传输率,使错误概率减小,当信息传输率小于信道容量时,理论上就可以使译码错误概率任意小,从而几乎无失真的进行信息传送。当然,同样是增加信源剩余度,不同的编码方法,其检、纠错能力也不同。目前,人们对信道编码的研究有很多,大概可分为线性分组码、循环码、卷积码等等。

    (一)重复码

    重复编码是一种简单的信道编码方法,其实质就是将每个要发送的符号重复发送,或者说是将原来的每一个信源符号编成多个相同的码元符号,其值与原来的符号取值相同。比如(3,1)二元重复码,其编码方法就是将原来二进制序列中的每一个“0”编成“000”,将每一个“1”编成“111”。

        所谓的译码规则就是指接收符号与发送符号之间的映射关系。不同的译码规则会造成不同的平均错误概率,所以人们一般都根据最小错误概率准则来确定译码规则。对于二元对称信道来说,一般总认为出错概率是小于等于0.5的,所以对于二元重复码,最小错误概率准则与择多译码规则是一致的,也就是说,译码时根据码字中“0”“1”的数目选择数目多的进行译码。比如(3,1)二元重复码的译码,可以将接收到的“000”、“001”、“010”和“100”译为“0”,将接收到的“011”、“101”、“110”和“111”译为“1”。这样,每个码字对于传输过程中发生的任一位错误,通过译码都可以进行自动纠正。可以证明,一个(n,1)重复码可以纠正传输过程中可能出现的不多于个差错。

    (二)比特操作

        在“实验一”中,我们已经熟悉了如何将一个字节(8bit)数据进行拆分,并每次针对半个字节(4bit)进行处理。在本实验中,根据重复码的编、译码原理,我们每次操作的对象是1bit,因此应该对“实验一”中的方法进行修正,使之能够对字节中的每个bit进行控制与操作:

    1)读取数据时,由于每次向输入文件的读取是以字节(8bit)为单位的,故需将每次读取的8bit(1字节)按位分开,以便对每个比特进行操作;

     2)输出数据时,由于每次向输出文件的写入是以字节(8bit)为单位的,故需每凑足8bit(1字节)执行一次向输出文件的写入操作。

    code.cpp

    #include <stdio.h>
    #include <stdlib.h>
    #define n 3
    
    static unsigned int inbfr,outbfr;
    static FILE *outfile,*infile;
    static int incnt,outcnt,mask;
    
    void init()
    {
      outbfr=0;
      outcnt=8;
      inbfr=0;
      incnt=8;
      mask=0x80;				//10000000
    }
    
    int getbit()
    {
       int bitval;
       bitval=inbfr&mask;		//bitval0000000
       incnt--;					//7
       mask >>= 1;				//01000000
       bitval >>= incnt;
       if (incnt==0)
    	{
    		inbfr=fgetc(infile);
    		incnt=8;
    		mask=0x80;
    	}
       return bitval;			//0000000bitval
    }
    
    void putbit( int bitval)
    {
        outbfr = (outbfr<<1)&255;	//00000000
        outbfr |= bitval;			//0000000bitval
    	outcnt --;
        if (outcnt==0) 
        {
          fputc(outbfr,outfile);
          outcnt = 8;
        }
    }
    
    void alignbits()
    {
      if (outcnt!=8)
      {
    	  for (int i=0;i<outcnt;i++)
    		  putbit(0);
      }
    }
    
    void main()
    {
        int bitval;
    	if((infile=fopen("ccc.txt","rb"))==NULL)
    	{
    		printf("cannot open infile!!!\n");
    		exit(0);
    	}
       if((outfile=fopen("eee.txt","wb"))==NULL)
       {
    	   printf("cannot open outfile!!!\n");
    	   exit(0);
       }
       init();
       inbfr=fgetc(infile);
       while(!feof(infile))
       {
    	   bitval=getbit();
    	   for (int i=0;i<n;i++)
    		   putbit(bitval);
    
       }
       alignbits();
       fclose(infile);
       fclose(outfile);
    }
    

    decode.cpp
    #include <stdio.h>
    #include <stdlib.h>
    #define n 3
    
    static unsigned int inbfr,outbfr;
    static FILE *outfile,*infile;
    static int incnt,outcnt,mask;
    
    void init()
    {
      outbfr=0;
      outcnt=8;
      inbfr=0;
      incnt=8;
      mask=0x80;
    }
    
    int getbit()
    {
       int bitval;
       bitval=inbfr&mask;
       incnt--;
       mask >>= 1;
       bitval >>= incnt;
       if (incnt==0)
    	{
    		inbfr=fgetc(infile);
    		incnt=8;
    		mask=0x80;
    	}
       return bitval;
    }
    
    void putbit( int bitval)
    {
        outbfr = (outbfr<<1)&255;
        outbfr |= bitval;
    	outcnt --;
        if (outcnt==0) 
        {
          fputc(outbfr,outfile);
          outcnt = 8;
        }
    }
    
    void alignbits()
    {
      if (outcnt!=8)
      {
    	  for (int i=0;i<outcnt;i++)
    		  putbit(0);
      }
    }
    
    void main()
    {
        int bitsum;
    	if((infile=fopen("eee.txt","rb"))==NULL)
    	{
    		printf("cannot open infile!!!\n");
    		exit(0);
    	}
       if((outfile=fopen("fff.txt","wb"))==NULL)
       {
    	   printf("cannot open outfile!!!\n");
           exit(0);
       }
       init();
       inbfr=fgetc(infile);
       while(!feof(infile))
       {
    	  bitsum=0;
    	  for (int i=0;i<n;i++) bitsum+=getbit();
          if (bitsum>=2) putbit(1);
    	  else putbit(0);
       }
       alignbits();
       fclose(infile);
       fclose(outfile);
    }

  • 相关阅读:
    集合类... 分类: java 20091102 14:22 193人阅读 评论(0) 收藏
    全选复选框 分类: 网页编程【html、js】 20091102 20:56 257人阅读 评论(0) 收藏
    数组自带的push方法 分类: 网页编程【html、js】 20091102 20:51 235人阅读 评论(0) 收藏
    Scanner类 分类: java 20091102 14:18 188人阅读 评论(0) 收藏
    计算阶乘之和 分类: java 20091102 14:12 206人阅读 评论(0) 收藏
    冒泡排序... 分类: java 20091102 14:09 224人阅读 评论(0) 收藏
    获得html 属性值的集中方法 分类: 网页编程【html、js】 20090908 12:32 861人阅读 评论(1) 收藏
    OpenAPI系列:汇总
    OpenAPI系列: 二、资源
    软件生存周期文档系列 之 9.开发进度月报
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218675.html
Copyright © 2020-2023  润新知