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

情到浓时终转凉″ 提交于 2020-01-22 06:19:43

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

原始发送数据:随机产生长度为L的0、1序列
QPSK调制方式:格雷码排布
若使用非格雷码排布,误比特率会升高,对误符号率无影响。
QPSK发送端星座图:
在这里插入图片描述
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]

仿真结果
在这里插入图片描述

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理论误符号率');   % 图例
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!