编码过程
LDPC码是Gallager在1963年提出的一种线性分组码,其编码过程为:一个长度为的二元信息比特序列
,经过线性编码,得到m个校验比特,生成长度为n的编码比特序列
。码字
可以用生成矩阵
乘
来表示:
在这里可以分成单位矩阵
和m个校验比特生成子矩阵
:
校验矩阵(parity check matrix, PCM)和码字
满足
一般是一个稀疏阵
大家可以思考一下和
的关系,很明显他们要满足对于任意的
那么必然有
那么我们可以得到
5G LDPC
校验矩阵
查找下表中令成立的,最小的
值,记作
。
其中当BG1时,;当BG2时,根据不同的
(code block segmentation的输入数据长度)
。
近似等于CB长度
。
5G中的LDPC码采用的是QC-LDPC(quasi-cyclic)码。这种码字在802.11协议中也有广泛应用。QC-LDPC码通过大小为的基础矩阵
,扩展因子(也称提升值)
和大小为
的置换矩阵P来定义。
在基础矩阵里,每个元素可以表示为
,如下式所示:
的值可以取0与1,当
时,
是一个零矩阵;当
时,
可以表示为
,是一个向右循环
的单位阵,
。
根据BG1/2、
、
、
在下表中选取,不在表中的
的
都为0。
将替换成
在5G协议中中,有两种,一种是base graph 1,
,结合式(1)可以得到
,那么
,最低码率为
。另一种是base graph 2,最低码率为
。
校验矩阵示例
现在举一个的例子,当BG2,
,
时,
如下图所示。下图与3GPP协议有稍许不同,里面用-1表示0矩阵,0表示单位阵,正整数表示右移矩阵。
那么令接收码字为,那么有
乘以这个矩阵相当于对
做什么处理呢?我们可以计算一下
可以看到相当于对做了一个向上循环移位2,利用这个性质可以将矩阵乘法简化为循环移位,后面我们可以在matlab代码里看到相关运用。
的逆矩阵也很好求,就是
这也比较好理解,相当于对
做了一个向上循环移位2,同理
相当于对
做了一个向上循环移位1,那么
相当于对
做了一个向上循环移位3,相当于没有移位。
生成矩阵
所以
可以得到
‘’‘’‘’‘’‘’‘’‘’‘’(1)
对于矩阵B可以通过查表得到,i=0,j=22/23
当base graph 1,当,则
当,则
对于base graph 2,当,则
当,则
当base graph 1,当时,由式(1)得
‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘(2)
令
对于,那么可以得到
为了书写方便,令:
我们可以通过直接计算可以得到四种情况下的H为(下式中应该是个笔误,需要改成
,
需要改成
)
我们也可以通过行变换来总结出统一的规律,式(2)可以变为
........................................(3)
为矩阵B中元素,
为
对应的ZxZ的置换矩阵,也可以记为
。
先求,为运用行变化,将B矩阵四行相加,我们可以发现第2、3、4列都可以抵消,对于BG1,
保留下来;对于BG2,
保留下来。所以我们可以得到,
当,
,
当,
,
然后求,观察式3中B矩阵的第一行可以发现
和
都为-1,那么可以得到
然后求,观察式3中B矩阵的第二行可以发现
都为-1,可以得到
然后求,观察式3中B矩阵的第三行可以发现
都为0,可以得到
又因为
所以
可以把计算出来
Matlab代码
function cword = nrldpc_encode(B,z,msg)
%B: base matrix
%z: expansion factor
%msg: message vector, length = (#cols(B)-#rows(B))*z
%cword: codeword vector, length = #cols(B)*z
[m,n] = size(B);
cword = zeros(1,n*z);
cword(1:(n-m)*z) = msg;
%double-diagonal encoding
temp = zeros(1,z);
for i = 1:4 %row 1 to 4
for j = 1:n-m %message columns
temp = mod(temp + mul_sh(msg((j-1)*z+1:j*z),B(i,j)),2);
end
end
if B(2,n-m+1) == -1
p1_sh = B(3,n-m+1);
else
p1_sh = B(2,n-m+1);
end
cword((n-m)*z+1:(n-m+1)*z) = mul_sh(temp,z-p1_sh); %p1
%Find p2, p3, p4
for i = 1:3
temp = zeros(1,z);
for j = 1:n-m+i
temp = mod(temp + mul_sh(cword((j-1)*z+1:j*z),B(i,j)),2);
end
cword((n-m+i)*z+1:(n-m+i+1)*z) = temp;
end
%Remaining parities
for i = 5:m
temp = zeros(1,z);
for j = 1:n-m+4
temp = mod(temp + mul_sh(cword((j-1)*z+1:j*z),B(i,j)),2);
end
cword((n-m+i-1)*z+1:(n-m+i)*z) = temp;
end
function y = mul_sh(x,k)
%x: input block
%k: -1 or shift
%y: output
if (k==-1)
y = zeros(1,length(x));
else
y = [x(k+1:end) x(1:k)]; %multiplication by shifted identity
end
Tanner图
校验矩阵还可以用tannel图来表示,如下图的
我们就可以表示为下面的tannel图:
该图中深黑色为一个长为4的环,围长和消息传递的独立性密切相关,围长越长,迭代速度越快,译码正确率也越高,所以我们要尽量不设计出4环和6环。