基于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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud