重複碼編譯碼

又一個實驗,供以後參考

實驗原理

    一般的通信信道中總是不可避免的存在噪聲或者干擾,因此在信息傳輸的過程中也就必然會造成信息的損失,或者說,信源符號在有噪信道中的傳輸過程中會產生失真。爲了降低這種信息損失,就需要我們在信源符號輸入到信道之前,對其進行有效的信道編碼。

    信道編碼是通信系統中的一個重要環節,目的就是爲了降低傳輸過程中錯誤發生的概率,從而提高通信系統的可靠性。信道編碼的基本思想是附加冗餘信息,增加信源的剩餘度,這樣在接收端就可以利用相關性進行檢錯或者糾錯。根據有噪信道編碼定理,附加冗餘位可以降低信息傳輸率,使錯誤概率減小,當信息傳輸率小於信道容量時,理論上就可以使譯碼錯誤概率任意小,從而幾乎無失真的進行信息傳送。當然,同樣是增加信源剩餘度,不同的編碼方法,其檢、糾錯能力也不同。目前,人們對信道編碼的研究有很多,大概可分爲線性分組碼、循環碼、卷積碼等等。

(一)重複碼

重複編碼是一種簡單的信道編碼方法,其實質就是將每個要發送的符號重複發送,或者說是將原來的每一個信源符號編成多個相同的碼元符號,其值與原來的符號取值相同。比如(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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章