【数字调制】OQPSK调制与解调【附MATLAB代码】

news2025/1/15 6:42:32

文章来源:微信公众号:EW Frontier 关注可了解更多的雷达、通信、人工智能相关代码。

QPSK信号

QPSK信号与BPSK信号的调制方法相同,仅调制阶数不同,其表达式为:

s_Q(t)=\sum_n\left\{a_ng(t-nT)\cos(2 \pi f_ct+\theta_0)-b_ng(t-nT)\sin(2 \pi f_ct+\theta_0)\right\}

上式中\begin{matrix}a_{n}&b_{n}\\\end{matrix}分别表示I、Q两路的基带信息序列,取值{-1,1},调制阶数为 4阶,\begin{matrix}a_{n}&b_{n}\\\end{matrix}的每一对取值表征两位比特数据信息,其他参数解释同BPSK信号。

OQPSK信号

根据QPSK信号的调制原理知道,它的相邻码元最大相位差为180°。为减小相位突变,将两个正交分量I路与Q路的比特在时间上错开半个码元周期,使两 路的比特不会同时改变,保证了相邻码元最大相位差为90°,由此便得到OQPSK 信号,称:偏置正交四相相移键控。其表达式可表示为:

s_O(t)=\sum_n\left\{a_ng(t-nT)\cos(2\pi f_ct+\theta_0)-b_ng(t-nT-\frac{T}{2})\sin(2\pi f_ct+\theta_0)\right\}

上式中如果将延迟的T/2时间去掉,即得到QPSK信号的调制。式中an表示基带信息数据序列,取值范围是{-1,1},即调制阶数为2阶; T表示码元符号周期,fc为载波频率,0为载波的初始相位;g(t) 表示码元成型滤波器,即根升余弦滤波器,其滚降因子取0.5。

MATLAB代码

A=1;         
% 载波幅度
fc=2;      % 载波频率 
Ts=1;                                               % 码元宽度 
fs=1/Ts;
B1=fs;                                              %低通滤波器的宽度
N_sample=32;                                       % 基带码元抽样点数
N=500;                                              % 码元数    
dt=Ts/fc/N_sample;                                  % 抽样时间间隔 
T=N*Ts;                                             % 信号持续时间长度  
t=0:dt:T-dt;                                        % 时间向量 
Lt=length(t);                                       % 时间向量长度 
tx1=0;                                              % 时域波形图横坐标起点 
tx2=10;                                             % 时域波形图横坐标终点  
ty1=-2;                                             % 时域波形图纵坐标起点 
ty2=2;                                              % 时域波形图纵坐
fx1=-10;                                            % 功率谱图横坐标起点  
fx2=10;                                             % 功率谱图横坐标终点  
fy1=-40;                                         % 功率谱图纵坐标起点 
fy2=25;                                          % 功率谱图纵坐标终点
EsN0dB = 3:0.5:10                                %设定EbNo范围 
EsN0 = 10.^(EsN0dB/10);  
rt=zeros(1,length(EsN0dB));                        %初始化误码率向量 
M=4;
%产生二进制信源  
m=randn(1,N);                                    %  产生1到n的随机数
d=sign(m);                            % 将大于0的变为1小于0的变为-1
dd=sigexpand(d,fc*N_sample);          %将序列d的周期变为Ts
gt=ones(1,fc*N_sample);               % 产生宽度为Ts的矩形窗 
d_NRZ=conv(dd,gt);                    % 卷积产生基带信号   
figure(5);  
subplot(2,2,1); 
plot(t,dd(1:Lt));  
axis([tx1,tx2,ty1,ty2]);
figure(1); 
subplot(2,4,1); 
plot(t,d_NRZ(1:Lt));  
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)');
ylabel('幅度');  
title('基带信号时域波形图');
grid;  
[f,d_NRZf]=T2F(t,d_NRZ(1:Lt));% 进行傅里叶变换 
figure(1);  
subplot(2,4,5); 
plot(f,10*log10(abs(d_NRZf).^2/T));
axis([fx1,fx2,fy1,fy2]); 
xlabel('频率(Hz)'); 
ylabel('功率谱密度(dB/Hz)'); 
title('基带信号功率谱图'); 
grid; 
figure(4); 
subplot(2,2,1); 
plot(t,d_NRZ(1:Lt));
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度'); 
title('基带信号时域波形图'); 
grid;
figure(4); 
subplot(2,2,2); 
plot(f,10*log10(abs(d_NRZf).^2/T)); 
axis([fx1,fx2,fy1,fy2]);
xlabel('频率(Hz)'); 
ylabel('功率谱密度(dB/Hz)');
title('基带信号功率谱图');
grid;
% 串并转换 
d1=[];
d2=[]; 
for i=1:N    
    if rem(i,2)==1
