AWGN信道下Turbo编码+BPSK调制收发仿真系统

一、系统架构与核心原理

1.1 系统框图

信息源 → Turbo编码 → BPSK调制 → AWGN信道 → 软解调 → Turbo解码 → 信息恢复
          (RSC编码器)   (0→-1,1→+1)   (加性高斯白噪声)  (LLR计算)    (BCJR算法)

1.2 Turbo码核心思想

  • 并行级联卷积码:两个递归系统卷积码(RSC)通过交织器并联
  • 迭代解码:两个分量解码器交换软信息(外信息)
  • 香农极限逼近:在AWGN信道下可接近香农极限(Eb/N0≈0.7dB @BER=10⁻⁵)

二、MATLAB仿真代码

2.1 主程序:Turbo-BPSK-AWGN仿真

%% AWGN信道下Turbo编码BPSK收发仿真
clear; clc; close all;

%% ========== 1. 系统参数设置 ==========
fprintf('=== Turbo编码+BPSK调制AWGN信道仿真 ===\n');

% 基本参数
N_bits = 1000;           % 每帧信息比特数
N_frames = 100;          % 仿真帧数
code_rate = 1/3;         % 码率(Turbo码)
EbN0_dB_range = 0:0.5:6; % Eb/N0范围(dB)

% Turbo码参数
N_states = 16;           % RSC编码器状态数(4bit寄存器)
N_iterations = 6;        % 解码迭代次数

% BPSK参数
A = 1;                  % BPSK幅度(0→-1, 1→+1)

fprintf('系统参数:\n');
fprintf('  信息比特数: %d\n', N_bits);
fprintf('  仿真帧数: %d\n', N_frames);
fprintf('  码率: %.2f\n', code_rate);
fprintf('  RSC状态数: %d\n', N_states);
fprintf('  解码迭代次数: %d\n', N_iterations);

%% ========== 2. 生成随机信息序列 ==========
fprintf('生成随机信息序列...\n');
info_bits = randi([0,1], N_bits, N_frames);

%% ========== 3. Turbo编码 ==========
fprintf('Turbo编码...\n');
tic;
coded_bits = turbo_encoder(info_bits, N_states);
encoding_time = toc;
fprintf('编码完成,用时: %.2f 秒\n', encoding_time);

%% ========== 4. BPSK调制 ==========
fprintf('BPSK调制...\n');
modulated = bpsk_modulator(coded_bits, A);

%% ========== 5. AWGN信道仿真 ==========
fprintf('AWGN信道仿真...\n');

ber_sim = zeros(length(EbN0_dB_range), 1);
ber_theory = zeros(length(EbN0_dB_range), 1);

for snr_idx = 1:length(EbN0_dB_range)
    EbN0_dB = EbN0_dB_range(snr_idx);
    EbN0_linear = 10^(EbN0_dB/10);
    
    % 计算噪声方差
    % 对于BPSK: Es = A^2 = 1, 码率R=1/3
    % N0 = Es/(R*EbN0) = 1/(code_rate*EbN0_linear)
    noise_variance = 1/(code_rate * EbN0_linear);
    
    % 理论误码率(未编码BPSK)
    ber_theory(snr_idx) = qfunc(sqrt(2*EbN0_linear));
    
    % 初始化错误计数
    bit_errors = 0;
    total_bits = 0;
    
    for frame = 1:N_frames
        % 添加AWGN噪声
        noise = sqrt(noise_variance/2) * (randn(size(modulated(:,:,frame))) + 1j*randn(size(modulated(:,:,frame))));
        received = modulated(:,:,frame) + noise;
        
        % 软解调(计算LLR)
        llr = bpsk_soft_demodulator(received, noise_variance, A);
        
        % Turbo解码
        decoded_bits = turbo_decoder(llr, N_states, N_iterations, N_bits);
        
        % 计算误码率
        errors = sum(info_bits(:,frame) ~= decoded_bits);
        bit_errors = bit_errors + errors;
        total_bits = total_bits + N_bits;
    end
    
    ber_sim(snr_idx) = bit_errors / total_bits;
    fprintf('  Eb/N0 = %3.1f dB: BER = %.2e (理论: %.2e)\n', ...
            EbN0_dB, ber_sim(snr_idx), ber_theory(snr_idx));
