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

bxfogqkk  于 7个月前  发布在  Matlab
关注(0)|答案(1)|浏览(135)

我有802.16 e标准的奇偶校验表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的二进制形式,大小为1152x2304spy(H) img
我想从H得到一个矩阵生成器G,我该怎么做?我需要通过将单词乘以生成器矩阵(cw = m*G,其中m-输入单词,cw-码字)来编码单词。
我尝试了不同的方法,但最后我不能达到nnz(mod(G*H', 2))等于0

des4xlb0

des4xlb01#

一个老问题,但我有相同的,并设计了一个解决方案.
该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的逆矩阵。

如果u是要编码的k比特字(信息比特),x是对应的n比特码字,由于该码与前导信息比特是系统的,我们有:

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

其中Fk-行,m-列矩阵。我们也可以将奇偶校验矩阵H表示为H = [A,B],其中Am-行,k-列矩阵,Bm-行,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

相关问题