Matlab 如何从奇偶校验矩阵(802.16e)中确定LDPC发生器矩阵

Matlab 如何从奇偶校验矩阵(802.16e)中确定LDPC发生器矩阵,matlab,encoding,error-correction,Matlab,Encoding,Error Correction,我有802.16e标准的奇偶校验表H,具有1/2速率和扩展因子96: Hb = -1 94 73 -1 -1 -1 -1 -1 55 83 -1 -1 7 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 27 -1 -1 -1 22 79 9 -1 -1 -1 12 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 24 22 81 -1 33 -1 -1 -1 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 6

我有802.16e标准的奇偶校验表
H
,具有
1/2
速率和扩展因子
96

Hb = 
-1 94 73 -1 -1 -1 -1 -1 55 83 -1 -1 7 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 27 -1 -1 -1 22 79 9 -1 -1 -1 12 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 24 22 81 -1 33 -1 -1 -1 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1
61 -1 47 -1 -1 -1 -1 -1 65 25 -1 -1 -1 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1
-1 -1 39 -1 -1 -1 84 -1 -1 41 72 -1 -1 -1 -1 -1 0 0 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 46 40 -1 82 -1 -1 -1 79 0 -1 -1 -1 -1 0 0 -1 -1 -1 -1 -1
-1 -1 95 53 -1 -1 -1 -1 -1 14 18 -1 -1 -1 -1 -1 -1 -1 0 0 -1 -1 -1 -1
-1 11 73 -1 -1 -1 2 -1 -1 47 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 -1 -1 -1
12 -1 -1 -1 83 24 -1 43 -1 -1 -1 51 -1 -1 -1 -1 -1 -1 -1 -1 0 0 -1 -1
-1 -1 -1 -1 -1 94 -1 59 -1 -1 70 72 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 -1
-1 -1 7 65 -1 -1 -1 -1 39 49 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0
43 -1 -1 -1 -1 66 -1 41 -1 -1 -1 26 7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0
然后我以二进制形式获得
H
,大小为
1152x2304

我想从
H
获得一个矩阵生成器
G
,我该怎么做?我需要通过将单词乘以生成器矩阵来编码单词(
cw=m*G
,其中
m
-输入单词,
cw
-代码单词)


我尝试了不同的方法,但最后我无法达到
nnz(mod(G*H',2))
equal
0
这是一个老问题,但因为我有同样的问题并设计了一个解决方案

这种LDPC码是系统的,即码字包含信息位,信息位是码字的前导位。所有计算均在
GF2
(大小为2的伽罗瓦字段)中进行

让我们指出:

  • n
    码字长度(以及
    H
    G
    的列数)
  • m
    奇偶校验位数(以及
    H
    的行数)
  • k=n-m
    信息位数(以及
    G
    的行数)
  • [A,B]
    将两个子矩阵
    A
    B
    从左到右串联而成的矩阵(当
    A
    B
    具有相同的行数时)
  • A^
    矩阵的转置矩阵
    A
  • Ip
    大小
    p
    的单位矩阵
  • 0p
    大小的零向量
    p
  • inv(A)
    方阵的逆
    A
如果
u
是要编码的
k
-位字(信息位)和
x
对应的
n
-位码字,由于代码是系统化的,带有前导信息位,我们有:

x = u * G
  = u * [Ik,F] = [u,u * F] = [u,c]
c = u * F
其中,
F
k
-行,
m
-列矩阵。我们还可以将奇偶校验矩阵
H
表示为
H=[A,B]
,其中
A
m
-行,
k
-列矩阵,
B
m
-行,
m
-列(方形)矩阵。事实上,
B
不是单数的(它有一个倒数)。因此:

它的来源(我们在
GF2
):

因此:

F = A^ * inv(B^)
G = [Ik,A^ * inv(B^)]
H
计算
G
(其中
H
已在
GF2
中)并检查
G*H^=0
(Matlab代码应非常类似):

c = u * (A^ * inv(B^))
F = A^ * inv(B^)
G = [Ik,A^ * inv(B^)]
pkg load communications

function F = make_gen_min(H)
    m = size(H, 1);
    n = size(H, 2);
    k = n - m;
    A = H(1:m, 1:k);
    B = H(1:m, k+1:n);
    F = transpose(A) * inv(transpose(B)); 
endfunction

function G = make_gen(H)
    m = size(H, 1);
    n = size(H, 2);
    k = n - m;
    F = make_gen_min(H);
    G = [gf(eye(k), 2), F];
endfunction

H = [...];

G = make_gen(H);
if(any(G * transpose(H)))
    disp ("Error: G * transpose(H) != 0");
else
    disp ("Note: G * transpose(H) == 0");
endif