前言
本例对QPSK通信系统进行建模仿真,使用awgn信道,通过设置不同的SNR得到误码率和误比特率性能曲线。
由于QPSK通信系统属于数字通信系统,所以噪声功率一般使用Eb/No进行衡量,但awgn函数只能使用SNR设置噪声功率,所以仿真中需要将将Eb/No转换成了SNR。
最后给出了仿真性能和理论性能曲线的对比。
一、仿真代码
代码如下:
clc
close all
clear all
%% 初始化
M = 4; % 调制阶数,QPSK调制阶数=4
k = log2(M); % 每个QPSK符号包含的比特数,也称调制率
SamplesPerFrame = 10000; % 每次迭代处理的符号数
% 仿真停止条件
maxNumErrs = 100;
maxNumBits = 1e8;
graycode = [0 1 3 2]; % Gray编码映射关系
% 为了使仿真结果具有可重复性,设置随机数
s = RandStream.create('mt19937ar', 'seed',26854);
prevStream = RandStream.setGlobalStream(s);
%% 仿真循环
EbNodBVec = 0:2:12; % Eb/No ,单位dB
SERVec = zeros(size(EbNodBVec)); % 初始化误码率SER向量,向量中的每个值对应一个EbNo
BERVec = zeros(size(EbNodBVec)); % 初始化误比特率BER向量,向量中的每个值对应一个EbNo
for p = 1:length(EbNodBVec)
awgnChannel.EbNo = EbNodBVec(p);
snr = EbNodBVec(p) + 10*log10(k);
% 清零SER / BER,用于当前Eb/No值
SER = zeros(3,1); % Symbol Error Rate 三个值分别为:错误率,错误数,总数
BER = zeros(3,1); % Bit Error Rate
bit_err = 0;
bit_num = 0;
sym_err = 0;
sym_num = 0;
while (bit_err<maxNumErrs) && (bit_num<maxNumBits)
% 生成随机符号
dataIn = randi([0 3],SamplesPerFrame,1);
dataIngray = graycode(dataIn+1)'; %进行Gray编码影射
% QPSK调制
txSig = pskmod(dataIngray,4,0);
% txSig = pskmod(dataIngray,4,0,'gray'); % 这行代码与上面两行等效
% 调制信号经过awgn信道(加高斯白噪声)
rxSig = awgn(txSig,snr,'measured');
% 对接收信号进行解调
dataOutgray = pskdemod(rxSig,4,0); % QPSK解调
dataOut = graycode(dataOutgray+1)'; % 进行Gray解码影射
% dataOut = pskdemod(rxSig,4,0, 'gray'); % 这行代码与上面两行等效
% 统计错误比特数
[number, BER_w] = biterr(dataIn, dataOut, log2(M)); % 计算BER
bit_err = bit_err + number;
bit_num = bit_num + SamplesPerFrame*k;
% 统计错误符号数
[nSymbol, SER_w] = symerr(dataIn, dataOut); % 计算SER
sym_err = sym_err + nSymbol;
sym_num = sym_num + SamplesPerFrame;
end
% 保存历史SER和BER
SERVec(p) = sym_err / sym_num;
BERVec(p) = bit_err / bit_num;
end
%% Cleanup
% 恢复默认流
RandStream.setGlobalStream(prevStream);
%% 误码率和误比特率的理论值
theorBER = berawgn(EbNodBVec,'psk',M,'nondiff');
theorSER = 2 .* theorBER; % 基于Gray码
%% 结果画图
figure();
semilogy(EbNodBVec,SERVec,'o', EbNodBVec,BERVec,'*', ...
EbNodBVec,theorSER,'b-', EbNodBVec,theorBER,'r-');
legend('Symbol error rate', 'Bit error rate', ...
'Theoretical Symbol error rate', 'Theoretical Bit error rate', ...
'Location','SouthWest');
xlabel('Eb/No (dB)');
ylabel('Error Probability');
title('QPSK:误码率和误比特率');
grid on;
二、Eb/N0和SNR关系
三、仿真结果
QPSK性能仿真曲线如下:
后续
关于QPSK的理论BER和理论SER的实现,将在下一篇文章中给出。