如何确定LDPC生成矩阵形式奇偶校验矩阵(802.16e)
How to determine LDPC generator matrix form parity check matrix (802.16e)
我对 802.16e 标准进行奇偶校验 table 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
然后我得到大小为 1152x2304
的二进制形式的 H
:spy(H) img
我想从H
得到一个矩阵生成器G
,我该怎么做?我需要通过将单词乘以生成矩阵来对单词进行编码(cw = m*G
,其中 m
- 输入单词,cw
- 代码字)。
我尝试了不同的方法,但最后我无法达到 nnz(mod(G*H', 2))
等于 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
不是单数的(它有一个倒数)。所以:
H * x^ = [A,B] * x^ = [A,B] * [u,c]^ = A * u^ + B * c^ = 0n^
(H * x^)^ = u * A^ + c * B^ = 0n
(H * x^)^ * inv(B^) = u * A^ * inv(B^) + c = 0n
它来自哪里(我们在GF2
):
c = u * (A^ * inv(B^))
因此:
F = A^ * inv(B^)
G = [Ik,A^ * inv(B^)]
octave 代码从 H
计算 G
(其中 H
已经在 GF2
中)并检查 G * H^ = 0
( Matlab 代码应该非常相似):
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
我对 802.16e 标准进行奇偶校验 table 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
然后我得到大小为 1152x2304
的二进制形式的 H
:spy(H) img
我想从H
得到一个矩阵生成器G
,我该怎么做?我需要通过将单词乘以生成矩阵来对单词进行编码(cw = m*G
,其中 m
- 输入单词,cw
- 代码字)。
我尝试了不同的方法,但最后我无法达到 nnz(mod(G*H', 2))
等于 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
不是单数的(它有一个倒数)。所以:
H * x^ = [A,B] * x^ = [A,B] * [u,c]^ = A * u^ + B * c^ = 0n^
(H * x^)^ = u * A^ + c * B^ = 0n
(H * x^)^ * inv(B^) = u * A^ * inv(B^) + c = 0n
它来自哪里(我们在GF2
):
c = u * (A^ * inv(B^))
因此:
F = A^ * inv(B^)
G = [Ik,A^ * inv(B^)]
octave 代码从 H
计算 G
(其中 H
已经在 GF2
中)并检查 G * H^ = 0
( Matlab 代码应该非常相似):
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