重复码编译码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重复码编译码
⼜⼀个实验,供以后参考
实验原理
⼀般的通信信道中总是不可避免的存在噪声或者⼲扰,因此在信息传输的过程中也就必然会造成信息的损失,或者说,信源符号在有噪信道中的传输过程中会产⽣失真。
为了降低这种信息损失,就需要我们在信源符号输⼊到信道之前,对其进⾏有效的信道编码。
信道编码是通信系统中的⼀个重要环节,⽬的就是为了降低传输过程中错误发⽣的概率,从⽽提⾼通信系统的可靠性。
信道编码的基本思想是附加冗余信息,增加信源的剩余度,这样在接收端就可以利⽤相关性进⾏检错或者纠错。
根据有噪信道编码定理,附加冗余位可以降低信息传输率,使错误概率减⼩,当信息传输率⼩于信道容量时,理论上就可以使译码错误概率任意⼩,从⽽⼏乎⽆失真的进⾏信息传送。
当然,同样是增加信源剩余度,不同的编码⽅法,其检、纠错能⼒也不同。
⽬前,⼈们对信道编码的研究有很多,⼤概可分为线性分组码、循环码、卷积码等等。
(⼀)重复码
重复编码是⼀种简单的信道编码⽅法,其实质就是将每个要发送的符号重复发送,或者说是将原来的每⼀个信源符号编成多个相同的码元符号,其值与原来的符号取值相同。
⽐如(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
}
}
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;
}
}
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);
}。