QPSK调制解调仿真matlab
QPSK是MPSK的一种,对于理解MPSK有着很大的帮助。
在理解MPSK中,有以下几个难点:
- 什么是串并转换
- 如何把QPSK转换成两路2PSK信号
- 解调时如何判决
下面给出我结合全网与自己的理解的QPSK调制解调的代码
此代码仿真了QPSK的调制解调过程
clear;
clc;
N = 20; %比特数
T = 1; %比特周期
fc = 2; %载波频率
Fs = 100; %抽样频率
bitstream = randi([0,1], 1, N); %随机产生的比特数0、1
bitstream = 2*bitstream-1; %单极性变为双极性(0到-1;1到1)
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路信息