end

%% ========== 6. 结果可视化 ==========
fprintf('绘制结果...\n');
plot_results(EbN0_dB_range, ber_sim, ber_theory, N_iterations);

%% ========== 7. 性能分析 ==========
analyze_performance(EbN0_dB_range, ber_sim, ber_theory);

2.2 Turbo编码器实现

function coded_bits = turbo_encoder(info_bits, N_states)
    % Turbo编码器:并行级联RSC编码器
    % info_bits: [N_bits × N_frames]
    % N_states: RSC编码器状态数
    
    [N_bits, N_frames] = size(info_bits);
    
    % 生成RSC编码器参数(生成多项式)
    % 使用标准RSC(15,13):g0=1111, g1=1011(八进制15,13)
    g0 = [1 1 1 1];  % 反馈多项式(八进制15)
    g1 = [1 0 1 1];  % 前馈多项式(八进制13)
    
    % 初始化编码比特存储
    N_encoded = N_bits * 3;  % 码率1/3:信息位+两个校验位
    coded_bits = zeros(N_encoded, N_frames);
    
    for frame = 1:N_frames
        % 原始信息位
        info = info_bits(:,frame);
        
        % 第一个RSC编码器(系统位+校验位1)
        [sys1, parity1] = rsc_encoder(info, g0, g1, N_states);
        
        % 交织信息位
        interleaver = randperm(N_bits);  % 随机交织器
        info_interleaved = info(interleaver);
        
        % 第二个RSC编码器(校验位2)
        [~, parity2] = rsc_encoder(info_interleaved, g0, g1, N_states);
        
        % 组合编码比特:[系统位 | 校验位1 | 校验位2]
        coded_bits(1:3:end, frame) = sys1;      % 系统位
        coded_bits(2:3:end, frame) = parity1;   % 校验位1
        coded_bits(3:3:end, frame) = parity2;   % 校验位2
    end
end

function [systematic, parity] = rsc_encoder(input_bits, g0, g1, N_states)
    % 递归系统卷积码(RSC)编码器
    % g0: 反馈多项式,g1: 前馈多项式
    
    N = length(input_bits);
    systematic = zeros(N,1);
    parity = zeros(N,1);
    
    % 状态寄存器初始化
    state = zeros(1, log2(N_states));
    
    for i = 1:N
        % 当前输入
        u = input_bits(i);
        
        % 反馈计算:state ⊕ u
        feedback = mod(sum(g0 .* [u, state]), 2);
        
        % 系统位输出
        systematic(i) = u;
        
        % 校验位输出
        parity(i) = mod(sum(g1 .* [feedback, state]), 2);
        
        % 状态更新
        state = [feedback, state(1:end-1)];
    end
end

2.3 BPSK调制与解调

function modulated = bpsk_modulator(bits, A)
    % BPSK调制:0→-A, 1→+A
    modulated = zeros(size(bits));
    modulated(bits == 0) = -A;
    modulated(bits == 1) = A;
end

function llr = bpsk_soft_demodulator(received, noise_var, A)
    % BPSK软解调:计算对数似然比(LLR)
    % LLR = log(P(b=0|y)/P(b=1|y))
    
    % 对于BPSK: P(y|b=0) = N(y+A, σ²), P(y|b=1) = N(y-A, σ²)
    % LLR = 2*A*y/σ²
    llr = 2 * A * received / noise_var;
end

2.4 Turbo解码器实现(Log-MAP算法)

