重复码编译码

又一个实验,供以后参考

实验原理

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

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

(一)重复码

重复编码是一种简单的信道编码方法,其实质就是将每个要发送的符号重复发送,或者说是将原来的每一个信源符号编成多个相同的码元符号,其值与原来的符号取值相同。比如(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);
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
极化码码和解码是一种在通信系统中常用的码和解码技术。码过程中,极化码使用递归构造的方式将一组输入位映射为一组对应的极化码位,以提高码效率。解码过程中,极化码使用迭代译码算法来降低误码率。 码程序主要包括以下步骤: 1. 初始化:设置码长和信息位长度,并初始化码序列为信息位长度。 2. 递归构造:在每次递归时,根据已有的码序列生成下一层码序列。通过计算和比较,找到当前最小的索引,将其补位到码序列末尾,再将其复制到码序列的前半部分和后半部分。 3. 重复递归构造,直到码序列与信息位长度相等为止。 4. 输出码序列作为极化码的码结果。 译码程序主要包括以下步骤: 1. 初始化:设置码长和信息位长度,并初始化存储中间结果的变量。 2. 对接收到的码序列进行初始化,即初始化真实码序列和对数似然比(LLR)。 3. 递归反转:对每层码进行反转操作,即将原始码序列中的每一对码元进行比特反转。 4. 递归译码:按照递归构造时的顺序对每层码进行译码,利用计算公式和更新LLR的方法进行迭代计算。 5. 根据译码结果进行信息位的提取,得到解码结果。 极化码码和解码是一个相对复杂的过程,需要根据具体的通信系统要求来实现相关的码和解码程序。通过合理的设计和优化,可以提高通信系统的可靠性和性能表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值