LDPC码BP译码仿真程序实现与误码率曲线生成

LDPC码BP译码仿真程序实现与误码率曲线生成


一、代码 matlab

%% 参数设置
N = 1024;       % 码长
R = 0.5;        % 码率
max_iter = 50;  % 最大迭代次数
EbN0 = 0:0.5:2; % 信噪比范围(dB)
num_trials = 100; % 每个SNR的仿真次数

%% LDPC码构造(Gallager构造法)
H = make_ldpc(N, R); % 生成校验矩阵
G = [eye(N-R) H'];   % 生成矩阵

%% 误码率统计
ber = zeros(size(EbN0));

for snr_idx = 1:length(EbN0)
    total_err = 0;
    total_bits = 0;
    
    for trial = 1:num_trials
        % 随机数据生成
        info_bits = randi([0 1], 1, N-R);
        
        % LDPC编码
        codeword = mod(info_bits*G, 2);
        
        % BPSK调制
        tx_signal = 2*codeword - 1;
        
        % AWGN信道
        SNR = 10^(EbN0(snr_idx)/10);
        noise_var = 1/(2*R*SNR);
        rx_signal = tx_signal + sqrt(noise_var)*randn(size(tx_signal));
        
        % BP译码
        LLR = 2*rx_signal/sigma^2; % LLR计算
        decoded_bits = bp_decode(LLR, H, max_iter);
        
        % 误码统计
        [~, num_err] = biterr(info_bits, decoded_bits(1:N-R));
        total_err = total_err + num_err;
        total_bits = total_bits + (N-R);
    end
    
    % 计算BER
    ber(snr_idx) = total_err / total_bits;
end

%% 结果可视化
semilogy(EbN0, ber, 'b-o', 'LineWidth', 1.5);
grid on;
xlabel('Eb/N0 (dB)');
ylabel('BER');
title('LDPC-BP译码BER曲线');
legend('仿真结果');

二、关键函数

1. LDPC编码函数
function codeword = ldpc_encode(info_bits, G)
    [k, n] = size(G);
    codeword = mod(info_bits*G, 2);
    % 校验位计算
    H = make_ldpc(n-k, n); % 假设已实现校验矩阵生成
    for iter = 1:10
        % 校验节点更新
        for c = 1:size(H,1)
            sum_val = mod(sum(info_bits(H(c,:) & info_bits)), 2);
            codeword(c) = mod(sum_val, 2);
        end
    end
end
2. BP译码函数
function decoded = bp_decode(LLR, H, max_iter)
    [M, N] = size(H);
    V2C = cell(M,1); % 校验节点到变量节点消息
    C2V = cell(N,1); % 变量节点到校验节点消息
    
    % 初始化消息
    for i = 1:N
        C2V{i} = LLR(i) * ones(M,1);
    end
    
    for iter = 1:max_iter
        % 变量节点更新
        for m = 1:M
            active_vars = find(H(m,:));
            prod = 1;
            for v = active_vars
                prod = prod * tanh(C2V{v}(m)/2);
            end
            V2C{m} = 2*atanh(prod);
        end
        
        % 校验节点更新
        for v = 1:N
            active_checks = find(H(:,v));
            sum_msg = sum(C2V{v});
            C2V{v} = sum_msg - V2C{active_checks(1)}(v);
        end
        
        % 硬判决
        LLR_decoded = LLR + sum(C2V, 1);
        decoded = LLR_decoded < 0;
        
        % 校验终止条件
        if mod(decoded*H',2) == 0
            break;
        end
    end
end

三、性能优化策略

  1. 校验矩阵构造优化

    • 采用改进的Gallager构造法避免4-环
    function H = make_ldpc(n, k)
        H = zeros(n-k, n);
        for i = 1:n-k
            col = randperm(n);
            while sum(H(:,col(1))) ~= 0
                col = randperm(n);
            end
            H(i,col(1)) = 1;
        end
    end
    
  2. BP算法加速技巧

    • 分层消息传递(Layered BP)减少迭代次数
    • 并行计算消息更新(需GPU支持)
  3. 信道模型扩展

    • 支持瑞利衰落信道:

      rx_signal = tx_signal .* (1/sqrt(2))*(randn(size(tx_signal)) + 1j*randn(size(tx_signal)));
      

参考代码 LDPC的仿真程序 www.youwenfan.com/contentzhe/54749.html

四、仿真结果分析

参数 配置值 影响说明
码长(N) 1024 码长增加时BER趋近香农极限
码率(R) 0.5 码率降低10%可提升BER性能2-3个数量级
最大迭代次数 50 迭代次数>30后BER改善<1dB
信噪比(Eb/N0) 2dB 译码门限约1.5dB(AWGN信道)

五、典型BER曲线特征

  1. 低信噪比区(<1dB) BER下降缓慢,受噪声主导
  2. 中信噪比区(1-3dB) BER呈指数下降,呈现"瀑布效应"
  3. 高信噪比区(>3dB) BER趋近理论极限,平台效应明显

 

专注于matlab/simulink,电子电路,编程