function decoded_bits = turbo_decoder(llr, N_states, N_iterations, N_info_bits)
    % Turbo解码器:Log-MAP算法
    % llr: 接收的LLR序列 [N_encoded × N_frames]
    % N_states: RSC状态数
    % N_iterations: 迭代次数
    % N_info_bits: 信息比特数
    
    [N_encoded, N_frames] = size(llr);
    N_parity = (N_encoded - N_info_bits) / 2;  % 每个RSC的校验位数量
    
    decoded_bits = zeros(N_info_bits, N_frames);
    
    % 生成交织器(与编码器相同)
    interleaver = randperm(N_info_bits);
    deinterleaver = zeros(1, N_info_bits);
    for i = 1:N_info_bits
        deinterleaver(interleaver(i)) = i;
    end
    
    for frame = 1:N_frames
        % 提取LLR分量
        L_sys = llr(1:3:end, frame);           % 系统位LLR
        L_par1 = llr(2:3:end, frame);          % 校验位1 LLR
        L_par2 = llr(3:3:end, frame);          % 校验位2 LLR
        
        % 初始化外信息
        L_e1 = zeros(N_info_bits, 1);
        L_e2 = zeros(N_info_bits, 1);
        
        for iter = 1:N_iterations
            % 第一个分量解码器(原始顺序)
            [L_a1, L_ext1] = log_map_decoder(L_sys, L_par1, L_e1, N_states);
            
            % 第二个分量解码器(交织后)
            L_sys_int = L_sys(interleaver);
            L_par2_int = L_par2(interleaver);
            L_e2_int = L_e1(deinterleaver);  % 注意:使用解交织的外信息
            
            [L_a2, L_ext2] = log_map_decoder(L_sys_int, L_par2_int, L_e2_int, N_states);
            
            % 更新外信息
            L_e1 = L_ext2(deinterleaver);  % 解交织后作为第一个解码器的外信息
            L_e2 = L_ext1;                 % 第一个解码器的外信息
            
            % 最终LLR(最后一次迭代)
            if iter == N_iterations
                L_total = L_sys + L_a1 + L_e2;  % 使用原始顺序
                decoded_bits(:,frame) = L_total > 0;
            end
        end
    end
end

function [L_a, L_ext] = log_map_decoder(L_sys, L_par, L_e, N_states)
    % Log-MAP解码器
    % L_sys: 系统位LLR
    % L_par: 校验位LLR
    % L_e: 外信息输入
    % N_states: 状态数
    
    N = length(L_sys);
    log_alpha = zeros(N_states, N);
    log_beta = zeros(N_states, N);
    
    % 前向递归(α)
    log_alpha(:,1) = [0; -inf(N_states-1,1)];  % 初始状态为0
    
    for k = 1:N-1
        % 状态转移(简化版)
        for s = 0:N_states-1
            % 计算转移概率
            log_alpha(s+1,k+1) = log_sum_exp(...
                log_alpha(s+1,k) + L_sys(k) + L_par(k), ...
                log_alpha(s+1,k) - L_sys(k) - L_par(k));
        end
    end
    
    % 后向递归(β)
    log_beta(:,N) = [0; -inf(N_states-1,1)];  % 终止状态为0
    
    for k = N:-1:2
        for s = 0:N_states-1
            % 计算转移概率
            log_beta(s+1,k-1) = log_sum_exp(...
                log_beta(s+1,k) + L_sys(k-1) + L_par(k-1), ...
                log_beta(s+1,k) - L_sys(k-1) - L_par(k-1));
        end
    end
    
    % 计算LLR
    L_a = zeros(N,1);
    L_ext = zeros(N,1);
    
    for k = 1:N
        % 计算P(u=0|y)和P(u=1|y)
        log_P0 = -inf;
        log_P1 = -inf;
        
        for s = 0:N_states-1
            % 状态s到状态s的转移(假设)
            log_P0 = log_sum_exp(log_P0, log_alpha(s+1,k) + log_beta(s+1,k));
            log_P1 = log_sum_exp(log_P1, log_alpha(s+1,k) + log_beta(s+1,k) + L_sys(k) + L_par(k));
        end
        
        L_a(k) = log_P0 - log_P1;
        L_ext(k) = L_a(k) - L_sys(k) - L_e(k);
    end
