5G全流程详解4:LDPC码---编码

编码过程

       LDPC码是Gallager在1963年提出的一种线性分组码,其编码过程为:一个长度为k的二元信息比特序列u,经过线性编码,得到m个校验比特,生成长度为n的编码比特序列c码字c可以用生成矩阵G^T{^{}}u来表示:

      c=G^{T^{}}\times u

      在这里G可以分成单位矩阵I_{k\times k}和m个校验比特生成子矩阵P_{m\times k}

      G^T{^{}}=\binom{I_{k\times k}}{P_{m\times k}}

      校验矩阵(parity check matrix, PCM)H和码字c满足

      H\times c=0

      H一般是一个稀疏阵

      大家可以思考一下HG^T{^{}}的关系,很明显他们要满足对于任意的u

      H\times G^T{^{}} \times u=0

     那么必然有

      H\times G^T{^{}}=0

      那么我们可以得到

      H=[P_{m\times k},I_{m\times m}]...........................................................(1)

5G LDPC

校验矩阵

       查找下表中令K_b\times Z_c\geqslant K'成立的,最小的Z值,记作Z_c

        其中当BG1时,K_b=22;当BG2时,根据不同的B(code block segmentation的输入数据长度)K_b=10/9/8/6K'近似等于CB长度K

       5G中的LDPC码采用的是QC-LDPC(quasi-cyclic)码。这种码字在802.11协议中也有广泛应用。QC-LDPC码通过大小为m_{b}\times n_{b}的基础矩阵H_{BG},扩展因子(也称提升值)Z和大小为Z \times Z的置换矩阵P来定义。

       在基础矩阵H_{b}里,每个元素可以表示为hb_{ij},如下式所示:

H_{BG}=\begin{bmatrix} hb_{00} &hb_{01} &... & hb_{0(n_b-1)}\\ hb_{10} &hb_{11} &... & hb_{1(n_b-1)} \\ ...&... &... &... \\ hb_{(m_b-1)0} &hb_{(m_b-1)1} &... & hb_{(m_b-1)(n_b-1)} \end{bmatrix}

       hb_{ij}的值可以取0与1,当hb_{ij}=0时,P^{hb_{ij}}是一个零矩阵;当hb_{ij}= 1时,P^{hb_{ij}}可以表示为I(P_{i,j}),是一个向右循环P_{i,j}的单位阵,P_{i,j}=mod(V_{i,j},Z_c)V_{i,j}根据BG1/2、i_{LS}ij在下表中选取,不在表中的V_{i,j}hb_{ij}都为0。

      将hb_{ij}替换成P^{hb_{ij}}

H_{BG}=\begin{bmatrix} P^{hb_{00}} &P^{hb_{01}} &... & P^{hb_{0(n_b-1)}}\\ P^{hb_{10}} &P^{hb_{11}} &... & P^{hb_{1(n_b-1)}} \\ ...&... &... &... \\ p^{hb_{(m_b-1)0}} &p^{hb_{(m_b-1)1}} &... & p^{hb_{(m_b-1)(n_b-1)}} \end{bmatrix}

     在5G协议中中,H_{BG}有两种,一种是base graph 1,m_{b}=46,n_{b}=68,结合式(1)可以得到m=46\times Z,n=68\times Z,那么k=n-m=22\times Z,最低码率为R=k/n\approx 1/3。另一种是base graph 2,最低码率为R=k/n\approx 1/5

校验矩阵示例

        现在举一个H_{BG}的例子,当BG2,i_{LS}=1Z_c=3时,H_{BG}如下图所示。下图与3GPP协议有稍许不同,里面用-1表示0矩阵,0表示单位阵,正整数表示右移矩阵。

     I(0)= \begin{bmatrix} 1 &0 &0 \\ 0 &1 &0 \\ 0 &0 &1 \end{bmatrix}     I(1)= \begin{bmatrix} 0 &1 &0 \\ 0 &0 &1 \\ 1 &0 &0 \end{bmatrix}    I(2)= \begin{bmatrix} 0 &0 &1 \\ 1 &0 &0 \\ 0 &1 &0 \end{bmatrix}

    H= \begin{bmatrix} I(0) &I(1) &I(1) ... \\... &... &...... \\ ... &... &...... \end{bmatrix}

        那么令接收码字为R,那么有

