本博客环境为Matlab2018 ,软件版本不同可能会有些出入,需要稍作修改。
QPSK调制与解调
仿真要求:
画出QPSK信号产生的信息、I路、Q路信号对比图以及接收端解调的I路,Q 路,信息恢复的对比图。
代码如下:
clear all;clc;
N=20; % 输入的比特
T=1; % 比特周期
fc=2; % 载波频率
Fs=100; % 采样频率
bitstream=randi([0,1],1,N); % 随机产生的比特流
bitstream= 2*bitstream-1; % 0 to -1; 1 to 1 单极性变成双极性
I=[];Q=[];
for i=1:N
if mod(i,2)~=0
I=[I,bitstream(i)]; %寄数路数据
else
Q=[Q,bitstream(i)]; %偶数路数据
end
end
% using plot to compare bitsteam, I, Q
bit_data=[];
for i=1:N %一个周期100个点
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
% plot
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 Bitstream') % I路
subplot(3,1,3)
plot(t,Q_data);legend('Q Bitstream') % Q路
% carrier signal
bit_t=0:1/Fs:2*T-1/Fs; %时间戳
I_carrier=[];Q_carrier=[]; %载波信号
for i= 1:N/2
I_carrier=[I_carrier,I(i)*cos(2*pi*fc*bit_t)];
Q_carrier=[Q_carrier,Q(i)*cos(2*pi*fc*bit_t+pi/2)];
end
% transmit signal
QPSK_signal=I_carrier+Q_carrier; %I路信号与Q路信号的和
% plot
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') %两信号的和
snr=1; % signal to noise rate信噪比
% Receive singal
QPSK_receive= awgn(QPSK_signal,snr); %接收端=原来的信号+噪声
% 恢复信号
for i=1:N/2
I_output=QPSK_receive(1 ,(i-1)*length(bit_t)+1:i*length(bit_t)).*cos(2*pi*fc*bit_t);
if sum(I_output)>0
I_recover(i)= 1;
else
I_recover(i)=-1;
end
Q_output=QPSK_receive(1,(i-1)*length(bit_t)+1:i*length(bit_t)).*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
% using plot to compare bitsteam, I, Q
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
% plot
figure();
t=0:1/Fs:N*T-1/Fs;
subplot(3,1,2)
plot(t,I_recover_data);legend('I Bitstream')
subplot(3,1,3)
plot(t,Q_recover_data);legend('Q Bitstream')
subplot(3,1,1)
plot(t,recover_data);legend('Bitstream')
仿真结果如下所示:
因为比特流是随机产生的,各自运行结果应稍有出入。