Matlab 如何从奇偶校验矩阵(802.16e)中确定LDPC发生器矩阵
我有802.16e标准的奇偶校验表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
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))
equal0
这是一个老问题,但因为我有同样的问题并设计了一个解决方案
这种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