原理
举个例子来说明,假设校验矩阵是
把接收到的码字表示成一个向量:
根据接收到的码字,可以计算出伴随式syndrome
可以展开成5个校验方程
举一个具体例子,发送一个码字,接收到的码字有一个错误,用bit-flipping算法做一个译码。
发送码字为:
接收到的码字有错误:
可以看到是错误的,用比特翻转算法,尝试做一个译码:
伴随式不是都为0,查看不等于0的方程里出现个数,可以发现只有
是都出现了,一共出现了3次。
然后我们可以尝试将翻转成0,再一次计算伴随式,我们会发现伴随式全部为0,译码结束。
为什么我们明明接收错误了,还能够被纠正呢?因为
的信息不光在
中,还通过LDPC编码分布在了
里面,所以我们才可能通过其他的
得到正确的
。
我们用来表示对数似然比,很容易可以得到
在上面公式里就是
本身的一个似然比,而
则是除
之外的其他接收码字给出的关于
的信息量。
是指校验方程
中,除掉比特2之外其他比特给出的关于比特2的信息。
参与校验的方程有
,
,
这三个,所以
因为第一个校验方程比特有1,2,3,6,7,10,去掉比特2还有1,3,6,7,10,所以
下面引入一条定理,具体推导后续更新
那么有
将上面定理应用于的计算中,可以得到
上式中表示第
个校验方程中除去
的所有比特的集合。
令
将上式代入(1)得
公式(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;