文章目录
- 前言
- 一、MATLAB仿真代码
- 二、仿真结果
前言
QPSK信号在AWGN和Rayleigh衰落信道下的性能仿真MATLAB代码。
一、MATLAB仿真代码
代码如下:
nSamp = 8; % 矩形脉冲的采样点数
nSymbol = 1000000; % 传输的符号数
ts = 1/(nSymbol*nSamp); % samples的时间序列
% t = (0:nSymbol*nSamp-1)*ts;
M = 4; % QPSK的调制阶数
k = log2(M); % 每个QPSK符号包含的比特数
SNR = -3:5; % 传输矩形脉冲成形信号,使用SNR (dB)
graycode = [0 1 3 2]; % Gray编码映射表
BER_g = zeros(size(SNR)); % 初始化AWGN信道BER向量
SER_g = zeros(size(SNR)); % 初始化AWGN信道SER向量
BER_r = zeros(size(SNR)); % 初始化Rayleigh衰落信道BER向量
SER_r = zeros(size(SNR)); % 初始化Rayleigh衰落信道SER向量
% 生成Rayleigh衰落信道
fd = 10; % 最大多普勒频率,单位Hz
sinNum = 10; % 正弦波的数量
h = Jakes_Rayleigh(fd, sinNum, ts, nSymbol*nSamp); % 生成Rayleigh衰落
%% QPSK信道仿真
for p=1:length(SNR)
msg = randi([0 M-1], 1, nSymbol); % 生成随机符号
msg_gr = graycode(msg+1); % Gray编码映射
msg_tx = pskmod(msg_gr, M); % QPSK调制
msg_tx = rectpulse(msg_tx, nSamp); % 矩形脉冲成形(插相同的值)
% 使用AWGN信道
msg_rx = awgn(msg_tx, SNR(p), 'measured'); % 未衰落信号通过AWGN信道
msg_rx_down = intdump(msg_rx, nSamp); % 未衰落信号匹配滤波相干解调,intdump函数在一个符号周期内对信号msg_rx取平均值
msg_gr_demod = pskdemod(msg_rx_down, M); % QPSK解调
msg_demod = graycode(msg_gr_demod+1); % Gray编码逆映射
[~, BER_g(p)] = biterr(msg, msg_demod, k); % 计算BER
[~, SER_g(p)] = symerr(msg, msg_demod); % 计算SER
msg_tx1 = h .* msg_tx; % 信号通过Rayleigh衰落信道
msg_rx1 = awgn(msg_tx1, SNR(p), 'measured'); % 衰落信号通过AWGN信道
msg_rx_down1 = intdump(msg_rx1,nSamp); % 衰落信号匹配滤波相干解调
msg_gr_demod1 = pskdemod(msg_rx_down1,M); % QPSK解调
msg_demod1 = graycode(msg_gr_demod1+1); % Gray编码逆映射
[~, BER_r(p)] = biterr(msg,msg_demod1,k); % 计算BER
[~, SER_r(p)] = symerr(msg, msg_demod1); % 计算SER
end
%% 画图
figure()
semilogy(SNR,BER_g,'b-o',SNR,SER_g,'b-*',SNR,BER_r,'r-d',SNR,SER_r,'r-x')
grid on
legend('AWGN信道BER','AWGN信道SER', ...
'Rayleigh+AWGN信道BER','Rayleigh+AWGN信道SER', ...
'Location','southwest')
title('QPSK在AWGN和Rayleigh衰落信道下的性能')
xlabel('信噪比(dB)')
ylabel('误比特率和误符号率')