1、线性分组码一、原理:监督矩阵:线性分组码 中许用码组为 个。定义线性分组码的加法为模二加法,乘法为kn, k2二进制乘法。即 、 、 、 ; 、 、0110010、 。且码组与码组的运算在各个相应比特位上符合上述二进制加法运算0规则。线性分组码具有如下性质 的性质:kn,1. 封闭性。任意两个码组的和还是许用的码组。2. 码的最小距离等于非零码的最小码重。对于码组长度为 、信息码元为 位、监督码元为 位的分组码,常记作nkknr码,如果满足 ,则有可能构造出纠正一位或一位以上错误的线性码。kn, r12下面我们通过(7,4)分组码的例子来说明如何具体构造这种线性码。设分组码中, ,为能纠正一位
2、误码,要求 。取 ,则 。该例子, 3r7rkn中,信息组为 ,码字为 。用 , , 的值与错码位置的3456a012456a1S23对应关系可以规定为如表 1 所列。由表中规定可知,当已知信息组时,按以下规则得到三个校验元,即:(式 1.1)0346315221aaS表 1 错码位置示意表。321S错码位置 321S错码位置001 0a101 4a010 1110 5100 2111 6011 3a000 无错在发送端编码时,信息位 , , 和 的值决定于输入信号,因此它们是随机的。6543监督位 , 和 应根据信息位的取值按监督关系来确定,即监督位应使上三式中 ,2a10 1S和 的值为零
3、(表示编成的码组中应无错码) 。由上式经移项运算,解出监督位:S3(式 1.2)3460512aa给出信息位后,可直接按上式算出监督位,其结果见表 2。接收端收到每个码组后先按式(1.1)计算出 , 和 ,再按表 1 判断错码情况。1S3表 2 (7,4)线性分组码(海明码)信息组 码组 信息组 码组0000 0000000 1000 10001110001 0001011 1001 10011000010 0010101 1010 10100100011 0011110 1011 10110010100 0100110 1100 11000010101 0101101 1101 110111
4、00110 0110011 1110 11101000111 0111000 1111 1111111给出(7,4)线性分组码有 即 16 个许用码字或合法码字,另有 个禁用码字。42 472发送方发送的是许用码字,若接收方收到的是禁用码字,则说明传输中发生了错误。按上述方法构造的码称为海明码。表 2 所列的(7,4)海明码的最小码距 ,因此,30d这种码能纠正一个错码或检测两个错码。海明码的编码效率等于(式 1.3)nrrrnkrr /12/1/ 当 n 很大时,则编码效率接近 1。可见,海明码是一种高效码。现在再来讨论线性分组码的一般原理。上面已经提到,线性码是指信息位和监督位满足一组线性
5、方程的码,式(1.1)就是这样一组线性方程的例子。现在将它改写成:(式 1.4) 01010123456 aaa式(1.4)可以表示成如下矩阵形式:(模 2) (式 1.5) 01010023456aa上式还可以简记为:或 (式 1.6)TOAHTH其中 0123456a01O右上标“T”表示将矩阵转置。将 称为监督矩阵,编码时只要监督矩阵给定,编码时监督位和信息位的关系就完全H确定。由式(1.4) 、式(1.5)都可看出, 的行数就是监督关系式的数目,它等于监督位H的数目 。 的每行中的“1”的位置表示相应码元之间存在的监督关系。式(1.5)中的r矩阵可以分为两部分:(式 1.7)1010:
6、 rPI式中, 为 阶矩阵, 为 阶单位方阵,将具有 形式的 矩阵称为典型监PkrrIrIH督矩阵。由代数理论可知, 矩阵的各行应该是线性无关的,否则将得不到 个线性无关的监H督关系式,从而也得不到 个独立的监督位。若一行矩阵能写成典型的矩阵形式 ,则r rPI其各行一定是线性无关的。因为容易验证 的各行是线性无关的,故 也是线性无关rI r的。生成矩阵:类似于式(1.4)改变成式(1.5)中矩阵形式那样,式(1.5)也可以改写成:(式:1.8)345601210aa或者(式 1.9)Qaaaaa 34563456012 10式中, 为一个 阶矩阵,即它为 的转置,即QrkP(式 1.10)T
7、Q式(1.9)表明,信息位给定后,用信息位的行距乘矩阵 就产生出监督位。将 的左边加上一 阶单位方阵就构成一矩阵 ,即kG(式 1.11)1001QIk称为生成矩阵,因为由它可以产生整个码组,即有G(式 1.12)Gaaaa 34560123456或者(式 1.13)A3456因此,如果找到了码的生成矩阵 ,则编码的方法就完全确定。具有 形式的生GQIk成矩阵称为典型生成矩阵。由典型生成矩阵得出的码组 中,信息位不变,监督位附加于其后,这种码称为系统码。与 矩阵相似,也要求 矩阵的各行是线性无关的。因为由式(1.13)可以看出,任H一码组 都是 的各行的线性组合。 共有 行,若它们线性无关,则
8、可组合出 种不AGk k2同的码组 ,它恰是有 为信息位的全部码组;若 的各行有线性相关的,则不可能由kG生成 种不同码组了。实际上, 的各行本身就是一个码组。因此,如果已有 个线k2性无关的码组,则可以用其作为生成矩阵 ,并由它生成其余的码组。码的距离两个码字之间,对应位取之不同的个数,称为汉明距离,用 表示。一个码的最小距d离 定义为 ,两个码字之间的距离表示了mind ),(,),(ini kncjicdjiji ,它们之间差别的大小。距离越大,两个码字的差别越大,则传送时从一个码字错成另一码字的可能性越小。码的最小距离愈大,其抗干扰能力愈强。线性分组码的纠检错能力对于任一个 线性分组码
9、,),(kn(1)若要在一个码字内检测出 e 个错误,则要求码的最小距离 ;1ed(2)纠正 个错误,则要求码的最小距离 ;t 12td(3)纠正 个错误同时检测 个错误,则要求 。)(tt伴随式与译码一般说来,式(1.13)中 为一 列的行矩阵。此矩阵的 个元素就是码组中的 个码元,Annn所以发送的码组就是 。此码组在传输中可能由于干扰引入差错,故接收码组一般说来与不一定相同。若设接收码组为一 列的行矩阵 ,即AB(式 1.14)021bn则发送码组和接收码组之差为:(模 2) (式 1.15)EA它就是传输中产生的错码行矩阵,其中(式 1.16)021en其中 iii abe当当0因此,
10、若 ,表示该位接收码元无错;若 ,则表示该位接收码元有错。式0ie 1ie(1.15)也可以改写成:(式 1.17)EAB接收端译码时,可将接收码组 代入式(1.6)中计算。若接收码组中无错码,即,则 ,把它代入式(1.6)后,该式仍成立,则有0EAEB(式 1.18)0TH当接收码组有错时, ,将 代入式(1.15)后,该式不一定成立。在错码较多,0B已超过这种编码的检错能力时, 变为另一许用码组则式(1.18)仍能成立。这样的错码错码是不可检测的。在未超过检错能力时,上式不成立,即其右端不等于零。假设这时式(1.18)的右端为 ,即S(式 1.19)SHBT将 代入式(1.19)中可得EA
11、B TTTHEAHES)(由式(1.6)知, ,所以0TH(式 1.20)TS式中, 称为伴随式或校正子。它与式(1.1)中的 相似,有可能利用它来指示错码S位置,这一点可以直接从式(1.20)中看出,式中 只与 有关,而与 无关,这就意味EA着 与错码 之间有确定的线性变换关系。若 和 之间一一对应,则 将能代表错码的ESS位置。二、编解码流程:由 与 的分块表示的矩阵形式HG(式 2.1)knIPH(式 2.2)QG(式 2.3)T(式 2.4)则有或 (式 2.5)0TH0TGH已知生成矩阵 1001G根据以上几式可求出监督矩阵 H1010最后可以根据输入的四位信息位和生成矩阵相乘得到编
12、码矩阵。即(式 2.6)mGC所有的编码情况如表 1 所示。错误正确开 始提示输入要编码的信息码组的个数提示输入信息码组 M输入正确?将码组赋给二维数组,码组的个数作为行数,码组的位数作为数组的列数返回提示输入错误并重新输入信息组的数组与生成矩阵数组相乘编码输出 c把生成矩阵赋给一个二维数组 G三、核心程序块:(7,4)码编译器整体程序:#include#includevoid main()/*G:生成矩阵 H:监督矩阵 HT:监督矩阵对应的转置矩阵*/*M:输入信息序列 C:编码输出序列 Input:输入接收码序列 B:译码输出序列 S:伴随式*/int Q,N;/*定义开始*/int i,
13、j,s,r,k,t,p,u,m;int G47=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;int IR33=1,0,0,0,1,0,0,0,1;int H37, C107,M104,B207,Input100,HT73,P10,S1003;/*定义结束*/printf(“n 您好!欢迎使用线性分组码编译器! n“);printf(“nn 本编译器针对(7 ,4)码,所采用的生成矩阵 G=n“);for(i=0;i2;i-)/*输出编码结果*/Cji=Mji-3;printf(“n 您所输入的信息组编码结果 c=“);for(
14、j=0;j=0;i-)printf(“%d“,Cji);printf(“nn“);printf(“n 接下来您想: nn“);/*选择功能*/printf(“1.用编码器 2.用译码器 3.退出nn“);printf(“我想:“);scanf(“%d“,else if(Q=2)/*译码程序 */for(i=0;i=0;j-,i+)Brj=Inputi;printf(“n 将接收码组每七位分为一个码组,如下:n“);for(i=0;i=0;i-)printf(“ %1d“,Sji);printf(“n“);printf(“n“);for(i=0;i=0;j-)printf(“%1d“,Bij);
15、printf(“请您再次确认!“);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 2:Bi0=1Bi0;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)printf(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 3:Bi1=1Bi1;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)pr
16、intf(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 4:Bi3=1Bi3;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)printf(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 5:Bi2=1Bi2;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)prin
17、tf(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 6:Bi4=1Bi4;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)printf(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 7:Bi5=1Bi5;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)printf
18、(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;case 8:Bi6=1Bi6;printf(“nn 您接收的第%d 个码组有错误,正确的码组应为:“,+i);i-;for(j=6;j=0;j-)printf(“%1d“,Bij);printf(“译出的信息序列为:“);for(j=6;j2;j-)printf(“%d“,Bij);break;printf(“nn 总的译码结果为: “);for(i=0;i2;j-)printf(“%1d“,Bij);printf(“nn 接下来您想: nn“);/*继续选择功能*/printf(“1.用编码器 2.用译码器 3.退出nn“);printf(“我想:“);scanf(“%d“,if(Q=0)Q=Q+4;while(Q)if(Q=1|Q=2|Q=3)break;elseprintf(“对不起,您输入有误,请重新输入 “);scanf(“%d“,else if(Q=3)/*退出程序 */printf(“n 谢谢您的使用,欢迎再次使用! n“); Q=0;