QPSK调制解调仿真matlab

QPSK是MPSK的一种,对于理解MPSK有着很大的帮助。
在理解MPSK中,有以下几个难点:

  1. 什么是串并转换
  2. 如何把QPSK转换成两路2PSK信号
  3. 解调时如何判决

下面给出我结合全网与自己的理解的QPSK调制解调的代码
此代码仿真了QPSK的调制解调过程

clear;
clc;

N = 20;       %比特数
T = 1;        %比特周期
fc = 2;       %载波频率
Fs = 100;     %抽样频率
bitstream = randi([0,1], 1, N); %随机产生的比特数01
bitstream = 2*bitstream-1;      %单极性变为双极性(0-111)

I=[]; Q=[];
for i=1:N
    if mod(i, 2)~=0
        I = [I, bitstream(i)];
    else
        Q = [Q, bitstream(i)];
    end
end

%% 绘图比较I、Q比特流
bit_data=[];
for i=1:N
    bit_data = [bit_data, bitstream(i)*ones(1, T*Fs)]; end
I_data=[];
Q_data=[];
for i=1:N/2
    I_data = [I_data, I(i)*ones(1, T*Fs*2)];
    Q_data = [Q_data, Q(i)*ones(1, T*Fs*2)];
end

figure();
t = 0:(1/Fs):(N*T-1/Fs);
subplot(3, 1, 1)
plot(t, bit_data);  legend('Bitstream比特信息')    %比特信息
subplot(3, 1, 2)
plot(t,I_data);     legend('I BitstreamI路信息')    %I路信息
subplot(3, 1, 3)
plot(t, Q_data);    legend('Q BitstreamQ路信息')    %Q路信息

%% 载波信号
bit_t = 0:(1/Fs):(2*T-1/Fs);    %载波周期为2倍比特周期,定义时间轴
I_carrier = []; 
Q_carrier = [];
for i = 1:N/2
    I_carrier = [I_carrier, I(i)*cos(2*pi*fc*bit_t)];       %I路载波信号
    Q_carrier = [Q_carrier, Q(i)*cos(2*pi*fc*bit_t+pi/2)];  %Q路载波信号
end
QPSK_signal = I_carrier + Q_carrier;

figure();
subplot(3, 1, 1)
plot(t, I_carrier);     legend('I signal')        %I路信号
subplot(3, 1, 2)
plot(t, Q_carrier);     legend('Q signal')        %Q路信号
subplot(3, 1, 3)
plot(t, QPSK_signal);   legend('QPSK signal')     %I路、Q路和的信号

%% 通过信道传输
snr = 1;
QPSK_receive = awgn(QPSK_signal, snr);

%% 解调
I_recover = zeros(1, N/2);
Q_recover = zeros(1, N/2);
for i = 1:N/2
    idx = (i-1)*length(bit_t) + 1:i*length(bit_t);
    %I路
    I_output = QPSK_receive(1, idx).*cos(2*pi*fc*bit_t);
    if sum(I_output)>0 
        I_recover(i) = 1;
    else
        I_recover(i) = -1;
    end
    %Q路
    Q_output = QPSK_receive(1, idx).*cos(2*pi*fc*bit_t+ pi/2);
    if sum(Q_output)>0
        Q_recover(i) = 1;
    else
        Q_recover(i) = -1;
    end
end

%%/串变换
bit_recover = [];
for i=1:N
    if mod(i,2)~=0
        bit_recover = [bit_recover, I_recover((i-1)/2+1)];  %奇数取I路信息
    else
        bit_recover = [bit_recover, Q_recover(i/2)];        %偶数取Q路信息
    end
end

%% 生成码字波形
recover_data = [];
for i = 1:N
    recover_data = [recover_data, bit_recover(i)*ones(1, T*Fs)];
end

I_recover_data = [];
Q_recover_data = [];
for i = 1:N/2
    I_recover_data = [I_recover_data, I_recover(i)*ones(1, T*Fs*2)];
    Q_recover_data = [Q_recover_data, Q_recover(i)*ones(1, T*Fs*2)];
end

figure();
t=0:(1/Fs):(N*T-1/Fs);
subplot(3, 1, 1)
plot(t, recover_data);   legend('Bitstream')     %恢复的比特信息
subplot(3, 1, 2)
plot(t, I_recover_data); legend('I Bitstream')   %恢复的I路信息
subplot(3, 1, 3)
plot(t, Q_recover_data); legend('Q Bitstream')   %恢复的Q路信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述