在数字通信系统设计中,QPSK(Quadrature Phase Shift Keying,正交相移键控)是一种广泛应用的调制技术。它通过改变载波相位来传递信息,每个符号可以携带2比特信息,具有较高的频谱效率。本次仿真旨在分析QPSK调制信号通过AWGN(Additive White Gaussian Noise,加性高斯白噪声)信道时的误码性能。
关键指标:误符号率(SER)反映整体符号错误概率,误比特率(BER)则体现实际信息传输的可靠性。两者关系密切但数值不同,特别是在采用Gray编码时,BER≈SER/2。
仿真环境采用MATLAB R2021b,主要利用其通信工具箱中的qammod/qamdemod函数实现调制解调。相比手动实现,这些内置函数不仅简化了代码,还确保了算法实现的准确性。不过要特别注意参数设置,比如'UnitAveragePower'必须设为true以保证星座图功率归一化。
matlab复制%% 参数设置
N_symbols = 1e5; % 传输符号数
EbN0_dB = 0:2:12; % 信噪比范围(dB)
M = 4; % QPSK调制阶数
matlab复制%% 生成二进制序列
data_bits = randi([0 1], N_symbols*log2(M), 1); % 随机比特流
%% Gray编码映射
reshape_bits = reshape(data_bits, 2, [])';
gray_code = bi2de(reshape_bits, 'left-msb');
symbols = qammod(gray_code, M, 'UnitAveragePower', true, 'PlotConstellation', false);
Gray编码的核心优势在于:相邻星座点只有1个比特不同。这能显著降低误符号导致的误比特数。QPSK的典型Gray映射关系为:
实测技巧:手动实现映射时,注意归一化因子√2。使用qammod函数时,务必设置'UnitAveragePower',true以保证平均符号能量为1。
matlab复制%% 信噪比转换
EsN0_dB = EbN0_dB + 10*log10(log2(M)); % 符号信噪比转换
关键公式推导:
这是最易出错的环节之一。若直接使用EbN0_dB作为awgn函数输入,会导致噪声功率计算错误,仿真曲线将与理论值严重偏离。
matlab复制for i = 1:length(EsN0_dB)
% 过信道
rx_signal = awgn(symbols, EsN0_dB(i), 'measured');
% 解调
rx_gray = qamdemod(rx_signal, M, 'UnitAveragePower', true);
rx_bits = de2bi(rx_gray, 'left-msb');
rx_bits = rx_bits(:);
% 误码统计
ser(i) = sum(rx_gray ~= gray_code) / N_symbols;
ber(i) = sum(rx_bits ~= data_bits) / length(data_bits);
end
awgn函数使用要点:
matlab复制%% 理论值计算
EbN0_linear = 10.^(EbN0_dB/10);
theory_ber = 0.5*erfc(sqrt(EbN0_linear)); % QPSK理论误比特率
theory_ser = erfc(sqrt(EbN0_linear)) - 0.25*erfc(sqrt(EbN0_linear)).^2; % 理论误符号率
理论推导基础:
matlab复制%% 画图
figure
semilogy(EbN0_dB, ber, 'bo', 'DisplayName','仿真BER');
hold on
semilogy(EbN0_dB, theory_ber, 'b-', 'DisplayName','理论BER');
semilogy(EbN0_dB, ser, 'rs', 'DisplayName','仿真SER');
semilogy(EbN0_dB, theory_ser, 'r-', 'DisplayName','理论SER');
xlabel('Eb/N0 (dB)'); ylabel('误码率');
legend; grid on;
典型仿真结果特征:
曲线偏离理论值:
低信噪比区域波动大:
BER与SER关系异常:
matlab复制parfor i = 1:length(EsN0_dB)
% 并行处理不同SNR点
end
对于大量符号的仿真,使用并行循环可显著缩短运行时间。
matlab复制% 升余弦滤波器示例
filterCoeffs = rcosdesign(0.35, 6, 4);
filteredSignal = upfirdn(symbols, filterCoeffs, 4);
添加脉冲成型可更真实模拟基带传输,但会大幅增加计算复杂度。
实际系统中,符号定时误差会导致采样时刻偏移,引入额外误码。仿真时可添加定时抖动模型:
matlab复制% 添加定时误差
time_offset = 0.1; % 符号周期的10%
rx_signal = rx_signal(1+round(time_offset*sps):end);
频率偏差会造成星座图旋转,需在解调前进行频偏估计与补偿:
matlab复制% 粗略频偏估计
freq_offset = mean(diff(unwrap(angle(rx_signal))))/(2*pi);
rx_signal = rx_signal .* exp(-1j*2*pi*freq_offset*(1:length(rx_signal))');
本地振荡器的相位噪声可用Wiener过程模拟:
matlab复制phase_noise = cumsum(0.01*randn(size(rx_signal)));
rx_signal = rx_signal .* exp(1j*phase_noise);
这些实际因素都会使实测性能略差于理想AWGN信道下的理论值。