线性分组码.docx

上传人:b****6 文档编号:4017010 上传时间:2022-11-27 格式:DOCX 页数:31 大小:24.51KB
下载 相关 举报
线性分组码.docx_第1页
第1页 / 共31页
线性分组码.docx_第2页
第2页 / 共31页
线性分组码.docx_第3页
第3页 / 共31页
线性分组码.docx_第4页
第4页 / 共31页
线性分组码.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

线性分组码.docx

《线性分组码.docx》由会员分享,可在线阅读,更多相关《线性分组码.docx(31页珍藏版)》请在冰豆网上搜索。

线性分组码.docx

线性分组码

 

线性分组码

 

一、原理:

 

监督矩阵:

线性分组码

n,k中许用码组为

2k个。

定义线性分组码的加法为模二加法,乘法为二

进制乘法。

即1

10、101、0

11、000;111、100、00

0、

110。

且码组与码组的运算在各个相应比特位上符合上述二进制加法运算规则。

线性分组码具有如下性质n,k的性质:

1.封闭性。

任意两个码组的和还是许用的码组。

2.码的最小距离等于非零码的最小码重。

对于码组长度为n、信息码元为k位、监督码元为rnk位的分组码,常记作n,k

码,如果满足2r1n,则有可能构造出纠正一位或一位以上错误的线性码。

下面我们通过(7,4)分组码的例子来说明如何具体构造这种线性码。

设分组码n,k

中,k4,为能纠正一位误码,要求r3。

取r3,则nkr7。

该例子中,信

息组为a6a5a4a3,码字为a6a5a4a3a2a1a0。

用S1,S2,S3的值与错码位置的对应关系

可以规定为如表1所列。

由表中规定可知,当已知信息组时,按以下规则得到三个校验元,即:

S1a6a5a4a2

S2a6a5a3a1(式1.1)

S3a6a4a3a0

 

S1S2S3

001

010

100

011

在发送端编码时,信息位

 

表1

错码位置示意表。

错码位置

S1S2S3

错码位置

a0

101

a4

a1

110

a5

a2

111

a6

a3

000

无错

a6,a5,a4和a3的值决定于输入信号,因此它们是随机的。

监督位a2,a1和a0应根据信息位的取值按监督关系来确定,

即监督位应使上三式中

S1,S2

和S3的值为零(表示编成的码组中应无错码)。

由上式经移项运算,解出监督位:

a2

a6

a5

a4

a1

a6

a5

a3

(式1.2)

a0

a6

a4

a3

 

给出信息位后,可直接按上式算出监督位,其结果见表2。

接收端收到每个码组后先按式(1.1)计算出S1,S2和S3,再按表1判断错码情况。

表2(7,4)线性分组码(海明码)

 

信息组

码组

信息组

码组

0000

0000000

1000

1000111

0001

0001011

1001

1001100

0010

0010101

1010

1010010

0011

0011110

1011

1011001

0100

0100110

1100

1100001

0101

0101101

1101

1101110

0110

0110011

1110

1110100

0111

0111000

1111

1111111

给出(7,4)线性分组码有

24即16个许用码字或合法码字,另有

27

24个禁用码字。

发送方发送的是许用码字,若接收方收到的是禁用码字,则说明传输中发生了错误。

按上述方法构造的码称为海明码。

2所列的(7,4)海明码的最小码距

d0

3,因此,

这种码能纠正一个错码或检测两个错码。

海明码的编码效率等于

k/n

2r

1r/2r

1r1/2r

11

r/n

(式1.3)

当n很大时,则编码效率接近1。

可见,海明码是一种高效码。

现在再来讨论线性分组码的一般原理。

上面已经提到,线性码是指信息位和监督位满足

一组线性方程的码,式(1.1)就是这样一组线性方程的例子。

现在将它改写成:

1

a6

1

a5

1a4

0

a3

1a2

0a0

0

1

a6

1

a5

0a4

1

a3

0

a2

0a0

0

(式1.4)

1

a6

0a5

1a4

1

a3

0

a2

1a0

0

 

式(1.4)可以表示成如下矩阵形式:

a6

a5

1

1

1

0

1

0

0

a4

0

1

1

0

1

0

1

0

a3

0

1

0

1

1

0

0

1

a2

0

a1

a0

 

(模2)(式1.5)

上式还可以简记为:

 

HATOT或AHT0

其中

Aa6a5a4a3a2a1a0

 