d1((i+1)/2)=d(i);   
    else
        d2(i/2)=d(i);   
    end
end
dd1=sigexpand(d1,2*fc*N_sample);   %功能同上             
gt1=ones(1,2*fc*N_sample);              
d_NRZ1=conv(dd1,gt1);                           
figure(1); 
subplot(2,4,2);
plot(t,d_NRZ1(1:Lt));
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度');  
title('上支路基带信号时域波形图');
grid; 
[f1,d_NRZ1f]=T2F(t,d_NRZ1(1:Lt));
figure(1); 
subplot(2,4,6); 
plot(f1,10*log10(abs(d_NRZ1f).^2/T));
axis([fx1,fx2,fy1,fy2]);
xlabel('频率(Hz)');
ylabel('功率谱密度(dB/Hz)'); 
title('上支路基带信号功率谱图');
grid;
​
figure(3); 
subplot(2,4,1); 
plot(t,d_NRZ1(1:Lt)); 
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)');
ylabel('幅度'); 
title('上支路基带信号时域波形图');
grid;
dd2=sigexpand(d2,2*fc*N_sample);         
gt1=ones(1,2*fc*N_sample);                 
d_NRZ2=conv(dd2,gt1);                      
d_NRZ2DLY=[-ones(1,N_sample*fc),d_NRZ2(1:end-N_sample*fc)];  %进行延时,在前面添-1  
figure(1); 
subplot(2,4,3); 
plot(t,d_NRZ2DLY(1:Lt)); 
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度'); 
title('下支路基带信号时域波形图'); 
grid;  
[f2,d_NRZ2f]=T2F(t,d_NRZ2DLY(1:Lt));
figure(1);  
subplot(2,4,7); 
plot(f2,10*log10(abs(d_NRZ2f).^2/T));
axis([fx1,fx2,fy1,fy2]); 
xlabel('频率(Hz)');  
ylabel('功率谱密度(dB/Hz)'); 
title('下支路基带信号功率谱图');
grid;
figure(3); 
subplot(2,4,5); 
plot(t,d_NRZ2DLY(1:Lt));
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)');
ylabel('幅度'); 
title('下支路基带信号时域波形图');
grid; % 载波  
h1t=A*cos(2*pi*fc*t);
h2t=A*sin(2*pi*fc*t); 
figure(1); 
subplot(2,4,4);
plot(t,h1t); 
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)');
ylabel('幅度');  
title('载波信号时域波形图');
grid;  
[f3,h1tf]=T2F(t,h1t); 
figure(1);  
subplot(2,4,8); 
plot(f3,10*log10(abs(h1tf).^2/T)); 
axis([fx1,fx2,fy1,fy2]);
xlabel('频率(Hz)'); 
ylabel('功率谱密度(dB/Hz)'); 
title('载波信号功率谱图');
​
grid;    % 生成OQPSK信号  
s_qpsk1=d_NRZ1(1:Lt).* h1t;            %上下支路分别调制 
s_qpsk2=d_NRZ2DLY(1:Lt).* h2t; 
figure(2); 
subplot(2,2,1); 
plot(t,s_qpsk1);  
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)'); 
ylabel('幅度');  
title('上支路频带信号时域波形图');
grid; 
[f4,s_qpsk1f]=T2F(t,s_qpsk1);
figure(2);
subplot(2,2,3);
plot(f4,10*log10(abs(s_qpsk1f).^2/T));
axis([fx1,fx2,fy1,fy2]);
xlabel('频率(Hz)'); 
ylabel('功率谱密度(dB/Hz)'); 
title('上支路频带信号功率谱图'); 
grid; 
figure(2);
subplot(2,2,2);
plot(t,s_qpsk2);  
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)'); 
ylabel('幅度');  
title('下支路频带信号时域波形图');
grid;
​
[f5,s_qpsk2f]=T2F(t,s_qpsk2);
figure(2); 
subplot(2,2,4);
plot(f5,10*log10(abs(s_qpsk2f).^2/T));
axis([fx1,fx2,fy1,fy2]);
xlabel('频率(Hz)'); 
ylabel('功率谱密度(dB/Hz)'); 
title('下支路频带信号功率谱图');
grid; 
​
s_oqpsk=s_qpsk1+s_qpsk2;                %两路信号相加得到调制后的信号
figure(8); 
subplot(2,2,1);
plot(t,s_oqpsk);  
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)'); 
ylabel('幅度'); 
title('已调信号时域波形图');
grid;
​
[f6,s_oqpskf]=T2F(t,s_oqpsk); 
figure(8); 
subplot(2,2,3); 
plot(f6,10*log10(abs(s_oqpskf).^2/T)); 
axis([fx1,fx2,fy1,fy2]); 
xlabel('频率(Hz)');  
ylabel('功率谱密度(dB/Hz)'); 
title('已调信号功率谱图');
grid;
​
% 信道加入高斯白噪声进行接收解调 
% 产生高斯白噪声
m=1; 
p1=-10; 
noise = wgn(m,Lt,p1); 
% 接收信号
y_qpsk = s_oqpsk + noise; 
figure(8); 
subplot(2,2,2); 
plot(t,y_qpsk); 
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度'); 
title('接收信号时域波形图 '); 
grid; 
​
[f7,y_qpskf]=T2F(t,y_qpsk);
figure(8); 
subplot(2,2,4);  
plot(f7,10*log10(abs(y_qpskf).^2/T));
axis([fx1,fx2,fy1,fy2]); 
xlabel('频率(Hz)');
​
ylabel('功率谱密度(dB/Hz)'); 
title('接收信号功率谱图 Pn=-10dB'); 
grid; 
%[t,ny_qpsk]=bpf(f7,y_qpskf,1,8);
​
% 相干解调 
% 通过乘法器1 
r_qpsk1 = y_qpsk .* h1t;   
figure(3);  
subplot(2,4,2);
plot(t,r_qpsk1); 
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度'); 
title('上支路通过乘法器信号时域波形图'); 
grid; 
​
%通过低通滤波器 
[f8,r_qpsk1f]=T2F(t,r_qpsk1);   
B1=1;
[t1,r_qpsk11]=lpf(f8,r_qpsk1f,B1); 
figure(3);  
subplot(2,4,3); 
plot(t1,r_qpsk11)  
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)'); 
ylabel('幅度');  
title('上支路通过低通滤波器信号时域波形图');
grid;
​
%抽样判决  
dd11=r_qpsk11(fc*N_sample:2*fc*N_sample:end);   
dd22=sign(dd11);
%%判决 
dd222=sigexpand(dd22,2*fc*N_sample); 
d_NRZ11=conv(dd222,gt1);          %
得到上支路信号  
d_NRZ11DLY=[-ones(1,N_sample*fc),d_NRZ11(1:end-N_sample*fc)];   %上支路信号延时  
figure(3);
​
subplot(2,4,4);
plot(t,d_NRZ11DLY(1:Lt)); 
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度'); 
title('上支路抽样判决后信号时域波形图'); 
grid; 
% 通过乘法器2  
r_qpsk2 = y_qpsk .* h2t;
figure(3);  
subplot(2,4,6); 
plot(t,r_qpsk2);  
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)');
ylabel('幅度'); 
title('下支路通过乘法器信号时域波形图');
grid; 
​
%通过低通滤波器
[f9,r_qpsk2f]=T2F(t,r_qpsk2);  
[t2,r_qpsk21]=lpf(f9,r_qpsk2f,B1);
figure(3); 
subplot(2,4,7); 
plot(t2,r_qpsk21);
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)'); 
ylabel('幅度'); 
title('下支路通过低通滤波器信号时域波形图');
grid; 
%抽样判决  
dd33=r_qpsk21(fc*N_sample:2*fc*N_sample:end);  
dd44=sign(dd33);     %判决
dd444=sigexpand(dd44,2*fc*N_sample); 
d_NRZ21=conv(dd444,gt1)               
figure(3);
subplot(2,4,8);
plot(t,d_NRZ21(1:Lt));
axis([tx1,tx2,ty1,ty2]);
xlabel('时间(S)');
ylabel('幅度'); 
title('下支路抽样判决后信号时域波形图'); 
​
grid;  
dd22DLY=d_NRZ11DLY(fc*N_sample:2*fc*N_sample:end);
% 并串转换 
ddd=[]; 
for s=1:N/2  
    ddd(2*s-1)=dd22DLY(s);  
    ddd(2*s)=dd44(s); 
