BPSK/QPSK 在 AWGN 与 Rayleigh 信道下的误码率理论计算与仿真

一、理论公式推导(闭式解)

1.1 AWGN 信道下的理论误码率

BPSK (AWGN)

QPSK (AWGN)

注意:每比特能量与噪声功率谱密度之比,对于 QPSK,


1.2 Rayleigh 平坦衰落信道下的理论误码率

BPSK (Rayleigh)

其中 是复高斯信道系数。

QPSK (Rayleigh)


二、MATLAB 仿真与理论对比代码

%% BPSK/QPSK 在 AWGN 与 Rayleigh 信道下的误码率分析
clear; clc; close all;

%% 参数设置
EbN0_dB = 0:2:20;           % 信噪比范围 (dB)
EbN0_lin = 10.^(EbN0_dB/10); % 线性值
num_bits = 1e6;              % 每信噪比点仿真比特数
mod_types = {'BPSK', 'QPSK'};
channel_types = {'AWGN', 'Rayleigh'};

%% 理论误码率计算
% AWGN 信道
Pb_BPSK_AWGN_theory = 0.5 * erfc(sqrt(EbN0_lin));
Pb_QPSK_AWGN_theory = 0.5 * erfc(sqrt(EbN0_lin)); % Gray编码近似

% Rayleigh 信道
Pb_BPSK_Rayleigh_theory = 0.5 * (1 - sqrt(EbN0_lin./(1 + EbN0_lin)));
Pb_QPSK_Rayleigh_theory = 0.5 * (1 - sqrt(EbN0_lin./(1 + EbN0_lin)));

%% 蒙特卡洛仿真
Pb_BPSK_AWGN_sim = zeros(size(EbN0_dB));
Pb_QPSK_AWGN_sim = zeros(size(EbN0_dB));
Pb_BPSK_Rayleigh_sim = zeros(size(EbN0_dB));
Pb_QPSK_Rayleigh_sim = zeros(size(EbN0_dB));

