如何确定LDPC生成矩阵形式奇偶校验矩阵(802.16e)

时间:2017-05-10 09:03:08

标签: 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
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:spy(H) img

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

我尝试不同的方法,但最后我无法达到nnz(mod(G * H',2))等于0.

1 个答案:

答案 0 :(得分:1)

一个古老的问题,但我有同样的设计解决方案...

该LDPC码是系统的,即码字包含信息位,信息位是码字的前导位。所有计算都在GF2(Galois字段大小为2)中进行。

让我们来表示:

  • n代码字长(以及HG的列数),
  • m奇偶校验位数(以及H的行数),
  • k=n-m信息位数(以及G的行数),
  • [A,B]通过左右连接两个子矩阵AB形成的矩阵(当AB具有相同数量的行),
  • A^矩阵A的转置矩阵,
  • Ip大小为p的身份矩阵,
  • 0p大小为p的零向量,
  • inv(A)方阵的倒数A

如果uk - 要编码的字(信息位)和x相应的n - 位代码字,因为代码是系统的信息位,我们有:

x = u * G
  = u * [Ik,F] = [u,u * F] = [u,c]
c = u * F

其中Fk - 行,m - 列矩阵。我们还可以将奇偶校验矩阵H表示为H = [A,B],其中Am - 行,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代码,用于计算G H H已在GF2中的G * H^ = 0并检查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 (Matlab)代码应该非常相似):

mapView.isMyLocationEnabled = true