end
rddd=sigexpand(ddd,fc*N_sample); 
%解调信号输出  
r_qpsk=conv(rddd,gt); 
qr_qpsk=[r_qpsk(2*N_sample*fc+1:N*N_sample*fc),ones(1,2*N_sample*fc)];
%去除延时  
figure(4);
​
subplot(2,2,3); 
​
plot(t,qr_qpsk(1:Lt)); 
axis([tx1,tx2,ty1,ty2]); 
xlabel('时间(S)');
ylabel('幅度');
title('解调信号时域波形图 Pn=-10dB'); 
grid;  
[f10,qr_qpskf]=T2F(t,r_qpsk(1:Lt));
figure(4);
subplot(2,2,4); 
plot(f10,10*log10(abs(qr_qpskf).^2/T));
axis([fx1,fx2,fy1,fy2]);
xlabel('频率(Hz)');
ylabel('功率谱密度(dB/Hz)');
title('解调信号功率谱图 Pn=-10dB');
grid;
​
%眼图  
eyediagram(y_qpsk,32,2,8);
x=d_NRZ1(1:fc*N*N_sample)+j*d_NRZ2DLY(1:fc*N*N_sample); 
%星座图  
scatterplot(x); 
axis([-4,4,-4,4]); 
grid; 
xlabel('实部');
ylabel('虚部'); 
title('星座图');  
d_NRZJ=d_NRZ(1:fc*N*N_sample); 
p=find(d_NRZJ<0);
d_NRZJ(p)=0; 
q=find(qr_qpsk<0); 
qr_qpsk(q)=0; 
r=find(d_NRZ>0); 
d_NRZJ(r)=1; 
s=find(qr_qpsk>0); 
qr_qpsk(s)=1;
figure 
[num,rt] = biterr(d_NRZJ,qr_qpsk);
Ps = erfc(sqrt(EsN0)*sin(pi/M));
​
semilogy(EsN0dB,Ps,'rd -'); 
xlabel('Es/N0(dB)');
ylabel('误码率');
grid on;  
title('OQPSK系统的误码率'); 

