zoukankan      html  css  js  c++  java
  • CCS

    The Sum-Product Algorithm

    The sum-product algorithm, which belongs to the class of message-passing algorithms,
    is an iterative decoding algorithm for LDPC codes that is based on passing likelihood
    ratios between variable and check nodes. The variable nodes receive the outputs of the
    channel and pass the likelihoods of codeword components to the check nodes. Each
    check node updates the received likelihoods using the information it has gathered from
    all variable nodes that are connected to it and sends the updated likelihoods back to
    the check nodes. This process is repeated until a predetermined maximum number
    of iterations is achieved or until a codeword is decoded (i.e., all check equations are satisfied).

     

     

    Matlab Coding

     1 % MATLAB script for Illustrative Problem 10.24
     2 
     3 H = [1 0 1 1 1 0 0
     4      1 1 0 1 0 1 0
     5      0 1 1 1 0 0 1];            % Code parity-check matrix
     6 E = 1;                          % Symbol energy
     7 n = size(H,2);                  % Codeword length
     8 f = size(H,1);                  % Number of parity check bits
     9 R = (n-f)/n;                    % Code rate
    10 EbN0_dB = 2;
    11 EbN0 = 10^(EbN0_dB/10);
    12 noise_variance = E/(2*R*EbN0);              
    13 noise = sqrt(noise_variance)*randn(1,n);
    14 y = ones(1,n) + noise;        % Assuming the all-zero codeword is transmitted
    15 max_it = 50;
    16 [c check] = sp_decoder(H,y,max_it,E,EbN0_dB);
    17 
    18 
    19 
    20 function [c check] = sp_decoder(H,y,max_it,E,EbN0_dB)
    21 %SP_DECODER is the Sum-Product decoder for a linear block code code with BPSK modulation
    22 %   [c check] = sp_decoder(H,y,max_it,N0) 
    23 %   y           channel output 
    24 %   H           parity-check matrix of the code
    25 %   max_it      maximum number of iterations 
    26 %   E           symbol energy
    27 %   EbN0_dB     SNR/bit (in dB)
    28 %   c           decoder output
    29 %   check       is 0 if c is a codeword and is 1 otherwise
    30 
    31 n = size(H,2);                  % Length of the code
    32 f = size(H,1);                  % Number of parity checks
    33 R = (n-f)/n;                    % Rate
    34 Eb = E/R;                       % Energy/bit
    35 N0 = Eb*10^(-EbN0_dB/10);       % one-sided noise PSD
    36 L_i = 4*sqrt(E)*y/N0;
    37 [j i] = find(H);
    38 nz = length(find(H));
    39 L_j2i = zeros(f,n);
    40 L_i2j = repmat(L_i,f,1) .* H;
    41 L_i2j_vec = L_i + sum(L_j2i,1);
    42 % Decision making:
    43 L_i_total = L_i2j_vec;
    44 for l = 1:n
    45     if L_i_total(l) <= 0
    46         c_h(l) = 1;
    47     else
    48         c_h(l) = 0;
    49     end
    50 end
    51 s = mod(c_h*H',2);
    52 if nnz(s) == 0
    53     c = c_h;
    54 else
    55     it = 1;
    56     while ((it <= max_it) && (nnz(s)~=0))
    57         % Variable node updates:
    58         for idx = 1:nz
    59             L_i2j(j(idx),i(idx)) = L_i2j_vec(i(idx)) - L_j2i(j(idx),i(idx));
    60         end
    61         % Check node updates:
    62         for q = 1:f
    63             F = find(H(q,:));
    64             L_j2i_vec(q) = prod(tanh(0.5*L_i2j(q,F(:))),2);
    65         end
    66         for idx = 1:nz
    67             L_j2i(j(idx),i(idx)) = 2*atanh(L_j2i_vec(j(idx)) /...
    68                 tanh(0.5*L_i2j(j(idx),i(idx))));
    69         end
    70         L_i2j_vec = L_i + sum(L_j2i,1);
    71         % Decision making:
    72         L_i_total = L_i2j_vec;
    73         for l = 1:n
    74             if L_i_total(l) <= 0
    75                 c_h(l) = 1;
    76             else
    77                 c_h(l) = 0;
    78             end
    79         end
    80         s = mod(c_h*H',2);
    81         it = it + 1;
    82     end
    83 end
    84 c = c_h;
    85 check = nnz(s);
    86 if (check > 0)
    87     check = 1;
    88 end

    >> EbN0_dB

    EbN0_dB =

    2

    >> c

    c =

    0 0 0 0 0 0 0

    >> check

    check =

    0

    >> EbN0_dB

    EbN0_dB =

    -4

    >> c

    c =

    0 0 0 0 1 0 0

    >> check

    check =

    1

    Reference,

      1. <<Contemporary Communication System using MATLAB>> - John G. Proakis

  • 相关阅读:
    软件工程概论---二维最大子数组和
    电梯调度之需求分析
    梦断代码读书笔记(一)
    软件工程概论---max单元测试
    软件工程概论---最大子数组的和延伸
    软件工程概论第三周测验---最大子数组
    软件工程概论第二周综合测验
    软件工程概论第二周综合测验----设计思路
    2015年上学期读书计划
    关于阅读构建之法提出的问题
  • 原文地址:https://www.cnblogs.com/zzyzz/p/13765708.html
Copyright © 2011-2022 走看看