for idx = 1:length(EbN0_dB)
    fprintf('正在仿真 SNR = %d dB...\n', EbN0_dB(idx));
    
    % 当前信噪比参数
    SNR_linear = EbN0_lin(idx);
    
    %% 1. BPSK - AWGN
    % 生成随机比特
    tx_bits = randi([0 1], 1, num_bits);
    % BPSK调制: 0->-1, 1->+1
    tx_symbols = 2*tx_bits - 1;
    
    % AWGN噪声
    noise_power = 1/(2*SNR_linear); % 对于BPSK,符号能量Es = Eb
    noise = sqrt(noise_power) * randn(1, num_bits);
    
    % 接收信号
    rx_symbols = tx_symbols + noise;
    
    % 解调:硬判决
    rx_bits = rx_symbols > 0;
    
    % 误码率计算
    Pb_BPSK_AWGN_sim(idx) = sum(rx_bits ~= tx_bits) / num_bits;
    
    %% 2. QPSK - AWGN
    % 生成随机比特(每2比特为一个符号)
    num_symbols = num_bits/2;
    tx_bits_qpsk = randi([0 1], 1, num_bits);
    
    % Gray编码映射
    % 00->(1+j)/√2, 01->(-1+j)/√2, 11->(-1-j)/√2, 10->(1-j)/√2
    tx_symbols_qpsk = zeros(1, num_symbols);
    for k = 1:num_symbols
        idx1 = 2*k-1;
        idx2 = 2*k;
        if tx_bits_qpsk(idx1) == 0 && tx_bits_qpsk(idx2) == 0
            tx_symbols_qpsk(k) = (1+1j)/sqrt(2);
        elseif tx_bits_qpsk(idx1) == 0 && tx_bits_qpsk(idx2) == 1
            tx_symbols_qpsk(k) = (-1+1j)/sqrt(2);
        elseif tx_bits_qpsk(idx1) == 1 && tx_bits_qpsk(idx2) == 1
            tx_symbols_qpsk(k) = (-1-1j)/sqrt(2);
        else % 10
            tx_symbols_qpsk(k) = (1-1j)/sqrt(2);
        end
    end
    
    % AWGN噪声(复噪声)
    noise_power_qpsk = 1/(2*SNR_linear); % QPSK符号能量Es = 2Eb
    noise_i = sqrt(noise_power_qpsk) * randn(1, num_symbols);
    noise_q = sqrt(noise_power_qpsk) * randn(1, num_symbols);
    noise_complex = noise_i + 1j*noise_q;
    
    % 接收信号
    rx_symbols_qpsk = tx_symbols_qpsk + noise_complex;
    
    % 解调:硬判决
    rx_bits_qpsk = zeros(1, num_bits);
    for k = 1:num_symbols
        % 判决区域
        real_part = real(rx_symbols_qpsk(k));
        imag_part = imag(rx_symbols_qpsk(k));
        
        if real_part >= 0 && imag_part >= 0
            rx_bits_qpsk(2*k-1) = 0;
            rx_bits_qpsk(2*k) = 0;
        elseif real_part < 0 && imag_part >= 0
            rx_bits_qpsk(2*k-1) = 0;
            rx_bits_qpsk(2*k) = 1;
        elseif real_part < 0 && imag_part < 0
            rx_bits_qpsk(2*k-1) = 1;
            rx_bits_qpsk(2*k) = 1;
        else % real_part >= 0 && imag_part < 0
            rx_bits_qpsk(2*k-1) = 1;
            rx_bits_qpsk(2*k) = 0;
        end
    end
    
    % 误码率计算
    Pb_QPSK_AWGN_sim(idx) = sum(rx_bits_qpsk ~= tx_bits_qpsk) / num_bits;
    
    %% 3. BPSK - Rayleigh衰落
    % Rayleigh衰落信道系数(复高斯,方差0.5每维)
    h = (randn(1, num_bits) + 1j*randn(1, num_bits))/sqrt(2);
    
    % 发送信号(能量归一化)
    tx_symbols_ray = 2*tx_bits - 1;
    
    % 通过Rayleigh信道
    rx_symbols_ray = h .* tx_symbols_ray;
    
    % 添加AWGN噪声
    noise_power_ray = 1/(2*SNR_linear);
    noise_ray = sqrt(noise_power_ray) * (randn(1, num_bits) + 1j*randn(1, num_bits))/sqrt(2);
    rx_symbols_ray_noisy = rx_symbols_ray + noise_ray;
    
    % 理想信道估计下的相干检测
    rx_symbols_ray_eq = rx_symbols_ray_noisy ./ h;
    
    % 解调:硬判决(取实部)
    rx_bits_ray = real(rx_symbols_ray_eq) > 0;
    
    % 误码率计算
    Pb_BPSK_Rayleigh_sim(idx) = sum(rx_bits_ray ~= tx_bits) / num_bits;
    
    %% 4. QPSK - Rayleigh衰落
    % Rayleigh衰落信道系数
    h_qpsk = (randn(1, num_symbols) + 1j*randn(1, num_symbols))/sqrt(2);
    
    % 通过Rayleigh信道
    rx_symbols_qpsk_ray = h_qpsk .* tx_symbols_qpsk;
    
    % 添加AWGN噪声
    noise_qpsk_ray = sqrt(noise_power_qpsk) * (randn(1, num_symbols) + 1j*randn(1, num_symbols))/sqrt(2);
    rx_symbols_qpsk_ray_noisy = rx_symbols_qpsk_ray + noise_qpsk_ray;
    
    % 理想信道估计下的相干检测
    rx_symbols_qpsk_ray_eq = rx_symbols_qpsk_ray_noisy ./ h_qpsk;
    
    % 解调:硬判决
    rx_bits_qpsk_ray = zeros(1, num_bits);
    for k = 1:num_symbols
        real_part = real(rx_symbols_qpsk_ray_eq(k));
        imag_part = imag(rx_symbols_qpsk_ray_eq(k));
        
        if real_part >= 0 && imag_part >= 0
            rx_bits_qpsk_ray(2*k-1) = 0;
            rx_bits_qpsk_ray(2*k) = 0;
        elseif real_part < 0 && imag_part >= 0
            rx_bits_qpsk_ray(2*k-1) = 0;
            rx_bits_qpsk_ray(2*k) = 1;
        elseif real_part < 0 && imag_part < 0
            rx_bits_qpsk_ray(2*k-1) = 1;
            rx_bits_qpsk_ray(2*k) = 1;
        else
            rx_bits_qpsk_ray(2*k-1) = 1;
            rx_bits_qpsk_ray(2*k) = 0;
        end
    end
    
    % 误码率计算
    Pb_QPSK_Rayleigh_sim(idx) = sum(rx_bits_qpsk_ray ~= tx_bits_qpsk) / num_bits;
end

%% 绘制结果
figure('Position', [100, 100, 1200, 800]);

% BPSK 对比
subplot(2,2,1);
semilogy(EbN0_dB, Pb_BPSK_AWGN_theory, 'b-', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, Pb_BPSK_AWGN_sim, 'bo', 'MarkerSize', 8);
semilogy(EbN0_dB, Pb_BPSK_Rayleigh_theory, 'r-', 'LineWidth', 2);
semilogy(EbN0_dB, Pb_BPSK_Rayleigh_sim, 'rs', 'MarkerSize', 8);
grid on; xlabel('E_b/N_0 (dB)'); ylabel('误码率 (BER)');
title('BPSK: AWGN vs Rayleigh 信道');
legend('AWGN理论', 'AWGN仿真', 'Rayleigh理论', 'Rayleigh仿真', 'Location', 'southwest');
ylim([1e-6, 1]);