1

1

1

0

1

0

0

H

1

1

0

1

0

1

0

1

0

1

1

0

0

1

O

0

0

0

右上标“T表”示将矩阵转置。

将H称为监督矩阵,编码时只要监督矩阵给定,编码时监督位和信息位的关系就完全

确定。

由式(1.4)、式(1.5)都可看出,H的行数就是监督关系式的数目,它等于监督位

的数目r。

H的每行中的“1的”位置表示相应码元之间存在的监督关系。

式(1.5)中的H矩

阵可以分为两部分:

1

1

1

0

1

0

0

H1101:

010

PIr

1

0

1

1

0

0

1

式中,P为rk阶矩阵,Ir为rr阶单位方阵,将具有

PIr

形式的H矩阵称为典型监

督矩阵。

由代数理论可知,

H矩阵的各行应该是线性无关的,否则将得不到

r个线性无关的监

督关系式,从而也得不到

r个独立的监督位。

若一行矩阵能写成典型的矩阵形式

PIr,则

其各行一定是线性无关的。

因为容易验证

Ir

的各行是线性无关的,故

PIr

也是线性无关

的。

生成矩阵:

类似于式(1.4)改变成式(

1.5)中矩阵形式那样,式(1.5)也可以改写成:

a2

1

1

1

0

a6

a5

a1

1

1

0

1

a4

a0

1

0

1

1

a3

或者

1

1

1

1

1

0

a2

a1a0

a6a5

a4

a3101

a6

a5

a4a3Q

0

1

1

 

(式1.6)

 

(式1.7)

 

(式:

1.8)

 

(式1.9)

 

式中,Q为一个kr阶矩阵,即它为

P的转置,即

Q

PT

式(1.9)表明,信息位给定后,用信息位的行距乘矩阵

Q就产生出监督位。

将Q的左边加上一kk阶单位方阵就构成一矩阵

G,即

1

0

0

0

1

1

1

G

0

1

0

0

1

1

0

IkQ

0

1

0

1

0

1

0

0

0

0

1

0

1

1

G称为生成矩阵,因为由它可以产生整个码组,即有

a6a5a4a3a2a1a0a6a5a4a3G

或者

 

(式1.10)

 

(式1.11)

 

(式1.12)

Aa6a5a4a3G(式1.13)

 

因此,如果找到了码的生成矩阵G,则编码的方法就完全确定。

具有IkQ形式的生成

矩阵称为典型生成矩阵。

由典型生成矩阵得出的码组A中,信息位不变,监督位附加于其

后,这种码称为系统码。

与H矩阵相似,也要求G矩阵的各行是线性无关的。

因为由式(1.13)可以看出,任

一码组A都是G的各行的线性组合。

G共有k行,若它们线性无关,则可组合出2k种不同

的码组A,它恰是有k为信息位的全部码组;若G的各行有线性相关的,则不可能由G生

成2k种不同码组了。

实际上,G的各行本身就是一个码组。

因此,如果已有k个线性无关

的码组,则可以用其作为生成矩阵G,并由它生成其余的码组。

码的距离

两个码字之间,对应位取之不同的个数,称为汉明距离,用d表示。

一个码的最小距离

dmin定义为dminmin{d(ci,cj),ij,ci,cj(n,k)},两个码字之间的距离表示了它们

之间差别的大小。

距离越大,两个码字的差别越大,则传送时从一个码字错成另一码字的可

能性越小。

码的最小距离愈大,其抗干扰能力愈强。

线性分组码的纠检错能力

对于任一个(n,k)线性分组码,

(1)若要在一个码字内检测出

e个错误,则要求码的最小距离

de1;

(2)纠正t个错误,则要求码的最小距离d2t

1;

(3)纠正

t

个错误同时检测

e(et)个错误,则要求

dt

e1

 

伴随式与译码

一般说来,式(

1.13)中A为一n列的行矩阵。

此矩阵的

n个元素就是码组中的

n个码元,

所以发送的码组就是A。

此码组在传输中可能由于干扰引入差错,

故接收码组一般说来与

A

不一定相同。

若设接收码组为一

n列的行矩阵B,即

Bbn1bn2

b0

(式1.14)

则发送码组和接收码组之差为:

B

A

E(模2)

(式1.15)

它就是传输中产生的错码行矩阵,其中

Een1en2

e0

(式1.16)

其中

ei

0

当bi

ai

1

当bi

ai

