基于MATLAB的QAM调制与星座图(附完整代码与分析)

2024-06-19 18:04

本文主要是介绍基于MATLAB的QAM调制与星座图(附完整代码与分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一. 写在前面

二. 调制与散点图

2.1 16-QAM调制

2.2 256-QAM调制

三. 对随机数据进行QAM调制

四. 对不同的编码QAM调制

五.引入噪声的QAM调制

六. QAM解调

七.总结

7.1 调制阶数

7.2 调制前的信号

7.3 编码方式

7.4 qammod函数内的Name-Value


一. 写在前面

(1)本文章主要讨论QAM调制,全称为Quadrature amplitude modulation;

(2)本文章的源代码参考自MATLAB官方文件;

(3)每行代码我都尝试写清楚含义,非常适合初学者

二. 调制与散点图

先看两个简单例子,不考虑通信功率等限制。

2.1 16-QAM调制

MATLAB代码与解释如下:

M=16; %设置调制阶数为16x=(0:M-1)'; 
%调制之前的数据,为向量x=(0,1,2,3,.....,15)
%最后面的'代表列向量的含义y=qammod(x,M); 
%QAM调制函数为qammod,代表对输入信号x进行QAM调制,调制的阶数为M
%y即为调制后的信号scatterplot(y)
%画星座图
%星座图的横轴代表"In-Phase",也就是同相
% 纵轴代表“Quadrature”,也就是正交。跟调制方式相呼应
%简单理解就是数据分为两路,分别进行载波调制

运行结果:

2.2 256-QAM调制

MATLAB代码:

M=256; %设置调制阶数为256x=(0:M-1)'; 
%调制之前的数据,为向量x=(0,1,2,3,.....,255)
%最后面的'代表列向量的含义y=qammod(x,M); 
%QAM调制函数为qammod,代表对输入信号x进行QAM调制,调制的阶数为M
%y即为调制后的信号scatterplot(y)
%画星座图
%星座图的横轴代表"In-Phase",也就是同相
% 纵轴代表Quadrature,也就是正交跟调制方式相呼应
%简单理解就是数据分为两路,分别进行载波调制

运行结果:

三. 对随机数据进行QAM调制

接下来,我们讨论对随机数据信号进行QAM调制。代码中奖考虑实际的通信系统是有功率限制的。

MATLAB代码如下:

%清空页面
clear;clc;close all;M=64;
%设定调制阶数为64x=randi([0 M-1],1000,1);
%randi产生随机数,范围为0~M-1
%1000行1列,一共1000个数据y=qammod(x,M,'UnitAveragePower',true);
%'UnitAveragePower'代表平均功率
%true在MATLAB中为1,此处即为限定输出的信号平均功率为1
%函数的语法环境为y = qammod(___,Name,Value) avgPower=mean(abs(y).^2);
%abs代表绝对值,mean代表平均值
%因为y是向量所以平方运算的前面有个.号
%随机信号的均方值通常为功率,可以验证功率为1,注意会略微有些偏差scatterplot(y)
%画星座图title('64-QAM, 平均功率 = 1 W')
%给图像取名

运行结果:

有关平均功率,在很多论文中经常会看到:

发射功率约束:

E\lbrace |x|^2 \rbrace\leq P

四. 对不同的编码QAM调制

对数据进行编码的方式可以直接转为二进制(binary),也可以使用格雷码(Grey),甚至可以自定义。

格雷码(Gray code)也叫交替二进制码,相邻的星座图点只相差一个比特不同。

MATLAB代码如下:

%清空页面
clear;clc;close all;M=16;
%调制阶数(modulation order)为16d=[0:M-1];
%创建一个数据序列,从0~15,一共16个整数
%将这些整数可以写成二进制
%有16个点,所以后面均为16-QAM调制%%格雷码
y=qammod(d,M,'PlotConstellation',true);
%'PlotConstellation'与true需要连在一起,前者代表星座图,后者代表逻辑运算1,也就是确实要画图
%可以把true改为1也可以
%此处没有给出编码方式,就是默认为格雷码
%注意格雷码是不按顺序的,与直接的二进制转化有区别%%直接二进制编码
z=qammod(d,M,'bin','PlotConstellation',true);
%bin代表直接将数据d转为二进制,是按顺序的
%'PlotConstellation'与true代表画星座图%%自定义的编码
smap=randperm(M)-1;
%randperm代表对数据进行随机排列,M代表从1~M个数据
%需要注意的是调制需要从0开始,所以需要-1
w=qammod(d,M,smap,'PlotConstellation',true);

运行结果与解释:

解释:红色叉叉右上角的数字代表信号,从上往下看,很明显不是按照二进制顺序的,这其实是依据格雷码来进行排列的。

解释:从上往下,一列一列地看,是按照数字大小排列的,这就是直接把数字转为二进制的编码方式。

平均功率(图中UnitAveragePower)为false指的是QAM星座图中任意两点直接的距离为最近两点的距离,也就是对星座图进行了缩放。

解释:随机排列,无任何顺序

五.引入噪声的QAM调制

MATLAB代码:

%清除所有无关变量
clear;clc;close all;M=64;
%调制阶数为64k=log2(M);
%log以2为底的运算
%每个数据对应的比特长度data=randi([0 1],1000*k,1);
%从0或1中随机抽取,1000*k行,1列
%每个数据为k比特长,所以总数应该为k的倍数
%相当于产生了1000个symboltxSig=qammod(data,M,'InputType','bit','UnitAveragePower',true);
%对数据data进行QAM调制,调制阶数为M
%'InputType'与'bit'代表输入数据的格式为比特
%'UnitAveragePower'与true代表平均功率为1rxSig=awgn(txSig,25);
%将调制后的信号txSign输入到带噪的信道中
%加性高斯白噪声(AWGN),信噪比(SNR)为25cd=comm.ConstellationDiagram('ShowReferenceConstellation',false);
%comm.ConstellationDiagram函数调用出调制后的平面
%平面中in-phase代表实轴,quadrature代表虚轴
%'ShowReferenceConstellation'与false代表不显示出参考点
%如果将false改为true,则会出现四个红色的参考点,大家可以试一试cd(rxSig)
%显示出星座图

运行结果

理解:图中有1000个数据点

六. QAM解调

MATLAB代码:

%清除所有无关变量
clear;clc;close all;M=64;
%调制阶数为64bitsPerSym=log2(M);
%bits per symbol,,每个符号的比特长度x=randi([0 1],10*bitsPerSym,1);
%randi产生随机数,从0或1中随机选取
%10*bitsPerSym行1列,很明显是比特串的形式
%行数需要是bitsPerSym的倍数,一共有10个符号点y=qammod(x,M,'bin','InputType','bit','OutputDataType',numerictype(1,16,10));
%x与M代表对输入数据x进行M-QAM调制
%'InputType'与'bit'解释输入的数据为比特串形式
%'OutputDataType'与numerictype(1,16,10)代表对输出数据格式进行限定z=qamdemod(y,M,'bin','OutputType','bit');
%qamdemod代表QAM解调
%bin代表y的编码方式为直接转为二进制
%'OutputType'与'bit'代表解调后的数据为比特串s=isequal(x,double(z))
%x为调制前的数据,z为解调后的数据
%isequal对比两者数据是否相等
%double代表双精度浮点数
%无噪传输可以想到,结果肯定相等

运行结果:

s = logical  1
 

解释:逻辑结果为1代表两者相等。QAM解调成功

七.总结

7.1 调制阶数

QAM调制阶数需要是2的指数形式,可代表信号星座图中的点数(就是那些参考点的数量)。

7.2 调制前的信号

可以是一个标量,也可以是一个向量,还可以是一个矩阵。

可以是比特串,也可以取自整数。如果是整数的话,其取值范围为0~M-1,其中M为调制阶数。

如果输入是二进制的比特串时,在MATLAB中需要给出'InputType','bit'。一个码元对应的比特长度为log2(M),所以输入信号的长度需要是log2(M)的倍数。

7.3 编码方式

编码方式通常有三种:(1)格雷码顺序(2)二进制直接转换(3)自定义顺序

一共有M个星座点,取值为0~M-1。第一个元素的值为最左上角,依次往下。

7.4 qammod函数内的Name-Value

在以上的代码中,我们曾看到:

y=qammod(x,M,'InputType','bit')

表明输入信号为二进制的比特串,行数需要是log2(M)的倍数;

如果将'bit'改为'integer',则表明输入信号的取值为0~M-1内的整数。

还有命令'UnitAveragePower'代表的是Unit average power flag,紧跟在后面的是false(代表0),或者true(代表1)。这个命令主要是对星座图进行缩放。

调制后的数据格式可以使用'OutputDataType'来进行限定,需要搭配函数numerictype,通常的数据格式不外乎single或者double,建议不用调整。

还可以搭配'PlotConstellation'命令来进行画星座图,同样也是紧跟着false(代表0),或者true(代表1)。

这篇关于基于MATLAB的QAM调制与星座图(附完整代码与分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075749

相关文章

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.