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

原理

举个例子来说明,假设校验矩阵是

A=\begin{Bmatrix} 1 &1 &1 &0 &0 &1 &1 &0 &0 &1 \\ 1 &0 &1 &0 &1 &1 &0 &1 &1 &0 \\ 0 &0 &1 &1 &1 &0 &1 &0 &1 &1 \\ 0 &1 &0 &1 &1 &1 &0 &1 &0 &1 \\ 1 &1 &0 &1 &0 &0 &1 &1 &1 &0 \end{Bmatrix}

把接收到的码字表示成一个向量:

r=\begin{Bmatrix} r_{1} &r_{2} &r_{3} &r_{4} &r_{5} &r_{6} &r_{7} &r_{8} &r_{9} &r_{10} \end{Bmatrix}

根据接收到的码字r,可以计算出伴随式syndrome

s=r\times A^T

可以展开成5个校验方程

s_1=r_1+r_2+r_3+r_6+r_7+r_{10}

s_2=r_1+r_3+r_5+r_6+r_8+r_9

s_3=r_3+r_4+r_5+r_7+r_9+r_{10}

s_4=r_2+r_4+r_5+r_6+r_8+r_{10}

s_5=r_1+r_2+r_4+r_7+r_8+r_{9}

举一个具体例子,发送一个码字,接收到的码字有一个错误,用bit-flipping算法做一个译码。

发送码字为:

c=\begin{Bmatrix} 0 &0 &0 &1 &0 &1 &0 &1 &0 &1 \end{Bmatrix}

接收到的码字有错误:

c=\begin{Bmatrix} 0 &0 &0 &1 &1 &1 &0 &1 &0 &1 \end{Bmatrix}

可以看到r_5是错误的,用比特翻转算法,尝试做一个译码:

s_1=r_1+r_2+r_3+r_6+r_7+r_{10}=0 \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; z_1

s_2=r_1+r_3+r_5+r_6+r_8+r_9=1\, \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \, \: \: \: \: z_2

s_3=r_3+r_4+r_5+r_7+r_9+r_{10}=1\: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \, \: \: \: \: z_3

s_4=r_2+r_4+r_5+r_6+r_8+r_{10}=1\: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \, \: \: \: \: z_4

s_5=r_1+r_2+r_4+r_7+r_8+r_{9}=0\: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \, \: \: \: \: z_5

伴随式不是都为0,查看不等于0的方程里r_n出现个数,可以发现只有r_5是都出现了,一共出现了3次。

然后我们可以尝试将r_5翻转成0,再一次计算伴随式,我们会发现伴随式全部为0,译码结束。

为什么r_5我们明明接收错误了,还能够被纠正呢?因为r_5的信息不光在r_5中,还通过LDPC编码分布在了r_n(n!=5)里面,所以我们才可能通过其他的r_n得到正确的r_5

我们用\lambda来表示对数似然比,很容易可以得到

\lambda(c_2|r)=log\frac{p(c_2=1|r)}{p(c_2=0|r)}=\frac{2}{\alpha^2 }r_2+\sum_{m}^{}\lambda(z_{m,2}|r_i,i\neq 2)\: \: \: \: \: \: \: \: \: (1)

在上面公式里\frac{2}{\alpha^2 }r_2就是r_2本身的一个似然比,而\sum_{m}^{}\lambda(Z_{m,2}|r_i,i\neq 2)则是除r_2之外的其他接收码字给出的关于r_2的信息量。

Z_{m,2}是指校验方程Z_{m}中,除掉比特2之外其他比特给出的关于比特2的信息。

c_2参与校验的方程有z_1z_4z_5这三个,所以

\sum_{m}^{}\lambda(Z_{m,2}|r_i,i\neq 2)=\sum_{m\in{\{1,4,5}\}}^{}\lambda(Z_{m,2}|r_i,i\neq 2)=\lambda(z_{1,2}|\{r_i,i\neq 2\})+\lambda(z_{4,2}|\{r_i,i\neq 2\})+\lambda(z_{5,2}|\{r_i,i\neq 2\})