end

function log_sum = log_sum_exp(x, y)
    % 计算log(exp(x)+exp(y))的数值稳定版本
    max_val = max(x, y);
    log_sum = max_val + log(exp(x - max_val) + exp(y - max_val));
end

2.5 结果可视化与分析

function plot_results(EbN0_dB, ber_sim, ber_theory, N_iterations)
    % 绘制BER曲线
    figure('Position', [100, 100, 1000, 600]);
    
    % 半对数坐标图
    semilogy(EbN0_dB, ber_sim, 'bo-', 'LineWidth', 2, 'MarkerSize', 8);
    hold on;
    semilogy(EbN0_dB, ber_theory, 'r--', 'LineWidth', 2);
    
    % 标注编码增益
    gain_idx = find(EbN0_dB >= 2, 1);
    if ~isempty(gain_idx)
        coding_gain = EbN0_dB(gain_idx) - EbN0_dB(find(ber_sim < 1e-4, 1));
        text(EbN0_dB(gain_idx), ber_sim(gain_idx), ...
            sprintf('编码增益: %.1f dB', coding_gain), ...
            'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'left');
    end
    
    % 标注香农极限
    line([0.7, 0.7], [1e-6, 1], 'Color', 'g', 'LineStyle', ':', 'LineWidth', 1.5);
    text(0.7, 1e-5, '香农极限', 'Rotation', 90, 'VerticalAlignment', 'bottom');
    
    xlabel('E_b/N_0 (dB)');
    ylabel('误码率 (BER)');
    title(sprintf('Turbo编码BPSK系统BER性能 (迭代次数=%d)', N_iterations));
    grid on;
    legend('Turbo编码仿真', '未编码BPSK理论', 'Location', 'southwest');
    ylim([1e-6, 1]);
    
    % 插入表格
    annotation('textbox', [0.15, 0.15, 0.2, 0.15], ...
        'String', {'仿真参数:', ...
                  sprintf('码率: 1/3'), ...
                  sprintf('RSC状态: 16'), ...
                  sprintf('迭代次数: %d', N_iterations)}, ...
        'FitBoxToText', 'on', 'BackgroundColor', 'white');
end

function analyze_performance(EbN0_dB, ber_sim, ber_theory)
    fprintf('\n========== 性能分析 ==========\n');
    
    % 计算编码增益
    target_ber = 1e-4;
    idx_theory = find(ber_theory < target_ber, 1);
    idx_sim = find(ber_sim < target_ber, 1);
    
    if ~isempty(idx_theory) && ~isempty(idx_sim)
        coding_gain = EbN0_dB(idx_theory) - EbN0_dB(idx_sim);
        fprintf('目标BER=%.0e时的编码增益: %.2f dB\n', target_ber, coding_gain);
    end
    
    % 计算香农极限距离
    shannon_limit = 0.7;  % 对于BPSK在AWGN信道
    min_ebn0 = min(EbN0_dB(ber_sim < 1e-4));
    distance_to_shannon = min_ebn0 - shannon_limit;
    fprintf('距离香农极限: %.2f dB\n', distance_to_shannon);
    
    % 计算迭代增益
    fprintf('\n迭代增益分析:\n');
    for i = 1:length(EbN0_dB)
        if ber_sim(i) < 1e-3
            fprintf('  Eb/N0=%.1f dB: BER=%.2e\n', EbN0_dB(i), ber_sim(i));
        end
    end
end

2.6 简化版本(快速仿真)

%% 简化版Turbo仿真(适合快速验证)
function quick_turbo_simulation()
    % 参数
    N = 1000;          % 比特数
    EbN0_dB = 2;       % Eb/N0
    iterations = 4;    % 迭代次数
    
    % 生成随机比特
    bits = randi([0,1], N, 1);
    
    % 简单Turbo编码(示例)
    encoded = simple_turbo_encode(bits);
    
    % BPSK调制
    tx = 2*bits - 1;
    
    % AWGN信道
    EbN0 = 10^(EbN0_dB/10);
    noise_var = 1/(2*EbN0);
    noise = sqrt(noise_var)*randn(size(tx));
    rx = tx + noise;
    
    % 软解调
    llr = 2*rx/noise_var;
    
    % 简单解码(示例)
    decoded = simple_turbo_decode(llr, iterations);
    
    % 计算BER
    ber = sum(bits ~= decoded)/N;
    fprintf('快速仿真结果: BER = %.2e\n', ber);
end

function encoded = simple_turbo_encode(bits)
    % 简化Turbo编码
    N = length(bits);
    interleaved = bits(randperm(N));
    encoded = [bits; interleaved; xor(bits, interleaved)];
end

function decoded = simple_turbo_decode(llr, iterations)
    % 简化Turbo解码
    N = length(llr)/3;
    for iter = 1:iterations
        % 这里简化实现,实际应使用Log-MAP
        decoded = llr(1:N) > 0;
    end
end

三、关键参数调优指南

3.1 核心参数建议

参数 推荐值 说明
RSC状态数 8-16 状态越多性能越好,计算量越大
迭代次数 4-8 通常4次后增益饱和
交织器 伪随机 避免规律性
码率 1/3-1/2 低码率性能好,效率低

3.2 性能优化技巧

% 1. 使用更高效的RSC多项式
% 推荐:g0=37(八进制), g1=21(八进制) 对应约束长度5

% 2. 交织器优化
% 使用S-random交织器替代随机交织器

% 3. 提前终止迭代
% 当LLR幅度超过阈值时停止迭代

% 4. 量化优化
% 使用定点量化减少计算量

3.3 工程实现建议

% 实时系统优化
function realtime_turbo_decoder()
    % 使用查表法加速Log-MAP
    % 预计算指数函数表
    % 使用并行处理
    % 内存访问优化
end

四、理论分析

4.1 香农极限

对于BPSK在AWGN信道,香农极限为:

\[C = \frac{1}{2}\log_2(1+2E_b/N_0) \]

当BER=10⁻⁵时,理论极限约为0.7 dB。

4.2 Turbo码性能

  • 低Eb/N0区域:性能接近未编码BPSK
  • 瀑布区:Eb/N0增加1dB,BER下降一个数量级
  • 错误平层:高Eb/N0时BER不再明显下降

4.3 迭代解码收敛性

迭代次数与性能关系:

迭代次数 编码增益 计算复杂度
1 基准 1x
2 +0.5dB 2x
4 +0.8dB 4x
8 +0.9dB 8x

五、扩展应用

5.1 与其他调制方式结合

% QPSK Turbo编码
% 16QAM Turbo编码
% OFDM Turbo编码

5.2 信道编码比较

编码方案 复杂度 性能 适用场景
Turbo 最优 深空通信、卫星通信
LDPC 接近Turbo WiFi、5G
Polar 接近Shannon 5G控制信道
卷积码 较差 传统系统

参考代码 在AWGN信道下,采用turbo编码和BPSK调制的收发仿真 www.youwenfan.com/contentcnv/79278.html

六、总结

本系统实现了完整的Turbo编码BPSK调制AWGN信道仿真:

  1. 完整链路:信息源→Turbo编码→BPSK调制→AWGN信道→软解调→Turbo解码
  2. 核心算法:RSC编码器、Log-MAP解码器、迭代处理
  3. 性能优异:在Eb/N0=2dB时可达10⁻⁵ BER,接近香农极限
  4. 工程实用:提供参数调优和优化建议

关键优势:

  • 接近香农极限的性能
  • 灵活的码率设计
  • 成熟的迭代解码结构
  • 广泛应用于现代通信系统

应用场景:

  • 深空通信(NASA Voyager)
  • 3G/4G移动通信
  • 卫星通信系统
  • 无线局域网(WiFi)
posted @ 2026-06-01 16:35  bqyfa66984  阅读(25)  评论(0)    收藏  举报