西安电子科技大学B测 QPSK已调信号生成实验

一 实验题目

在MATLAB环境中生成基本QPSK已调信号,从时域与频域观测基带信号与已调信号。

1.基带信号为周期127bits伪随机序列,信息比特速率:20kbps,载波频率:20kHz(速率及频率参数现场可调整);

2.在MATLAB环境中编写M代码搭建QPSK调制系统模型;

3.观测基带时域波形、已调信号时域波形;

4.观测基带发射星座图;

5.观测已调信号的功率谱(优先)或频谱;

6.分析观测结果并完成实验报告。

二 实现代码

%2^7-1个伪随机码,载波频率为20KHz,利用MATLAB画出QPSK调制波形的频谱图和星座图,其中码元速率为20kbps
function [] = btest()
%% 生成伪随机码
pngen = commsrc.pn('NumBitsOut',128); % 创建伪随机噪声发生包
xulie = generate(pngen); % 生成伪随机序列
fm = 20; % 波特率20kHz 一个信号码元有两种状态:0或1,每种状态含一位二进制数,比特率值=波特率值
total =128; % 采样次数
fs=fm*total;  %采样频率
N = total*length(xulie); % 总采样点个数
dt=1/fs; % 时域采样间隔
T = N*dt; % 截断时间
t = linspace(0,T,N); % 时域横坐标
%% 生成两路调制信号
NRZ = [];           %并行信号
NRZ_0 = [];          %采样后的第一路串行信号
nrz_0 = [];         %采样前的第一路串行信号
NRZ_1 = [];          %采样后的第二路串行信号
nrz_1 = [];         %采样前的第二路串行信号
for k=1:length(xulie)      % 采样的同时也是对信号进行NRZ与RZ变换 
    for j=1:(total)       % NRZ变换
        NRZ((k-1)*total+j)=xulie(k);
    end   
end
for k=1:(length(xulie)-1)      % 采样的同时也是对信号进行串并行变化
    if (mod(k, 2)==0)
        for j=1:(total)       %  串行第一路信号采样
            if xulie(k)==1
                 NRZ_0((k-1)*total+j)=1;
                 nrz_0(k)=1;
            else
                 NRZ_0((k-1)*total+j)=-1;
                  nrz_0(k)=-1;
            end
        end
        for j=1:(total)       %  串行第二路信号采样
            if xulie(k-1)==1
                 NRZ_1((k-1)*total+j)=1;
                 nrz_1(k)=1;
            else
                 NRZ_1((k-1)*total+j)=-1;
                 nrz_1(k)=-1;
            end
        end
    else
        for j=1:(total)       %  串行第一路信号采样
            if xulie(k)==1
                 NRZ_1((k-1)*total+j)=1;
                 nrz_1(k)=1;
            else
                 NRZ_1((k-1)*total+j)=-1;
                 nrz_1(k)=-1;
            end
        end
        for j=1:(total)       %  串行第二路信号采样
            if xulie(k+1)==1
                 NRZ_0((k-1)*total+j)=1;
                 nrz_0(k)=1;
            else
                 NRZ_0((k-1)*total+j)=-1;
                 nrz_0(k)=-1;
            end
        end
    end    
end
for j=1:(total)       % 串行信号修正(补充对最后一个码元的采样)
    if xulie(length(xulie))==1
        NRZ_0((length(xulie)-1)*total+j)=1;
        nrz_0(length(xulie))=1;
    else
        NRZ_0((length(xulie)-1)*total+j)=-1;
        nrz_0(length(xulie))=-1;
    end
    if xulie(length(xulie)-1)==1
        NRZ_1((length(xulie)-1)*total+j)=1;
        nrz_1(length(xulie))=1;
    else
        NRZ_1((length(xulie)-1)*total+j)=-1;
        nrz_1(length(xulie))=-1;
	end
end
%% 生成QPSK信号
fc=20; % 载波20kHz
mNRZ_0=NRZ_0.*sin(2*pi*fc*t);        % 第一路调制后的载波信号
mNRZ_1=NRZ_1.*cos(2*pi*fc*t);       % 第二路调制后的载波信号
QPSK = mNRZ_1-mNRZ_0;        % 生成QPSK调制信号 I*cos(wt)-Qsin(wt)

figure(1)       % 绘制基带时域波形
plot((0:1:total*length(xulie)-1)*dt/total, NRZ);
axis([0 length(xulie)*dt -2 2]);
grid on;
title('基带时域波形');
xlabel('s')

figure(2)       % QPSK调制信号波形
plot((0:1:total*length(xulie)-1)*dt/total, QPSK);
axis([0 length(xulie)*dt -2 2]);
grid on;
title('QPSK调制信号波形');
xlabel('s')

figure(3)       % QPSK调制信号功率谱图
Bs =fs/2; % 系统带宽
ff = linspace(-Bs,Bs,N); % 频域横坐标
fQPSK = fft(QPSK);
pfQPSK =abs(fftshift(fQPSK))/fs;
plot(ff,pfQPSK,'b');    
axis([-50,50,0,1]);
title('QPSK调制信号功率谱图');
xlabel('f/kHz');
%% 绘制星座图
signal = cat(2, nrz_0', nrz_1');         % 将两路串行信号码元合并在一个length(xulie)*2的矩阵中
[a1,~]=find(signal(:,1)==-1&signal(:,2)==-1);       % 返回满足条件的矩阵元素对应的坐标
xinzuotu(a1)=-1-1i;       
[a2,~]=find(signal(:,1)==-1&signal(:,2)==1);
xinzuotu(a2)=-1+1i;     
[a3,~]=find(signal(:,1)==1&signal(:,2)==-1);
xinzuotu(a3)=1-1i;     
[a4,~]=find(signal(:,1)==1&signal(:,2)==1);
xinzuotu(a4)=1+1i;    
scatterplot(xinzuotu)  % 以散点图的形式画出星座图
axis([-2 2 -2 2])
title('理想情况基带发射星座图')
end
发布了108 篇原创文章 · 获赞 48 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/larry1648637120/article/details/94027661