QPSK调制与解调-MATLAB基带仿真
原始发送数据:随机产生长度为L的0、1序列
QPSK调制方式:格雷码排布
若使用非格雷码排布,误比特率会升高,对误符号率无影响。
QPSK发送端星座图:
QPSK相干解调:
MAP准则:判决为与接收信号距离最近的星座点
QPSK理论误符号率:
仿真结果:
MATLAB基带仿真程序:
clc
clear
close all
% Title: QPSK调制与解调 %
% Data: 2019.03.28 %
% Author: K.X.Song %
M = 4; % 调制阶数
L_data = 5000000; % 数据长度
L_symbol = L_data/log2(M); % 符号长度
data = round(rand(1,L_data)); % 原始数据
EbN0_dB = 0:12; % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10); % Eb/N0
Eb = 1/log2(M); % 每比特能量
N0 = Eb ./ EbN0; % 噪声功率
error = zeros(1,length(EbN0_dB)); % 预置错误符号个数
ser = zeros(1,length(EbN0_dB)); % 预置仿真误符号率
tser_BPSK = zeros(1,length(EbN0_dB)); % 预置BPSK理论误符号率
tser_QPSK = zeros(1,length(EbN0_dB)); % 预置QPSK理论误符号率
% QPSK调制(格雷码排布)
send = zeros(1,L_data/2); % 预设发送信号
send_set = [1,1j,-1,-1j]; % 发射端星座点
for q = 1:L_symbol
if (data(2*q-1:2*q) == [0,0])
send(q) = send_set(1); % 00 => 1
elseif (data(2*q-1:2*q) == [0,1])
send(q) = send_set(2); % 01 => 1j
elseif (data(2*q-1:2*q) == [1,1])
send(q) = send_set(3); % 11 => -1
else
send(q) = send_set(4); % 10 => -1j
end
end
for q = 1:length(EbN0_dB)
noise = sqrt(N0(q)/2)*randn(1,L_symbol) + 1j*sqrt(N0(q)/2)*randn(1,L_symbol); % AWGN
receive = send + noise; % 接收信号
detect = zeros(1,L_symbol); % 预置检测信号
distance = zeros(1,M); % 解调:距离检测
for t = 1:L_symbol
for w = 1:M
distance(w) = norm(receive(t) - send_set(w))^2; % 接收信号到所有星座点的距离
end
pos = find(distance == min(distance)); % 最小距离星座点的位置
detect(t) = send_set(pos); % 解调后的符号
if (detect(t) ~= send(t))
error(q) = error(q) + 1; % 统计错误符号数
end
end
ser(q) = error(q)/L_symbol; % QPSK仿真误符号率
tser_BPSK(q) = qfunc(sqrt(2*EbN0(q))); % BPSK理论误比特率
tser_QPSK(q) = 2*qfunc(sqrt(2*EbN0(q)))*(1-qfunc(sqrt(2*EbN0(q)))/2); % QPSK理论误符号率
end
figure
semilogy(EbN0_dB,ser,'o',EbN0_dB,tser_BPSK,'k',EbN0_dB,tser_QPSK,'b'); % 画图
grid on; % 坐标轴开启
axis([0 10 10^-5 10^-1]) % 限制作图范围
xlabel('Eb/N0 (dB)'); % 横坐标
ylabel('SER'); % 纵坐标
legend('QPSK仿真误符号率','BPSK理论误符号率','QPSK理论误符号率'); % 图例
来源:CSDN
作者:K.X. Song
链接:https://blog.csdn.net/HIT_CRC_SKX/article/details/104063832