MATLAB仿真结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xcode remove the package dependency

Xcode Version 15.2 (15C500b) &#x1f914;️ 想知道直接右键&#xff0c;这个 Delete 为什么是禁用状态 推荐一下刚上线的 App 熊猫小账本&#xff0c;里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App&#xff0c;用于记录日常消费开支收入&#xff0c;使用 iCl…

Pulsar消息路由深入剖析

一、概述 大数据背景下&#xff0c;分区应该是所有组件必备的基本条件&#xff0c;否则面对海量数据时无论是计算还是存储都容易遇到瓶颈。跟其他消息系统一样&#xff0c;Pulsar通过Topic将消息数据进行业务层面划分管理&#xff0c;同时也支持Topic分区&#xff0c;通过将多…

挑战杯 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

WRF模型安装教程(ububtu系统)-- III.WRF和WPS模型的安装

六、WRF模型的安装 # 进入Build_WRF文件夹 cd Build_WRF # 下载WRFV3.9.1 wget https://www2.mmm.ucar.edu/wrf/src/WRFV4.0.TAR.gz # 解压WRF安装包并进入 tar -zxvf WRFV4.0.TAR.gz cd WRF # 安装WRF ./configure 出现如下选项&#xff1a; 选择34&#xff0c; 这里是让你选…

React进阶(Redux,RTK,dispatch,devtools)

1、初识Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia(Vuex)&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管理应用的状态 案例-实现一个计数器 实现步骤&#xff1a; Redux管理数据的流程&#xff1a; state:一个对象&…

nRF52832——唯一 ID 与加密解密

nRF52832——唯一 ID 与加密解密 唯一 ID 概念唯一 ID 作用读取唯一 ID 唯一 ID 用于加密TEA 加密算法唯一 ID 的加密和解密 唯一 ID 概念 唯一 ID 作用 nRF52xx 微控制器提供一组 64 位的唯一 ID 号&#xff0c;这个唯一身份标识所提供的 ID 值对任意一个 nRF52xx 微控制器&…

Java项目:51 springboot基于springboot的社区团购系统设计012

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本基于Spring Boot的社区团购系统主要满足两种用户的需求&#xff0c;这两种用户分别为管理员和用户&#xff0c;下面将对这两种用户分别实现的…

电磁兼容EMC:一文读懂电气放电管选型设计

