代码改变世界

线性分组码

2015-05-06 15:47  jianglg3  阅读(785)  评论(0编辑  收藏  举报

线性码中按照线性方程构成的。在线性码中信息位和监督位是由一些线性代数方程联系着。

一般来说,若码长为n,信息位为k,则监督位数r=n-k。如果希望用r个监督位构造出r个监督关系式来指示一个错码的n种可能位置,则要求 2^r - 1 > n 或 2^r > k + r + 1。

举例说明:

(n,k)=(7,4) 

监督关系:

S1 = a6 ^ a5 ^ a4 ^ a2

S2 = a6 ^ a5 ^ a3 ^ a1

S3 = a6 ^ a4 ^ a3 ^ a0

S1 S2 S3 表示3个监督关系式中的校正子,它们为0,则表示无错误码,否则有一个错误码。

可得到校正子与错误位置关系

S1 S2 S3    错误位置

 0   0   1           a0

 0   1   0           a1

 1   0   0          a2

 0   1   1           a3

 1   0   1          a4

 1   1   0          a5

 1   1   1          a6

 0   0   0           无

 

S1 = a6 ^ a5 ^ a4 ^ a2 = 0

S2 = a6 ^ a5 ^ a3 ^ a1 = 0

S3 = a6 ^ a4 ^ a3 ^ a0 = 0

表示编成的码组中应无错码

将上3式经过移位运算,解出监督位

 a6 ^ a5 ^ a4  =  a2

 a6 ^ a5 ^ a3  =  a1 

 a6 ^ a4 ^ a3  =  a0 

则结果如下:

a6 a5 a4 a3   a2 a1 a0

 0  0   0   0    0  0   0

 0  0   0   1    0  1   1

 0  0   1   0    1  0   1

 0  0   1   1    1  1   0  

 0  1   0   0    1  1   0

 0  1   0   1    1  0   1

 0  1   1   0    0  1   1

 0  1   1   1    0  0   0 

 1  0   0   0    1  1   1

 1  0   0   1    1  0   0

 1  0   1   0    0  1   0

 1  0   1   1    0  0   1  

 1  1   0   0    0  0   1

 1  1   0   1    0  1   0

 1  1   1   0    1  0   0

 1  1   1   1    1  1   1 

改写为:

1*a6 ^ 1*a5 ^ 1*a4 ^ 0*a3 ^ 1*a2 ^ 0*a1 ^0*a0 = 0

1*a6 ^ 1*a5 ^ 0*a4 ^ 1*a3 ^ 0*a2 ^ 1*a1 ^0*a0 = 0

1*a6 ^ 0*a5 ^ 1*a4 ^ 1*a3 ^ 0*a2 ^ 0*a1 ^1*a0 = 0

       1  1  1  0  1  0  0

H =  1  1  0  1  0  1  0

       1  0  1  1  0  0  1

 

例题:发送发A=(0 0 1 1 1 1 0)经过信道发到B方,接收到B=(0 0 1 0 1 1 0)

S=BHT=(0 1 1)

则 a3发生误码,纠错后B'=(0 0 1 1 1 1 0)

 

Verilog代码:

module ex( clk,u,c,y );

input clk;
input[3:0] u;             //信息

output[6:0] c;           //信息+校验位
reg[6:0] c;

output[6:0] y;         
reg[6:0] y;

always@(posedge clk)
begin
c[6] <= u[3];
c[5] <= u[2];
c[4] <= u[1];
c[3] <= u[0];

c[2] <= u[1]^u[2]^u[3];// check bit
c[1] <= u[0]^u[2]^u[3];
c[0] <= u[0]^u[1]^u[3];
end


reg[2:0] s;
reg[6:0] e;
always@(posedge clk)
begin
s[2] <= c[2]^c[4]^c[5]^c[6];//syndrome is based on check bit or Even supervision
s[1] <= c[1]^c[3]^c[5]^c[6];
s[0] <= c[0]^c[3]^c[4]^c[6];

e[0] <= s[0] & (~s[1]) & (~s[2]);//error pattern is based on syndrome c[0]
e[1] <= (~s[0]) & s[1] & (~s[2]);// c[1]
e[2] <= (~s[0]) & (~s[1]) & s[2]; // c[2]
e[3] <= s[0] & s[1] & (~s[2]);// c[3]
e[4] <= s[0] &(~s[1]) & s[2]; // c[4]
e[5] <= (~s[0]) & s[1] & s[2]; // c[5]
e[6] <= s[0] & s[1] & s[2]; // c[6]


y <= e^c;
end


endmodule