因为第一个校验方程比特有1,2,3,6,7,10,去掉比特2还有1,3,6,7,10,所以 

\lambda(z_{1,2}|\{r_i,i\neq 2\}) \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: =\lambda(c_1+c_3+c_6+c_7+c_{10}|r_1,r_3,r_4,r_5,r_6,r_7,r_8,r_9,r_{10})=log\frac{p(c_1+c_3+c_6+c_7+c_{10}=1|r_1,r_3,r_4,r_5,r_6,r_7,r_8,r_9,r_{10})}{p(c_1+c_3+c_6+c_7+c_{10}=0)|r_1,r_3,r_4,r_5,r_6,r_7,r_8,r_9,r_{10})}

下面引入一条定理,具体推导后续更新

tanh(-\frac{1}{2}\lambda(x_1\bigoplus x_2\bigoplus x_3 \cdots \bigoplus x_n))=tanh(-\frac{\lambda(x_1)}{2})tanh(-\frac{\lambda(x_2)}{2})tanh(-\frac{\lambda(x_3)}{2})\cdots tanh(-\frac{\lambda(x_n)}{2})

那么有

\lambda(x_1\bigoplus x_2\bigoplus x_3 \cdots \bigoplus x_n)=-2tanh^{-1}( \prod_{i}^{}tanh(-\frac{\lambda(x_n)}{2}))

将上面定理应用于\lambda(z_{m,n}|{r_i,i\neq n})的计算中,可以得到

\lambda(z_{m,n}|\{r_i,i\neq n\})=\lambda((\sum_{j\in N_{m,n} }^{}C_j)|\{r_i,i\neq n\})=-2tanh^{-1}(\prod_{j\in N_{m,n}}^{}tanh(-\frac{\lambda(c_j|\{r_i,i\neq n\})}{2})

上式中N_{m,n}表示第m个校验方程中除去n的所有比特的集合。

\eta_{m,n}= -2tanh^{-1}(\prod_{j\in N_{m,n}}^{}tanh(-\frac{\lambda(c_j|\{r_i,i\neq n\})}{2})\: \: \: \: \: \: \: \: \: \: \: \: (2)

将上式代入(1)得

\lambda(c_2|r)=log\frac{p(c_2=1|r)}{p(c_2=0|r)}=\frac{2}{\alpha^2 }r_2+\sum_{m}^{}\eta_{m,n}\: \: \: \: \: \: \: \: \: \: \: (3)

公式(2)(3)一起构成了迭代循环,我们就可以多次迭代,直至校验方程全部满足。

Matlab代码

function x = ldpc_decode(A,r,Nloop)

[M,N] = size(A);
clear Nl Ml
Nl = cell(M);
Ml = cell(N);
for m=1:M
    Nl{m} = [];
end
for n=1:N
    Ml{n} = [];
end

for m=1:M
    for n=1:N
        if(A(m,n))
            Nl{m} = [Nl{m} n];
            Ml{n} = [Ml{n} m];
        end
    end
end

eta = zeros(M,N);
lasteta = zeros(M,N);
lambda = r;

for loop = 1:Nloop
    fprintf(1,'loop=%d\n',loop);
    for m = 1:M
        for n=Nl{m}
            pr = 1; 
            for np=Nl{m}
                if np == n
                    continue;
                end
                pr = pr*tanh((-lambda(np)+lasteta(m,np))/2);
            end
            eta(m,n) = -2*atanh(pr);
        end
    end
    lasteta = eta;

    for n=1:N
        lambda(n) = r(n);
        for m = Ml{n}
            lambda(n) = lambda(n) + eta(m,n);
        end
    end

    x = lambda >= 0;
    z1 = mod(A*x',2)';

    if(all(z1==0))
        break
    end
end

%X = [1 0 1; 0 1 0; 1 1 0];
%Y = gf(X, 1);
%Z = inv(Y);
%U=X*Z;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值