目录 1 GDT外观结构 2 GDT 常见品牌 3 GDT命名规则 4 GDT工作原理 5 GDT基本特点 6 GDT典型应用 7 GDT电气参数说明 7.1 DC Spark-over Voltage 直流火花放电电压&#xff08;直流击穿电压&#xff09; 7.2 Maximum Impulse Spark-over Voltage 最大冲击火花放电电压&…

Ribbon简单使用

Ribbon是Netflix发布的云中间层服务开源项目&#xff0c;其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单的说&#xff0c;Ribbon是一个客户端负载均衡器&#xff0c;我们可以在配置文件中Load Balancer后…

【DataWhale学习】用免费GPU线上跑StableDiffusion项目实践

用免费GPU线上跑SD项目实践 ​ DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动&#xff0c;我很感兴趣就参加啦。之前就对chatGLM有所耳闻&#xff0c;是去年清华联合发布的开源大语言模型&#xff0c;可以用来打造个人知识库什么的&#xff0c;一直没有尝试。而SD我…

【数据结构】顺序表的实现

文章目录 **线性表(linear)&#xff1a;****顺序表****下列是需要实现的接口(Seqlist.h)****顺序表的初始化****顺序表的插入数据****顺序表的扩容(为插入数据提供保障)****顺序表的尾插****顺序表的头插****顺序表的删除数据****顺序表的尾删****顺序表的头删****查找指定位置…

下载API文档

在线看&#xff1a;Overview (Java SE 17 & JDK 17) 离线下载&#xff1a;Java Development Kit 17 Documentation

【Sql】MVCC有关问题,以及锁,日志和主从复制原理

目录 MVCC 解决什么问题? 实现原理 隐式字段 undo log Read View(读视图) InnoDB 对 MVCC 的实现 锁 分类 锁升级&#xff1f; InnoDB 的行锁&#xff1f; 死锁避免&#xff1f; 乐观锁和悲观锁 日志 主从复制原理 主从复制的作用 MySQL主从复制解决的问题 涉…

模型量化(二)—— 训练后量化PTQ(全代码)

训练后量化&#xff08;Post-training Quantization&#xff0c;PTQ&#xff09;是一种常见的模型量化技术&#xff0c;它在模型训练完成之后应用&#xff0c;旨在减少模型的大小和提高推理速度&#xff0c;同时尽量保持模型的性能。训练后量化对于部署到资源受限的设备上&…

【阿里云系列】-利用yaml文件部署NacosXxl-job到ACK

背景介绍 随着容器化的技术成熟落地&#xff0c;拥抱各种成熟的容器化集群平台是加速我们落地的必然之路&#xff0c;目前国内以阿里云、华为云、腾讯云为平台的供应商为主&#xff0c;国外则以AWS&#xff0c;Azure为主&#xff0c;让我们借助平台已有的优势进行快速落地提高…

指针【理论知识速成】(3)

一.指针的使用和传值调用&#xff1a; 在了解指针的传址调用前&#xff0c;先来额外了解一下 “传值调用” 1.传值调用&#xff1a; 对于来看这个帖子的你相信代码展示胜过千言万语 #include <stdio.h> #include<assert.h> int convert(int a, int b) {int c 0…

log4j2.xml介绍和使用

log4j2.xml是什么 log4j2.xml 是用于配置 Apache Log4j 2 的 XML 格式配置文件。Log4j 2 是一个用于 Java 应用的流行日志框架&#xff0c;提供灵活的日志管理和配置。在 log4j2.xml 文件中&#xff0c;可以配置日志记录的格式、级别、目的地等。 下面是一些主要节点和属性的…

内容管理平台原来对企业这么重要,看完收藏!

“内容为王”&#xff0c;这是当今数字化时代的一个重要真理。不论是创业新贵、还是行业巨头&#xff0c;纷纷开始深入理解和应用内容管理平台&#xff08;Content Management System&#xff0c;简称CMS&#xff09;&#xff0c;以便更好的管理其大量的内容和信息。 那么&…

网络安全从业人员何去何从

从2024年1月1日开始到今天&#xff0c;基本没有真正放下自己休息过一天。可能很多人会说是卷&#xff0c;其实真正的原因是压力。不仅仅是生活压力还有行业压力。 今年这个行业让很多人开始感到了迷茫&#xff0c;不仅是股市的低迷&#xff0c;更多的来自于各大公司不断的因为…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…