H\times R=0

\begin{bmatrix} I(0) &I(1) &I(1) ... \\... &... &...... \\ ... &... &...... \end{bmatrix}\times \begin{bmatrix} R1\\R2\\R3\\... \end{bmatrix}=\begin{bmatrix} I(0)*R1+I(1)*R2+I(2)*R3\\...\\ ...\\ ... \end{bmatrix}

        乘以I(2)这个矩阵相当于对R3做什么处理呢?我们可以计算一下

\begin{bmatrix} 0 &0 &1 \\1 &0 &0 \\ 0 &1 &0 \end{bmatrix}\times \begin{bmatrix} 1\\0\\1 \end{bmatrix}=\begin{bmatrix} 1\\ 1 \\0 \end{bmatrix}

        可以看到相当于对R3做了一个向上循环移位2,利用这个性质可以将矩阵乘法简化为循环移位,后面我们可以在matlab代码里看到相关运用。

        I(2)的逆矩阵也很好求,就是I(1)

\begin{bmatrix} 0 &0 &1 \\1 &0 &0 \\ 0 &1 &0 \end{bmatrix}\times \begin{bmatrix} 0 &1 &0 \\0 &0 &1 \\ 1 &0 &0 \end{bmatrix}=\begin{bmatrix} 1 &0 &0 \\0 &1 &0 \\ 0 &0 &1 \end{bmatrix}

        这也比较好理解,I(2)相当于对R3做了一个向上循环移位2,同理I(1)相当于对R3做了一个向上循环移位1,那么I(2)\times I(1)相当于对R3做了一个向上循环移位3,相当于没有移位。

生成矩阵

H_{BG}\times \begin{bmatrix} S^T\\P_b^T\\P_c^T \end{bmatrix}=0

H_{BG}= \begin{bmatrix} A&B &0 \\C_1 &C_2 &I \end{bmatrix}

所以

\begin{bmatrix} A&B &0 \\C_1 &C_2 &I \end{bmatrix}\times\begin{bmatrix} S^T\\P_b^T\\P_c^T \end{bmatrix}=0

可以得到

A\times S^T+B\times P_b^T=0‘’‘’‘’‘’‘’‘’‘’‘’(1)

C_1\times S^T+C_2\times P_b^T+P_c^T=0

对于矩阵B可以通过查表得到,i=0,j=22/23

当base graph 1,当i_{LS}\in (0,1,2,3,4,5,7),则

B_{BG1\_B1}=\begin{bmatrix} 1 & 0 &-1 &-1 \\ 0&0 &0 &-1 \\ -1&-1 &0 &0 \\ 1&-1 &-1 &0 \end{bmatrix}

i_{LS}\in (6),则

B_{BG1\_B2}=\begin{bmatrix} 0 & 0 &-1 &-1 \\ 105&0 &0 &-1 \\ -1&-1 &0 &0 \\ 0&-1 &-1 &0 \end{bmatrix}

对于base graph 2,当i_{LS}\in (0,1,2,4,5,6),则

B_{BG2\_B1}=\begin{bmatrix} 0 & 0 &-1 &-1 \\ -1&0 &0 &-1 \\ 1&-1 &0 &0 \\ 0&-1 &-1 &0 \end{bmatrix}

i_{LS}\in (3,7),则

B_{BG2\_B2}=\begin{bmatrix} 1 & 0 &-1 &-1 \\ -1&0 &0 &-1 \\ 0&-1 &0 &0 \\ 1&-1 &-1 &0 \end{bmatrix}

当base graph 1,当i_{LS}\in (0,1,2,3,4,5,7)时,由式(1)得

B\times P_b^T=A\times S^T‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘(2)

P_b^T=\begin{bmatrix} P_{b1}\\P_{b2} \\P_{b3} \\ P_{b4} \end{bmatrix}

对于B_{BG1\_B1},那么可以得到

P_{b1}^{(1)}+P_{b2}=\sum_{j=1}^{K}a_{1,j}S_j

