基于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; %设置调制阶数为16

x=(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; %设置调制阶数为256

x=(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;
%设定调制阶数为64

x=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)为16

d=[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;
%调制阶数为64

k=log2(M);
%log以2为底的运算
%每个数据对应的比特长度

data=randi([0 1],1000*k,1);
%从0或1中随机抽取,1000*k行,1列
%每个数据为k比特长,所以总数应该为k的倍数
%相当于产生了1000个symbol

txSig=qammod(data,M,'InputType','bit','UnitAveragePower',true);
%对数据data进行QAM调制,调制阶数为M
%'InputType'与'bit'代表输入数据的格式为比特
%'UnitAveragePower'与true代表平均功率为1

rxSig=awgn(txSig,25);
%将调制后的信号txSign输入到带噪的信道中
%加性高斯白噪声(AWGN),信噪比(SNR)为25

cd=comm.ConstellationDiagram('ShowReferenceConstellation',false);
%comm.ConstellationDiagram函数调用出调制后的平面
%平面中in-phase代表实轴,quadrature代表虚轴
%'ShowReferenceConstellation'与false代表不显示出参考点
%如果将false改为true,则会出现四个红色的参考点,大家可以试一试

cd(rxSig)
%显示出星座图

运行结果

理解:图中有1000个数据点

六. QAM解调

MATLAB代码:

%清除所有无关变量
clear;clc;close all;

M=64;
%调制阶数为64

bitsPerSym=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)。

基于MatlabQAM调制与解调是一种数字通信技术,用于将数字信号调制成复杂信号以便传输和解调。QAM代表正交幅度调制,它将两个正交的基带信号进行叠加来表示数字信息。 在Matlab中,首先需要生成要传输的数字信号。可以通过随机生成比特流或从音频文件中读取数据来实现。然后,通过分割比特流成为多个符号,将每个符号映射到特定的信号点。信号点的数量取决于所选的QAM调制级别。 在调制部分,需要将每个符号分成实部和虚部信号,然后以某种方式调制它们。常见的调制方案包括星座图和相位偏移键控(PSK)。对于QAM调制,通常使用星座图,它通过将每个符号映射到复平面上的信号点来表示。 在Matlab中,通过使用"qammod"函数来实现QAM调制,该函数可以指定要使用的调制级别和星座图。一旦获得调制信号,就可以通过传输媒介进行发送。 在接收端,需要解调接收到的信号并恢复原始的数字信号。首先,需要对接收到的信号进行采样和定时同步。然后,使用"qamdemod"函数来实现QAM解调,该函数与调制时使用的参数相匹配。 在解调过程中可以选择不同的解调算法,例如最大似然解调或软判决解调。最终,通过将解调后的符号重新组合成比特流,可以还原出原始的数字信号。 通过Matlab中的各种工具和函数,可以方便地实现QAM调制和解调,同时可以进行性能评估和误码率分析。这种基于MatlabQAM调制与解调技术广泛应用于数字通信系统的设计和仿真中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唠嗑!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值