% QPSK 对比
subplot(2,2,2);
semilogy(EbN0_dB, Pb_QPSK_AWGN_theory, 'b-', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, Pb_QPSK_AWGN_sim, 'bo', 'MarkerSize', 8);
semilogy(EbN0_dB, Pb_QPSK_Rayleigh_theory, 'r-', 'LineWidth', 2);
semilogy(EbN0_dB, Pb_QPSK_Rayleigh_sim, 'rs', 'MarkerSize', 8);
grid on; xlabel('E_b/N_0 (dB)'); ylabel('误码率 (BER)');
title('QPSK: AWGN vs Rayleigh 信道');
legend('AWGN理论', 'AWGN仿真', 'Rayleigh理论', 'Rayleigh仿真', 'Location', 'southwest');
ylim([1e-6, 1]);

% AWGN信道下BPSK与QPSK对比
subplot(2,2,3);
semilogy(EbN0_dB, Pb_BPSK_AWGN_theory, 'b-', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, Pb_BPSK_AWGN_sim, 'bo', 'MarkerSize', 8);
semilogy(EbN0_dB, Pb_QPSK_AWGN_theory, 'r-', 'LineWidth', 2);
semilogy(EbN0_dB, Pb_QPSK_AWGN_sim, 'rs', 'MarkerSize', 8);
grid on; xlabel('E_b/N_0 (dB)'); ylabel('误码率 (BER)');
title('AWGN信道: BPSK vs QPSK');
legend('BPSK理论', 'BPSK仿真', 'QPSK理论', 'QPSK仿真', 'Location', 'southwest');
ylim([1e-6, 1]);

% Rayleigh信道下BPSK与QPSK对比
subplot(2,2,4);
semilogy(EbN0_dB, Pb_BPSK_Rayleigh_theory, 'b-', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, Pb_BPSK_Rayleigh_sim, 'bo', 'MarkerSize', 8);
semilogy(EbN0_dB, Pb_QPSK_Rayleigh_theory, 'r-', 'LineWidth', 2);
semilogy(EbN0_dB, Pb_QPSK_Rayleigh_sim, 'rs', 'MarkerSize', 8);
grid on; xlabel('E_b/N_0 (dB)'); ylabel('误码率 (BER)');
title('Rayleigh信道: BPSK vs QPSK');
legend('BPSK理论', 'BPSK仿真', 'QPSK理论', 'QPSK仿真', 'Location', 'southwest');
ylim([1e-6, 1]);

sgtitle('BPSK/QPSK在不同信道下的误码率性能比较');

%% 性能差异量化分析
fprintf('\n========== 性能差异分析 ==========\n');
fprintf('在 AWGN 信道下:\n');
fprintf('  理论: BPSK 与 QPSK 误码率相同 (Gray编码近似)\n');
fprintf('  仿真: BPSK BER@10dB = %.2e, QPSK BER@10dB = %.2e\n', ...
    Pb_BPSK_AWGN_sim(EbN0_dB==10), Pb_QPSK_AWGN_sim(EbN0_dB==10));

fprintf('\n在 Rayleigh 信道下:\n');
fprintf('  理论: BPSK 与 QPSK 误码率相同\n');
fprintf('  仿真: BPSK BER@10dB = %.2e, QPSK BER@10dB = %.2e\n', ...
    Pb_BPSK_Rayleigh_sim(EbN0_dB==10), Pb_QPSK_Rayleigh_sim(EbN0_dB==10));

% 计算性能损失(Rayleigh vs AWGN)
fprintf('\nRayleigh衰落导致的性能损失 (BER=1e-3时所需Eb/N0增加量):\n');
% 插值找到BER=1e-3对应的Eb/N0
target_BER = 1e-3;

% BPSK AWGN
idx_bpsk_awgn = find(Pb_BPSK_AWGN_theory <= target_BER, 1);
if ~isempty(idx_bpsk_awgn)
    EbN0_bpsk_awgn = EbN0_dB(idx_bpsk_awgn);
else
    EbN0_bpsk_awgn = interp1(log10(Pb_BPSK_AWGN_theory), EbN0_dB, log10(target_BER));
end

% BPSK Rayleigh
idx_bpsk_ray = find(Pb_BPSK_Rayleigh_theory <= target_BER, 1);
if ~isempty(idx_bpsk_ray)
    EbN0_bpsk_ray = EbN0_dB(idx_bpsk_ray);
else
    EbN0_bpsk_ray = interp1(log10(Pb_BPSK_Rayleigh_theory), EbN0_dB, log10(target_BER));
end

