Matlab-QPSK调制与解调 QPSK信号产生的信息、I路、Q路信号对比图以及接收端解调的I路,Q 路,信息恢复的对比图

本博客环境为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')

仿真结果如下所示:
因为比特流是随机产生的,各自运行结果应稍有出入。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44436677/article/details/106537747
今日推荐