因此,若ei

0,表示该位接收码元无错;若ei

1,则表示该位接收码元有错。

式(1.15)

也可以改写成:

B

A

E

(式1.17)

接收端译码时,可将接收码组

B代入式(1.6)中计算。

若接收码组中无错码,

即E

0,

则BAE

A,把它代入式(

1.6)后,该式仍成立,则有

B

HT

0

(式1.18)

当接收码组有错时,E

0,将B代入式(1.15)后,该式不一定成立。

在错码较多,

已超过这种编码的检错能力时,

B变为另一许用码组则式(

1.18)仍能成立。

这样的错码错

码是不可检测的。

在未超过检错能力时,上式不成立,即其右端不等于零。

假设这时式(1.18)

的右端为S,即

BHT

S

(式1.19)

将BAE代入式(1.19)中可得

S(AE)HT

AHT

EHT

由式(1.6)知,AHT

0,所以

SE

HT

(式1.20)

式中,S称为伴随式或校正子。

它与式(

1.1)中的S相似,有可能利用它来指示错码

位置,这一点可以直接从式(

1.20)中看出,式中

S只与E有关,而与

A无关,这就意味

 

着S与错码E之间有确定的线性变换关系。

若S和E之间一一对应,则S将能代表错码的

位置。

 

二、编解码流程:

由H与G的分块表示的矩阵形式

HPInk

GIkQ

PQT

QPT

则有

GHT0或HGT0

已知生成矩阵

1

0

0

0

1

1

1

0

1

0

0

1

1

0

G

0

1

0

1

0

1

0

0

0

0

1

0

1

1

根据以上几式可求出监督矩阵

1

1

1

0

1

0

0

H

1

1

0

1

0

1

0

1

0

1

1

0

0

1

最后可以根据输入的四位信息位和生成矩阵相乘得到编码矩阵。

CmG

所有的编码情况如表1所示。

 

(式2.1)

(式2.2)

(式2.3)

(式2.4)

 

(式2.5)

 

(式2.6)

 

开始

 

把生成矩阵赋给一个二维数组G

 

提示输入要编码的信息码组的个数

 

提示输入信息码组M提示输入错误

并重新输入

 

错误

输入正确?

 

正确

 

将码组赋给二维数组,码组的个数作为

行数,码组的位数作为数组的列数

 

信息组的数组与生成矩阵数组相乘

 

编码输出c

 

返回

 

三、核心程序块:

(7,4)码编译器整体程序:

 

#include

 

#include

 

voidmain()

 