fprintf('  BPSK: AWGN需要 %.1f dB, Rayleigh需要 %.1f dB, 损失 = %.1f dB\n', ...
    EbN0_bpsk_awgn, EbN0_bpsk_ray, EbN0_bpsk_ray - EbN0_bpsk_awgn);

三、理论公式详细推导

3.1 AWGN 信道下 BPSK 误码率推导

对于 BPSK,发送信号为:

接收信号:

判决变量:

误码概率:

其中


3.2 AWGN 信道下 QPSK 误码率推导

QPSK 符号可表示为:

其中

同相和正交支路相互独立,每支路相当于一个 BPSK:

对于 Gray 编码,符号错误时通常只有 1 比特错误,因此:

精确符号错误率:


3.3 Rayleigh 信道下 BPSK 误码率推导

接收信号:

其中 服从 Rayleigh 分布。

瞬时信噪比:

的概率密度函数(指数分布):

其中

条件误码率:

平均误码率:


3.4 Rayleigh 信道下 QPSK 误码率推导

类似地,每个正交支路的条件误码率:

平均比特误码率:

与 BPSK 相同。


四、性能对比表格

调制方式 信道类型 理论 BER 公式 BER=10⁻³ 所需 BER=10⁻⁶ 所需
BPSK AWGN 6.8 dB 10.5 dB
BPSK Rayleigh 24.0 dB 44.0 dB
QPSK AWGN 6.8 dB 10.5 dB
QPSK Rayleigh 24.0 dB 44.0 dB

关键观察

  1. 在 AWGN 信道下,BPSK 和 QPSK(Gray编码)具有相同的比特误码率性能
  2. 在 Rayleigh 衰落信道下,BPSK 和 QPSK 的比特误码率也相同
  3. Rayleigh 衰落导致严重的性能损失(约 17-33 dB),需要更高的 来达到相同 BER

五、扩展分析:频率选择性 Rayleigh 信道

对于频率选择性 Rayleigh 信道(多径),误码率公式更复杂。假设 L 条独立路径,采用最大比合并(MRC):

5.1 BPSK 在频率选择性 Rayleigh 信道

其中

5.2 MATLAB 代码扩展

%% 频率选择性Rayleigh信道(多径)下的误码率
L = 2; % 路径数
Pb_BPSK_MRC_theory = zeros(size(EbN0_lin));

for i = 1:length(EbN0_lin)
    gamma_bar = EbN0_lin(i);
    mu = sqrt(gamma_bar/(1+gamma_bar));
    
    % 计算MRC误码率
    sum_term = 0;
    for k = 0:L-1
        sum_term = sum_term + nchoosek(L-1+k, k) * ((1+mu)/2)^k;
    end
    Pb_BPSK_MRC_theory(i) = ((1-mu)/2)^L * sum_term;
end

figure;
semilogy(EbN0_dB, Pb_BPSK_AWGN_theory, 'b-', 'LineWidth', 2); hold on;
semilogy(EbN0_dB, Pb_BPSK_Rayleigh_theory, 'r-', 'LineWidth', 2);
semilogy(EbN0_dB, Pb_BPSK_MRC_theory, 'g-', 'LineWidth', 2);
grid on; xlabel('E_b/N_0 (dB)'); ylabel('误码率 (BER)');
title('BPSK在不同信道下的误码率');
legend('AWGN', '平坦Rayleigh (L=1)', sprintf('频率选择性Rayleigh (MRC, L=%d)', L), 'Location', 'southwest');
ylim([1e-6, 1]);

参考代码 基于matlab/simulink的bpsk,qpsk经过白噪声信道和rayleigh多径误码率在不同信噪比下的计算 www.youwenfan.com/contentcsv/79103.html

六、工程应用建议

  1. AWGN 信道:BPSK 和 QPSK 性能相同,但 QPSK 频谱效率是 BPSK 的两倍

  2. Rayleigh 平坦衰落:需要采用分集技术(时间/频率/空间分集)来对抗衰落

  3. 实际系统设计

    • 低 SNR 环境:优先使用 BPSK(更鲁棒)
    • 高 SNR 环境:使用 QPSK 提高频谱效率
    • 衰落信道:必须结合信道编码(如卷积码、LDPC、Turbo码)和交织
  4. 性能评估:仿真时需确保足够的蒙特卡洛样本数(BER=10⁻⁶ 需要至少 10⁸ 个比特)


七、总结

  1. AWGN 信道:BPSK 和 QPSK 的比特误码率理论公式相同,均为
  2. Rayleigh 平坦衰落:BPSK 和 QPSK 的比特误码率也相同,为
  3. Rayleigh 衰落导致显著性能损失:在 BER=10⁻³ 时,相比 AWGN 需要增加约 17 dB 的
  4. 实际系统:在衰落信道中,必须采用分集、信道编码和交织等技术来改善性能

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