5G全流程详解4:LDPC码---Matlab仿真

       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;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值