百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

通信QPSK调制,为什么要对数据串并转换?

bigegpt 2025-01-21 15:17 5 浏览

班长聊通信原理 | 系列文章请至主页“文章”查阅

通信中的很多调制都有一个把串行数据转换为并行数据的过程,QPSK就是一个典型的例子。

其实不光QPSK,其他的调制方法都是这个模式。

很多小伙伴最近都在问关于QPSK的问题,很多人在串并转换地方就犯糊涂了。我之前也写过QPSK的文章:

数字调制技术:如何优雅的学习QPSK,IQ调制与星座图?

本文将从实际Matlab仿真角度,直观的阐述这个问题。


先从发送信息开始

无论如何,我们先假定我们需要发送一组信息。

为了方便,我们跳过传感器采集-采样-编码等环节,直接定义一组数据:

10位二进制数,10个比特。

0-1-0-1-1-1-0-0-1-1

data=[0  1 0 1 1 1 0 0 1 1];%准备发送的信息

通过Matlab的stem绘图函数,可以画出原始信息。定义图形标题为“准备发送的信息”,设置坐标轴范围,横坐标0~11,纵坐标0~1.5。

figure(1)
stem(data, 'linewidth',3), grid on;% 画出杆状图,线宽度设置为3号
title('  准备发送的信息 ');% 定义图形标题
axis([ 0 11 0 1.5]);% 设置坐标轴范围

得出原始数据杆状图1:

再对数据简单处理

将原始信息,改成NRZ(Nonreturn - To - Zero)非归零双极性编码,就是我们最常见的编码。

根据信号是否归零,还可以划分为归零码和非归零码,归零码码元中间的信号回归到0电平,例如"1"为正电平,"0"为负电平,每个数据表示完毕后,都会回归到零电平状态,而非归零码没有回归到零电平的过程,例如"1"为高电平,"0"为低电平。

而双极性,就是用正负电平的脉冲分别表示二进制代码1和0。

data_NZR=2*data-1; % 将数据改成NRZ编码格式

data数据改成NRZ形成编码,在Matlab中也是简单的一句命令即可,具体波形如图3中“串”波形。

数据流串→并转换?

很多程序中,会用reshape函数一句话,实行了数据比特的串并转换。

s_p_data=reshape(data_NZR,2,length(data)/2);  % 数据串并转换

关于"A = reshape(A,m,n)"函数的作用,就是将A的行列排列成m行n列。它对我们输入data_NZR的作用就如图4所示。

就是把一串数据,按照m行n列重新排列。

我们为什么要把一串数据,如图4中“串”形数列转换为并行呢?

还得先从MPSK的原理说起

这里的M代表多进制,M=2,4,8...,通常取2的正整数幂。

也就是常说的2PSK,4PSK/QPSK,8PSK......

一个三角函数sk(t),我们通常用三个参数就可以唯一确定,分别为振幅A,频率f/ω,初始相位θk。

我们这里讨论的是相位调制,所以振幅A和频率f/ω不会变化。

θk的变化,如图5所示。

如果定义θk等于π或者0两种情况,那么sk(t)就有两种唯一的波形,分别为

  • A cos( ωt + 0 )
  • A cos( ωt + π )

这两种波形,正好对应二进制的0和1,这就是2PSK/BPSK调制。

那么4PSK/QPSK调制呢?

以此类推,按照θk的公式,我们可以取0,π/2,π,3π/2四种初相位,对应4种sk(t)波形

  • A cos( ωt + 0 )
  • A cos( ωt + π/2 )
  • A cos( ωt + π )
  • A cos( ωt + 3π/2 )

这四种波形,可以表示四种二进制组合01,00,10,11,这就是4PSK/QPSK调制。

同样是sk(t)波形,在QPSK中可以同时传输两个bit,所以理论上4/QPSK调制的数据传输速率是2PSK的两倍。

如何产生QPSK信号?

生成QPSK信号,就是上文的sk(t)信号。

sk(t)是一个三角函数,根据三角展开式,我们可以进行如下展开:

sk(t)波形被展开成两个正弦波的叠加,且初始相位均为0,二者相位差π/2(cos与sin相位差π/2)。

载波信号coswt很容易获得,sinwt信号在cosωt的基础上做一个π/2移相,也可以获得。

那么根据图3所示,当数据流串并转换之后,分成2路,一路为ak,一路为bk;

分别与cos和sin相乘之后,再进行叠加,输出QPSK信号。

我们用图3中的串行数据-1 +1 -1 +1 +1 +1 -1 -1 +1 +1作为输入。

  • ak = -1 或者 +1
  • bk = -1 或者 +1

当ak=-1,bk=+1,输入为(0,1)时,

sk(t)=-1*cosωt+(+1)sinωt=√2 * cos(ωt + 5π/4 ),θ3 = 5π/4;

当ak=+1,bk=+1,输入为(1,1)时,

sk(t)=+1*cosωt+(+1)sinωt=√2 * cos(ωt + 3π/4 ),θ4 = 7π/4;

当ak=-1,bk=-1,输入为(0,0)时,

sk(t)=-1*cosωt+(-1)sinωt=√2 * cos(ωt + 7π/4 ),θ2 = 3π/4;

当ak=+1,bk=-1,输入为(1,0)时,

sk(t)=+1*cosωt+(-1)sinωt=√2 * cos(ωt + π/4 ),θ1 = π/4;

嘿嘿,这也是四个相位,那么这也是QPSK。

自此,我们发现之所以要串行转换为并行,就是为了方便调制cos和sin载波,然后叠加,形成QPSK信号。

那么,我们可以生产QPSK信号如下图7所示。同相信号Inphase和正交Quadrature信号叠加,形成最终QPSK信号。

for(i=1:length(data)/2)
    y1=s_p_data(1,i)*cos(2*pi*f*pt); % 同相分量 
    y2=s_p_data(2,i)*sin(2*pi*f*pt) ;% 正交分量 
    y_in=[y_in y1]; % 同相信号向量
    y_qd=[y_qd y2]; % 正交信号向量
    y=[y y1+y2]; % 调制信号
end

总结

文中的仿真其实还是有改进之处的,班长在此抛出3个思考,大家可以思考下,会加深对QPSK的理解。

QPSK可是4G、5G中的重要调制技术,尤其在信号覆盖较差的时候,一点也不过时啊。

思考1:为什么一般的程序中要用NRZ编码这种形式,用其他的编码形式可以吗?

思考2:图7中最后红色的QPSK信号,在"0.4"位置处,出现了不连续,或者说是突变?这对信号传输有影响吗?能否改进?

思考3:图6中的对应方式,即

  • θ1→(1,0)
  • θ2→(0,0)
  • θ3→(0,1)
  • θ4→(1,1)

为什么要这么排列,可以打乱顺序么?格雷码是什么?

看到这里,帮文章点个赞吧!

欢迎您在评论区留言讨论!

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...