{

 

/*G:

生成矩阵H:

监督矩阵HT:

监督矩阵对应的转置矩阵*/

 

/*M:

输入信息序列C:

编码输出序列Input:

输入接收码序列B:

译码输出序列S:

伴随式*/

intQ,N;/*定义开始*/

inti,j,s,r,k,t,p,u,m;

 

intG[4][7]={{1,0,0,0,1,1,1},{0,1,0,0,1,1,0},{0,0,1,0,1,0,1},{0,0,0,1,0,1,1}};

intIR[3][3]={{1,0,0,},{0,1,0},{0,0,1}};

intH[3][7],C[10][7],M[10][4],B[20][7],Input[100],HT[7][3],P[10],S[100][3];/*

定义结束*/

printf("\n您好!

欢迎使用线性分组码编译器!

\n");

printf("\n\n本编译器针对(7,4)码,所采用的生成矩阵G=\n");

for(i=0;i<4;i++)

{

for(j=0;j<7;j++)

printf("%d",G[i][j]);

printf("\n");

}

printf("编译码过程都是针对二进制码组,除了系统要求选择功能,其他情况下禁止输入除

0,1以外

的数。

请在使用的过程中严格按照编译器要求的格式输入数据。

\n\n");

 

printf("现在请输入您所选择的编译器所对应的序号,按回车键继续:

\n");

printf("\n1.编码器2.译码器3.退出\n");

printf("\n我选择:

");

 

scanf("%d",&Q);

 

if(Q==0)

 

Q+=4;

 

while(Q)

 

{

if(Q==1||Q==2||Q==3)break;

 

else

 

{

printf("对不起,您输入有误,请重新输入");

scanf("%d",&Q);

 

}

 

}

 

while(Q==1||Q==2||Q==3)

 

{

 

if(Q==1)/*编码程序*/

 

{printf("\n请输入您需要编码的信息组数");

 

scanf("%d",&N);

 

printf("\n\n请输入您需要编码的%d组四位二进制信息组,码组间用空格分开,按回车

键确认。

\n",N);/*输入信息码*/

 

printf("\n信息组m=");

for(i=0;i

 

scanf("%1d%1d%1d%1d",&M[i][3],&M[i][2],&M[i][1],&M[i][0]);/*求监督码*/

for(i=0;i

 

{

 

C[i][2]=M[i][3]^M[i][2]^M[i][1];

 

C[i][1]=M[i][3]^M[i][2]^M[i][0];

 

C[i][0]=M[i][3]^M[i][1]^M[i][0];

 

}

 

for(j=0;j

 

for(i=6;i>2;i--)/*输出编码结果*/

C[j][i]=M[j][i-3];

 

printf("\n您所输入的信息组编码结果c=");

 

for(j=0;j

 

for(i=6;i>=0;i--)

 

printf("%d",C[j][i]);

 

printf("\n\n");

printf("\n接下来您想:

\n\n");/*选择功能*/

printf("1.用编码器2.用译码器3.退出\n\n");

 

printf("我想:

");

scanf("%d",&Q);

 

}

 

elseif(Q==2)/*译码程序*/

{

 

for(i=0;i<3;i++)/*求监督矩阵*/

 

{

 

for(j=0;j<4;j++)

 

H[i][j]=G[j][i+4];

 

for(j=4;j<7;j++)

 

H[i][j]=IR[i][j-4];

 

}

 

printf("\n监督矩阵H=\n");/*输出监督矩阵*/

for(i=0;i<3;i++)

 

{

 

for(j=0;j<7;j++)

 

printf("%d",H[i][j]);

 

printf("\n");

 

}

 

t=1;

 

while(t!

=2)/*输入接收码组*/

 

{

 

p=1;

 

printf("\n请输入总位数为7的倍数的接收码组,每位用空格隔开,每组位数为7

的倍数,以十进制2作为结束标志!

按回车键确认\n");

 

while(p)

 

{

 

for(i=0;;i++)

 

{

scanf("%d",&Input[i]);

 

if(Input[i]==2)break;

 

}

k=i%7;

 

if(k==0){p=0;t=2;}

 

else

 

{

 

p=1;

 

k=-k+7;

 

printf("您接收到的码组丢失了%d位,系统不能判断丢失位的具体位

 

置,请重新输入\n",k);

 

}

 

}

 

}

 

u=i/7;

 

i=0;

 

for(r=0;r

 

{for(j=6;j>=0;j--,i++)

 

B[r][j]=Input[i];

 

}

 

printf("\n将接收码组每七位分为一个码组,如下:

\n");

 

for(i=0;i

 

{

 

for(j=0;j<7;j++)

 

printf("%1d",B[i][6-j]);

 

printf("\n");

 

}

 

for(i=0;i<3;i++)/*求监督矩阵H的转置矩阵*/

for(j=0;j<7;j++)

 

HT[j][i]=H[i][j];

 

for(i=0;i

{

 

for(m=0;m<3;m++)

 

{

for(j=0;j<7;j++)

 

{

 

s+=(B[i][6-j]*HT[j][m]);

 

}

 

if(s%2==1)s=1;

 

else

 

s=0;

 

S[i][2-m]=s;

 

s=0;

 

}

 

}

 

printf("\n\n伴随式S=\n");/*输出伴随式*/

for(j=0;j

 

{for(i=2;i>=0;i--)

 

printf("%1d",S[j][i]);

 

printf("\n");}

 

printf("\n");

 

for(i=0;i

 

{

 

P[i]=4*S[i][2]+2*S[i][1]+S[i][0]+1;

 

switch(P[i])/*根据伴随式判断接收码,并译码*/

{

 

case1:

 

{

 

printf("\n\n您所接收的第%d个码组正确,它是:

",++i);

i--;

 

for(j=6;j>=0;j--)

 

printf("%1d",B[i][j]);

printf("请您再次确认!

");

printf("译出的信息序列为:

");

 

for(j=6;j>2;j--)

printf("%d",B[i][j]);break;

 

}

 

case2:

 

{

 

B[i][0]=1^B[i][0];

 

printf("\n\n您接收的第%d个码组有错误,正确的码组应为:

",++i);

 

i--;

 

for(j=6;j>=0;j--)

 

printf("%1d",B[i][j]);

 

printf("译出

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1