欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QPSK调制与解调-MATLAB基带仿真

程序员文章站 2022-07-02 22:42:28
...

QPSK调制与解调-MATLAB基带仿真

原始发送数据:随机产生长度为L的0、1序列
QPSK调制方式:格雷码排布
若使用非格雷码排布,误比特率会升高,对误符号率无影响。
QPSK发送端星座图:
QPSK调制与解调-MATLAB基带仿真
QPSK相干解调
MAP准则:判决为与接收信号距离最近的星座点
QPSK理论误符号率:

Pe=2Q(2EbN0)[112Q(2EbN0)]P_e=2Q(\sqrt{\frac{2 \mathcal{E}_{b}}{N_{0}}})\left[1-\frac{1}{2} Q(\sqrt{\frac{2 \mathcal{E}_{b}}{N_{0}}})\right]

仿真结果
QPSK调制与解调-MATLAB基带仿真

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理论误符号率');   % 图例