一、理论公式推导(闭式解)
1.1 AWGN 信道下的理论误码率
BPSK (AWGN)
QPSK (AWGN)
- 符号错误率:
- 比特错误率(Gray 编码):
注意:
是每比特能量与噪声功率谱密度之比,对于 QPSK, 。
1.2 Rayleigh 平坦衰落信道下的理论误码率
BPSK (Rayleigh)
其中
QPSK (Rayleigh)
- 比特错误率(Gray 编码):
- 符号错误率:
二、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 误码率推导
接收信号:
其中
瞬时信噪比:
其中
条件误码率:
平均误码率:
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 |
关键观察:
- 在 AWGN 信道下,BPSK 和 QPSK(Gray编码)具有相同的比特误码率性能
- 在 Rayleigh 衰落信道下,BPSK 和 QPSK 的比特误码率也相同
- 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
六、工程应用建议
-
AWGN 信道:BPSK 和 QPSK 性能相同,但 QPSK 频谱效率是 BPSK 的两倍
-
Rayleigh 平坦衰落:需要采用分集技术(时间/频率/空间分集)来对抗衰落
-
实际系统设计:
- 低 SNR 环境:优先使用 BPSK(更鲁棒)
- 高 SNR 环境:使用 QPSK 提高频谱效率
- 衰落信道:必须结合信道编码(如卷积码、LDPC、Turbo码)和交织
-
性能评估:仿真时需确保足够的蒙特卡洛样本数(BER=10⁻⁶ 需要至少 10⁸ 个比特)
七、总结
- AWGN 信道:BPSK 和 QPSK 的比特误码率理论公式相同,均为
- Rayleigh 平坦衰落:BPSK 和 QPSK 的比特误码率也相同,为
- Rayleigh 衰落导致显著性能损失:在 BER=10⁻³ 时,相比 AWGN 需要增加约 17 dB 的
- 实际系统:在衰落信道中,必须采用分集、信道编码和交织等技术来改善性能