本文主要是介绍基于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')
%给图像取名
运行结果:
有关平均功率,在很多论文中经常会看到:
发射功率约束:
四. 对不同的编码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调制与星座图(附完整代码与分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!