LDPC码字有如下优点:
- LDPC码不像turbo码和卷积码那样害怕无线信道中的深度衰落,所以没有特别复杂的交织器。而且我们从之前的算法分析也可以看出无论是编码还是译码都比较简单
- 适合并行化,有类似与神经网络算法,已经有人在尝试用GPU来实现LDPC译码
- 性能接近香农限
因为LDPC码有这么多优点,所以无论是WiFi还是5G,都将其选用主要的编译码方式。下面给出完整的matlab仿真程序,希望能对读者有用。如果您希望有更深的理解,需要个人培训,也可以私信我。
clear;
load base_matrices/NR_1_6_208.txt
B = NR_1_6_208; %NR_1_2_20;
[Row,Col] = size(B); % 46 * 68
z = 208;
%noise sigma
EbNodB = -4;
R = 1; %uncoded1BPSK (1 bit/symbol)
EbNo = 10^(EbNodB/10) ;
sigma = sqrt(1/ (2*R*EbNo));
msg = randi([0 1], 1, (Col-Row) * z);
c = nrldpc_encode(B, z, msg);
check_cword(B, z, c);
%add noise
s = 2 * c - 1; %BPSK bit to symbol conversion 1->1,0->-1
r = s + sigma * randn(1, length(s)); %AWGN channel
h = get_h(B, z);
Return = ldpc_decode(h, r, 50);
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
function out = check_cword(B,z,c)
%B: base matrix
%z: expansion factor
%c: candidate codeword, length = #cols(B) * z
%out = 1, if codeword is valid; 0, else
[m,n] = size(B);
syn = zeros(m*z,1); %Hc^T
for i = 1:m
for j = 1:n
syn((i-1)*z+1:i*z) = mod(syn((i-1)*z+1:i*z) + mul_sh(c((j-1)*z+1:j*z),B(i,j))',2);
end
end
if any(syn)
out = 0;
else
out = 1;
end
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;