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

  • 相关阅读:
    所有HTTP返回状态值,并说明用途
    几个简单的排序算法
    Linux命令大全
    存储过程中执行动态Sql语句
    IE8的背景不显示和图片错位 解决方案
    海量数据处理方法
    关于MSSQL的返回值问题
    SQL Server 2008不能修改表的解决方法
    转:读AD里特殊的属性in C#
    了解SMS的主要特性。
  • 原文地址:https://www.cnblogs.com/zzyzz/p/13765708.html
Copyright © 2011-2022 走看看