P_{b1}+P_{b2}+P_{b3}=\sum_{j=1}^{K}a_{2,j}S_j

P_{b3}+P_{b4}=\sum_{j=1}^{K}a_{3,j}S_j

P_{b1}^{(1)}+P_{b4}=\sum_{j=1}^{K}a_{4,j}S_j

为了书写方便,令:

\lambda_i=\sum_{j=1}^{K}a_{i,j}S_j\; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \;i=1,2,3,4

我们可以通过直接计算可以得到四种情况下的H为(下式中H_{BG1\_B3}应该是个笔误,需要改成H_{BG2\_B1}H_{BG1\_B4}需要改成H_{BG2\_B2}

我们也可以通过行变换来总结出统一的规律,式(2)可以变为

\begin{bmatrix} B_{11} & B_{12} &B_{13} &B_{14} \\ B_{21}&B_{22} &B_{23} &B_{24} \\ B_{31}&B_{32} &B_{33} &B_{34} \\ B_{41}&B_{42} &B_{43} &B_{44} \end{bmatrix}\times \begin{bmatrix} P_{b1}\\P_{b2} \\P_{b3} \\ P_{b4} \end{bmatrix}=\begin{bmatrix}\lambda_1 \\\lambda_2 \\\lambda_3 \\\lambda_4 \end{bmatrix}........................................(3)

b_{ij}为矩阵B中元素,B_{ij}b_{ij}对应的ZxZ的置换矩阵,也可以记为I(b_{ij})

先求P_{b1},为运用行变化,将B矩阵四行相加,我们可以发现第2、3、4列都可以抵消,对于BG1,B_{21}保留下来;对于BG2,B_{31}保留下来。所以我们可以得到,

b_{21}=-1,   I(b_{21}) \times P_{b1} = \sum_{i=1}^{4}\lambda_iP_{b1} = I(Z_c-b_{21}) \times \sum_{i=1}^{4}\lambda_i

b_{31}\neq -1,   I(b_{31}) \times P_{b1} = \sum_{i=1}^{4}\lambda_iP_{b1} = I(Z_c-b_{31}) \times \sum_{i=1}^{4}\lambda_i

然后求P_{b2},观察式3中B矩阵的第一行可以发现b_{13}b_{14}都为-1,那么可以得到

B_{11} \times P_{b1} + B_{12}\times P_{b2} =\lambda_1

B_{12}\times P_{b2} =\lambda_1+B_{11} \times P_{b1}

P_{b2} =I(Z_c-b_{12})\times(\lambda_1+I(b_{11})\times P_{b1})

然后求P_{b3},观察式3中B矩阵的第二行可以发现b_{23}都为-1,可以得到

B_{21} \times P_{b1} + B_{22}\times P_{b2} + B_{23}\times P_{b3}=\lambda_2

B_{23}\times P_{b3}=\lambda_2+B_{21} \times P_{b1} + B_{22}\times P_{b2}

P_{b3} =I(Z_c-b_{23})\times(\lambda_2+I(b_{21})\times P_{b1}+I(b_{22})\times P_{b2})

然后求P_{b4},观察式3中B矩阵的第三行可以发现b_{34}都为0,可以得到

B_{31} \times P_{b1} + B_{32}\times P_{b2} + B_{33}\times P_{b3}+B_{33}\times P_{b3}=\lambda_3

B_{33}\times P_{b3}=\lambda_3+B_{31} \times P_{b1} + B_{32}\times P_{b2}+B_{33} \times P_{b3}

P_{b4} =I(Z_c-b_{33})\times(\lambda_3+I(b_{31})\times P_{b1}+I(b_{32})\times P_{b2}+I(b_{33})\times P_{b3})

又因为

C_1\times S^T+C_2\times P_b^T+P_c^T=0

所以

P_c^T=C_1\times S^T+C_2\times P_b^T

可以把P_c计算出来

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图来表示,如下图的H

      我们就可以表示为下面的tannel图:

       该图中深黑色为一个长为4的环,围长和消息传递的独立性密切相关,围长越长,迭代速度越快,译码正确率也越高,所以我们要尽量不设计出4环和6环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值