location_on 首页 keyboard_arrow_right 科技 keyboard_arrow_right 正文

16QAM调制原理通俗讲解:从星座图到MATLAB仿真

科技 access_alarms2026-06-20 visibility1 text_decrease title text_increase

目录

0 前言

本博客是作者学习通信原理过程中,针对正交振幅调制(QAM)部分的学习,且在参考了一些博客后的一些学习心得,并针对16QAM调制进行了MATLAB的仿真实现,想为同样正在学习该部分的朋友们提供一些思路和参考,并且作为一个学习记录方便复习。由于作者水平有限,恳请大家指正错误。

本博客代码主要参考了该篇博客:

通信原理与MATLAB(十一):QAM的调制解调

正交幅度调制内容原理部分参考如下:

最详细解读QAM 调制

通信里 星座图 到底是什么意思啊?

基于MATLAB实现16QAM调制解调仿真(结果超详细)

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)

《通信原理》第7版 樊昌信 P228—231

1 正交振幅调制(QAM)

在此需要大家对幅度调制和相移调制有一个最基本的了解

幅度调制就是根据码元的不同,来决定载波的不同幅度

相移调制就是根据码元的不同,来决定载波的不同相位

16QAM调制解调MATLAB仿真_qam调制原理_正交振幅调制QAM原理分析

在多进制调制中,相移调制由于其带宽和功率方面都占有优势,即带宽占用小,比特信噪比要求低,因此应用广泛,但是在MPSK调制中,随着M即进制数的增大,相邻相位的间隔变小,即噪声容限变小,因此为了改善在M大时的噪声容限,将振幅调制与相移调制联合起来,信号的振幅和相位作为两个独立的参数可以同时修改,即产生了正交振幅调制(Quadrature Amplitude Modulation)

符合QAM调制的信号任意一个码元可以表示为:

将这个三角函数展开为:

令:

得:

这样变换后,对于每一个QAM符号

,都有唯一的

与之对应

如果以

作为原始信号发生器输出的载波,

与之具有相同的相位,因此称为同相(inphase)载波,

与之有90度的相位差,因此称为正交(quadrature)载波,这也是为什么使用I和Q两个字母的原因

2 16QAM星座图

我们以16QAM信号即16进制的正交振幅调制信号来说明一下星座图是什么

16QAM顾名思义是16进制的,因此16QAM信号应该有16种不同的形式,如果用0/1二进制电平来表示16种不同的信号,需要

个二进制电平,因此如果要表示一个16QAM符号,同样也需要有4个0/1符号来表示

这就是16QAM映射的原理,如果有一串足够长的二进制0/1信号传来,我们想要辨别他们分别对应的是什么16QAM符号,就需要将这串0/1信号每隔四个信号截断然后组成一组,这样每四个0/1信号就对应了一个16QAM符号,因此就可以由一串0/1码元获得一串16QAM的符号,由四个0/1符号对应获得16QAM符号的过程也称为映射

下面是一种常见的16QAM的星座映射图

qam调制原理_正交振幅调制QAM原理分析_16QAM调制解调MATLAB仿真

假设现在有一串0/1码元:0010        1010        1011        0111

传来了16个0/1码元,根据星座图的映射关系,我们可以得到4个16QAM符号:

(-3A,-A)        (3A,-A)        (3A,-3A)        (-3A,3A)

四位二进制码元符号

16QAM符号

0010

(-3A,-A)

1010

(3A,-A)

1011

(3A,-3A)

0111

(-3A,3A)

因此可知,每一个QAM符号有唯一的横坐标与纵坐标与之对应(A通常可以取1)

这与之前说的每一个QAM符号都有唯一的

与之对应相同,同时经过观察也可以发现,

实际上就对应了QAM符号的横坐标与纵坐标

由于信号在传输过程中总会有信道噪声的影响,从而导致接收的信号的坐标并不固定在定义的点上,总会在点的附近有所偏移,从而看上去像星座一样,这也是星座图名称的由来,这在之后的仿真中也有有所涉及

3 调制与解调 3.1 调制与解调框图

直接截取了国防科技大学《通信原理》MOOC中的16QAM调制解调框图

qam调制原理_正交振幅调制QAM原理分析_16QAM调制解调MATLAB仿真

3.2 调制过程 3.2.1 二进制待传输信号的产生

首先,我们先随机产生一串0/1符号组成的信号,这就是我们要传输的目标符号,然后需要注意的是,由于四个0/1符号组成一个16QAM符号,因此为了简单方便,我们产生的符号长度直接是四的整数倍,这样能够产生整数个16QAM符号

Number_data = 40;               %要传输的调制前的0/1码元个数
Ts = 1e-3;                      %码元周期1ms
dt = 1e-5;                      %采样周期0.01ms,采样率100kHz
N = Ts / dt;                    %一个码元周期内码元被采样的次数
t = 0:dt:Number_data * Ts - dt; %采样时间轴
%随机生成原始码元
source_data= randi([0,1],1,Number_data);
%经过采样器以dt的周期采样后得到的采样信号,这里将码元周期设置为采样周期的整数倍,因此直接使用复制函数进行复制即可
signal_baseband = repmat(source_data,[N 1]);
%将复制的基带信号展平成一行,就得到了采样信号
signal_baseband = reshape(signal_baseband,1,[]);

需要注意的是:这里设置的0/1码元周期是1ms,即1s内传输1k个0/1码元符号,频率为1kHz,这是一个低频的基带信号,但是我们采样时的采样率是较高频率的,这里设置为100kHz,因此每一个码元都会被采样器采样100次,这100个值是相同的,为了绘图的连续和流畅性,选择使用频率较高的采样器采样时间轴进行时域波形的绘图

3.2.2 星座图映射到I和Q通道

我们已经知道四个0/1电平对应一个16QAM符号,同时也对应一个I符号和Q符号

一种常见的对应关系是I符号由四个0/1电平中的奇数位得到,Q符号由四个0/1电平中的偶数位得到,即假设传输的四个0/1电平是abcd,I符号由ac得到,Q符号由bd得到

例如传输的四个0/1电平是0110,此时a=0,b=1,c=1,d=0

I符号由ac即01得到,Q符号由bd即10得到

那么I、Q符号与两个0/1电平之间的对应关系到底如何呢,一种常见的对应关系是:

ac/bd

I/Q

11

+3

10

+1

00

-1

01

-3

其一般符合格雷码映射要求,此对应关系能够推出前面给出的16QAM星座图

基于此规律可以获得I通道与Q通道的原始数据(从待传输二进制码元中分别提取奇数位和偶数位得到)

并且根据对应关系,可以获得星座映射后的I符号与Q符号

%由原始信号码元产生I通道码元和Q通道码元
%按照规则将四个0/1码元作为一组,第一和第三个码元组合起来得到I通道,第二和第四个码元组合起来得到Q通道
%I通道原始码元由原始码元奇数位产生
I_raw_data = source_data(1:2:end);
%Q通道原始码元由原始码元偶数位产生
Q_raw_data = source_data(2:2:end);
%进行2-4电平转换,由于原始电平只有0与1两个电平,16QAM调制有-3,-1,1,3四个电平,因此需要进行电平转换,转换规则依照星座图
%这里将11转换为3,10转换为1,00转换为-1,01转换为-3
%I_data和Q_data是2-4电平转换后的I和Q通道码元,取值有-3,-1,1,3
I_data = zeros(1,Number_data/4);
Q_data = zeros(1,Number_data/4);
for i=1:Number_data/4
    %进行I通道的2-4转换
    if [I_raw_data(2*i-1) I_raw_data(2*i)] == [0 1]
            I_data(i) = -3;
    elseif [I_raw_data(2*i-1) I_raw_data(2*i)] == [0 0]
            I_data(i) = -1;
    elseif [I_raw_data(2*i-1) I_raw_data(2*i)] == [1 0]
            I_data(i) = 1;
    elseif [I_raw_data(2*i-1) I_raw_data(2*i)] == [1 1]
            I_data(i) = 3;
    end
    %进行Q通道的2-4转换
    if [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [0 1]
            Q_data(i) = -3;
    elseif [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [0 0]
            Q_data(i) = -1;
    elseif [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [1 0]
            Q_data(i) = 1;
    elseif [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [1 1]
            Q_data(i) = 3;
    end
end
%将I通道码元根据采样率进行复制,形成时域的I通道波形信号
signal_I_raw_baseband = repmat(I_raw_data,[2*N 1]);
signal_I_raw_baseband = reshape(signal_I_raw_baseband,1,[]);
%将Q通道码元根据采样率进行复制,形成时域的Q通道波形信号
signal_Q_raw_baseband = repmat(Q_raw_data,[2*N 1]);
signal_Q_raw_baseband = reshape(signal_Q_raw_baseband,1,[]);

%根据采样率将2-4转换后的I和Q通道码元进行复制生成时域波形
%由于基带信号传输4个0/1电平才能生成一个16QAM符号,即连续4个0/1电平成为一组,因此I和Q通道码元的个数是原始0/1码元的四分之一
%因此这里需要将I和Q码元复制4N次
signal_I_baseband = repmat(I_data,[4*N 1]);
signal_I_baseband = reshape(signal_I_baseband,1,[]);
signal_Q_baseband = repmat(Q_data,[4*N 1]);
signal_Q_baseband = reshape(signal_Q_baseband,1,[]);

3.2.3 绘制基带信号与I通道和Q通道映射前后的时域波形

qam调制原理_16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析

3.2.4 IQ载波调制生成QAM信号

现在我们已经获得了星座映射后(经过电平转换后)的I通道信号与Q通道信号,只需要将I通道信号乘上同相载波

,将Q通道信号乘上正交载波

,然后将这两个信号相加就得到了QAM信号

这是连续信号的表达式,相当于采样频率无限大,我们现在的采样频率是有限的,因此是离散信号,只需要简单的将t换成离散点n即可

其中n指的是离散的第n个点,dt是采样器采样间隔

%载波调制
fc = 10e3; %载波频率10kHz
%生成同相载波和正交载波信号信号,这里的t是以100kHz采样生成的时间轴
signal_I_carrier = cos(2*pi*fc*t);
signal_Q_carrier = -sin(2*pi*fc*t);
%进行载波调制到fc频率上
%将I通道时域信号与同相载波信号相乘,Q通道时域信号与正交载波信号相乘
signal_I_modulation = signal_I_baseband .* signal_I_carrier;
signal_Q_modulation = signal_Q_baseband .* signal_Q_carrier;
%将I通道与Q通道时域调制信号相加得到最终的调制后的QAM时域信号
signal_QAM = signal_I_modulation + signal_Q_modulation;

但是信道不可能无噪声无干扰,这里只考虑信道是一个加性高斯白噪声信道(AWGN)

%设置高斯白噪声信道信噪比(dB)
SNRdB = 10;
%给调制后的QAM时域信号根据信噪比添加高斯白噪声,相当于经过一个加性高斯白噪声信道(AWGN)
signal_QAM_AWGN = awgn(signal_QAM,SNRdB);

3.2.5 绘制调制后的I通道与Q通道以及经过信道前后的QAM时域波形

16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析_qam调制原理

3.3 解调过程

QAM信号解调的原理是将时域上的QAM信号分别与同相载波

和正交载波

相乘后经过低通滤波得到I通道和Q通道的值,现在从公式上来验证其可行性

经过采样后的QAM信号可以表示如下:

与同相载波

相乘后得到结果:

16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析_qam调制原理

与正交载波

相乘后得到结果:

正交振幅调制QAM原理分析_16QAM调制解调MATLAB仿真_qam调制原理

经过观察后可以发现,与同相载波相乘后得到的信号有一个低频分量

,只是幅度变为了原来的一半,剩余的都是角频率为

的高频分量,如果经过低通滤波器后会被滤除

经过观察后可以发现,与正交载波相乘后得到的信号有一个低频分量

,只是幅度变为了原来的一半,剩余的都是角频率为

的高频分量,如果经过低通滤波器后会被滤除

因此将QAM信号分别与同相载波与正交载波相乘后的信号通过低通滤波器,再乘以系数2补偿幅度的衰减,就可以获得

信号

3.3.1 低通滤波器的设计

MATLAB可以使用fir1函数设计低通滤波器,需要提供滤波器的阶数,归一化截止频率等参数

由于采样率是100kHz,根据奈奎斯特采样定律,其能采样的最高频率是100kHz/2=50kHz,其对应了归一化频率中的π

需要注意的是:QAM信号经过与相干载波相乘后的信号包含低频分量与高频分量,其高频分量的频率在两倍载波频率附近,这里大约是20kHz。低频分量频率分布在直流附近,其实也就是

信号的频率

由于二进制待传输信号的码元速率设置的是1kHz,因此其二进制待传输信号的最大频率不会超过500Hz(仅当二进制信号以0/1电平交替时能取到),而四个二进制码元才对应一个

,因此I通道和Q通道信号的实际频率只会更低

因此这里低通滤波器的设计只需要将截止频率设置为二进制码元传输的频率(1kHz),就可以在保证

低频信号通过的同时,滤除高频的载波信号,从而获得

Rb = 1/Ts;              %码元周期Ts,码元速率1kHz,1s传输1k个0/1码元,因此最高基带频率不会超过1kHz
f_sampling = 1/dt;      %以dt=1e-5为采样间隔进行采样,采样频率是1/dt=100kHz
%设置低通滤波器,采样频率是100kHz,根据奈奎斯特采样定律,能采样的信号频率最高是100kHz/2=50kHz
%因此归一化频率最大值pi处等于50kHz
%得到低通滤波器的归一化截止频率为Rb/(f_sampling/2)=1kHz/(100kHz/2)=1/50
%30为低通滤波器的阶数
b = fir1(30,Rb/(f_sampling/2),"low");
%获得低通滤波器的幅频响应,H为幅度,W为归一化频率
%b为低通滤波器多项式参数,fir滤波器第二个参数恒定为1,512为幅频响应采样点数,默认512,如需更加精确可以增大点数
[H,W] = freqz(b,1,512);

3.3.2 绘制低通滤波器幅频响应

16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析_qam调制原理

3.3.3 QAM信号相干解调后低通滤波

将含噪声的QAM信号分别与同相载波和正交载波相乘后经过设计好的低通滤波器

%将含噪的QAM时域信号分别与同相载波和正交载波相乘进行解调制操作
%得到I通道信号经过相干载波相乘的时域信号
signal_I_multiplied = signal_QAM_AWGN .* signal_I_carrier;
%得到Q通道信号经过相干载波相乘的时域信号
signal_Q_multiplied = signal_QAM_AWGN .* signal_Q_carrier;

%分别将经过相干载波相乘后的I通道和Q通道时域信号通道该低通滤波器
signal_I_filtered = filtfilt(b,1,signal_I_multiplied);
signal_Q_filtered = filtfilt(b,1,signal_Q_multiplied);
%由于与相干载波相乘后经过低通滤波器会有一个1/2的幅度衰减,在这里进行补偿,方便后面进行抽样判决
signal_I_filtered = 2 * signal_I_filtered;
signal_Q_filtered = 2 * signal_Q_filtered;

3.3.4 绘制IQ通道信号低通滤波前后的时域波形

16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析_qam调制原理

3.3.5 抽样判决

经过低通滤波之后,我们得到了I通道信号和Q通道信号的时域信号,此时这两个时域信号都是以采样器采样频率100kHz采样的信号,也就是间隔0.01ms取一个值

首先先对低通滤波后的IQ通道信号进行判决,判决的规则很简单,电平值小于等于-2的,判决为-3,电平值在-2到0之间的判决为-1,电平值在0到2之间的判决为1,电平值大于等于2的判决为3

IQ信号电平值

判决后电平值

-3

-1

但是现在仍然有一个问题:采样的频率是二进制码元频率的100倍,而传输四个二进制码元,才能对应一个QAM符号,同时也只对应一个I符号和Q符号

所以对于同一个I符号和Q符号来说,时域波形上会有400个采样点与其对应,那应该取哪一个作为实际的I符号和Q符号的值呢,这里一个最简单的思路就是取400个点的最中间的点,也就是第200个点作为最终I符号和Q符号的取值

%进行抽样判决,先新建两个变量用来存储经过低通滤波后的I和Q通道时域信号
signal_I_judgement = signal_I_filtered;
signal_Q_judgement = signal_Q_filtered;
%在抽样点上进行抽样,这里抽样频率设置的与之前的采样频率一样
%抽样判决的原理是在抽样点上将小于-2的值判断为-3,将-2~0的值判断为-1,将0~2的值判断为1,将大于2的值判断为3
%I通道与Q通道都进行抽样判决
signal_I_judgement(signal_I_judgement >= 2) = 3;
signal_I_judgement(signal_I_judgement > 0 & signal_I_judgement < 2) = 1;
signal_I_judgement(signal_I_judgement < 0 & signal_I_judgement > -2) = -1;
signal_I_judgement(signal_I_judgement <= -2) = -3;
signal_Q_judgement(signal_Q_judgement >= 2) = 3;
signal_Q_judgement(signal_Q_judgement > 0 & signal_Q_judgement < 2) = 1;
signal_Q_judgement(signal_Q_judgement < 0 & signal_Q_judgement > -2) = -1;
signal_Q_judgement(signal_Q_judgement <= -2) = -3;

%由于抽样判决时的抽样频率与采样频率一样,是码元频率的N倍,因此选择码元周期的中间值作为实际判决获得的码元值
%由于采样频率是码元频率的N倍,因此原始0/1基带信号传输一个0/1电平,采样了N次,会有N个重复的点
%由因为四个基带的0/1码元才能组成一个16QAM符号,所以经过串并变换后的QAM符号的频率应该是基带码元频率的1/4,即周期变为4Ts
%而又因为一个16QAM符号由4个基带0/1信号组成,一个16QAM符号也由一个I通道符号与一个Q通道符号组成
%因此在无噪声干扰的情况下,I通道码元和Q通道码元在4个基带码元周期内应该是完全一样的,同时在4N个采样器周期内也应该是一样的
%因此间隔4N个采样点取一次值
I_judgement_data = signal_I_judgement(2*N-1:4*N:end);
Q_judgement_data = signal_Q_judgement(2*N-1:4*N:end);
%将判决后得到的实际I通道和Q通道码元符号复制,绘制时域波形(这里仅仅是为了绘制波形进行比较)
signal_I_demodulation = repmat(I_judgement_data,[4*N 1]);
signal_I_demodulation = reshape(signal_I_demodulation,1,[]);
signal_Q_demodulation = repmat(Q_judgement_data,[4*N 1]);
signal_Q_demodulation = reshape(signal_Q_demodulation,1,[]);

3.3.6 绘制判决后和抽样后的IQ通道时域波形

16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析_qam调制原理

3.3.7 IQ通道符号逆星座映射

我们已经知道了四个二进制符号通过星座图与一个QAM符号唯一对应,同时也与一个I符号和Q符号唯一对应

现在经过抽样判决已经获得了I通道符号和Q通道符号,因此可以根据规则得到与其唯一对应的QAM符号和四个二进制符号,实际过程就是2-4电平转换的逆过程

I/Q

ac/bd

+3

11

+1

10

-1

00

-3

01

%初始化I通道与Q通道的4-2电平转换码元
I_demodulation_data = [];
Q_demodulation_data = [];
%这里进行16QAM的解映射
%将3解映射为11,1解映射为10,-1解映射为00,-3解映射为01
for i = 1:Number_data / 4
    switch I_judgement_data(i)
        case 3
            I_demodulation_data = [I_demodulation_data 1 1];
        case 1
            I_demodulation_data = [I_demodulation_data 1 0];
        case -1
            I_demodulation_data = [I_demodulation_data 0 0];
        case -3
            I_demodulation_data = [I_demodulation_data 0 1];
    end
    switch Q_judgement_data(i)
        case 3
            Q_demodulation_data = [Q_demodulation_data 1 1];
        case 1
            Q_demodulation_data = [Q_demodulation_data 1 0];
        case -1
            Q_demodulation_data = [Q_demodulation_data 0 0];
        case -3
            Q_demodulation_data = [Q_demodulation_data 0 1];
    end
end

3.3.8 恢复信号

现在得到了I符号和Q符号的二进制表达形式,由于之前的变换是按照I符号取二进制待传输码元的奇数位,Q符号取二进制待传输码元的偶数位得到的,现在只需要将I符号放在恢复信号的奇数位上,Q符号放在恢复信号的偶数位上即可获得最终的恢复信号

%初始化最终解调解映射后的码元向量
QAM_demodulation_data = zeros(1,Number_data);
%根据规则将I通道码元放在奇数位置上,将Q通道码元放在偶数位置上
QAM_demodulation_data(1:2:end) = I_demodulation_data;
QAM_demodulation_data(2:2:end) = Q_demodulation_data;
%复制获得最终的时域波形
signal_QAM_demodulation = repmat(QAM_demodulation_data,[N 1]);
signal_QAM_demodulation = reshape(signal_QAM_demodulation,1,[]);

3.3.9 绘制基带信号和回复信号的时域波形

qam调制原理_正交振幅调制QAM原理分析_16QAM调制解调MATLAB仿真

4 频谱分析

为了更加直观的观察时域信号在调制解调过程中频率的变化,可以绘制时域信号的频谱进行观察对比

4.1 绘制基带信号与QAM信号频谱

%进行信号频谱的绘制(这里随机信号是不是应该画功率谱...)
%fft的点数设置,这里取为时域信号的长度,可以根据需要改大,相当于在时域补零,可以让频谱更加精确
Nfft = length(signal_baseband);
%频率分辨力,与采样频率和fft的点数有关
df = f_sampling / Nfft;
%设置频率轴
f = (-Nfft/2:Nfft/2-1) * df;
%计算基带信号的频谱,并将0频率移动到中间
spectrum_signal_baseband = abs(fftshift(abs(fft(signal_baseband,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_baseband = spectrum_signal_baseband / max(spectrum_signal_baseband);

%计算经过AWGN信道后QAM信号的频谱,并将0频率移动到中间
spectrum_signal_QAM_AWGN = abs(fftshift(abs(fft(signal_QAM_AWGN,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_QAM_AWGN = spectrum_signal_QAM_AWGN / max(spectrum_signal_QAM_AWGN);

qam调制原理_16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析

可以看到基带信号也就是二进制待传输码元信号的频率基本分布在直流附近,QAM信号的频谱由于经过了载波的调制,分布在载波频率10kHz附近

4.2 绘制低通滤波前后的IQ通道信号频谱

%计算经过载波相乘后的I通道信号频谱,并将0频率移动到中间
spectrum_signal_I_multiplied = abs(fftshift(abs(fft(signal_I_multiplied,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_I_multiplied = spectrum_signal_I_multiplied / max(spectrum_signal_I_multiplied);
%计算经过载波相乘后的Q通道信号频谱,并将0频率移动到中间
spectrum_signal_Q_multiplied = abs(fftshift(abs(fft(signal_Q_multiplied,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_Q_multiplied = spectrum_signal_Q_multiplied / max(spectrum_signal_Q_multiplied);

%计算经过低通滤波后I通道信号频谱,并将0频率移动到中间
spectrum_signal_I_filtered = abs(fftshift(abs(fft(signal_I_filtered,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_I_filtered = spectrum_signal_I_filtered / max(spectrum_signal_I_filtered);
%计算经过低通滤波后Q通道信号频谱,并将0频率移动到中间
spectrum_signal_Q_filtered = abs(fftshift(abs(fft(signal_Q_filtered,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_Q_filtered = spectrum_signal_Q_filtered / max(spectrum_signal_Q_filtered);

正交振幅调制QAM原理分析_qam调制原理_16QAM调制解调MATLAB仿真

可以发现与相干载波相乘后的IQ通道信号,有低频和高频两种分量,高频分量分布在两倍的载波频率20kHz附近,这与理论相符,经过低通滤波之后只剩下了低频分量

5 星座图分析

经过前文分析可知,I符号和Q符号的最终取值取决于400个采样点的中间时刻,即第200个采样点的值,因此提取这个值来绘制星座图

如果二进制待传输符号的数量较少,例如前文的仿真中仅仅传输了40个二进制符号,相当于只传输了10个QAM符号,无法占满星座图,因此需要将传输的二进制符号数量增多来体现星座图

这里星座图的绘制均以4000个二进制待传输符号为条件进行绘制

%根据低通滤波后的I通道和Q通道信号在抽样判决采样点上的值,这个点的值直接影响了后续的结果
I_filtered_data = signal_I_filtered(2*N-1:4*N:end);
Q_filtered_data = signal_Q_filtered(2*N-1:4*N:end);
%绘制星座图
figure;
scatter(I_filtered_data,Q_filtered_data,"filled");
title(sprintf("%ddB信噪比条件下QAM星座图",SNRdB));
%让坐标轴放在坐标原点
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

正交振幅调制QAM原理分析_qam调制原理_16QAM调制解调MATLAB仿真

qam调制原理_16QAM调制解调MATLAB仿真_正交振幅调制QAM原理分析

qam调制原理_正交振幅调制QAM原理分析_16QAM调制解调MATLAB仿真

qam调制原理_正交振幅调制QAM原理分析_16QAM调制解调MATLAB仿真

观察不同信噪比条件下的星座图可知:随着信噪比的降低,星座图变的越来越散乱,与理论值的距离变大,会造成误码率的上升

6 完整代码

clc;
clear;
close all;
Number_data = 40;               %要传输的调制前的0/1码元个数
Ts = 1e-3;                      %码元周期1ms
dt = 1e-5;                      %采样周期0.01ms,采样率100kHz
N = Ts / dt;                    %一个码元周期内码元被采样的次数
t = 0:dt:Number_data * Ts - dt; %采样时间轴
%随机生成原始码元
source_data= randi([0,1],1,Number_data);
%经过采样器以dt的周期采样后得到的采样信号,这里将码元周期设置为采样周期的整数倍,因此直接使用复制函数进行复制即可
signal_baseband = repmat(source_data,[N 1]);
%将复制的基带信号展平成一行,就得到了采样信号
signal_baseband = reshape(signal_baseband,1,[]);
%由原始信号码元产生I通道码元和Q通道码元
%按照规则将四个0/1码元作为一组,第一和第三个码元组合起来得到I通道,第二和第四个码元组合起来得到Q通道
%I通道原始码元由原始码元奇数位产生
I_raw_data = source_data(1:2:end);
%Q通道原始码元由原始码元偶数位产生
Q_raw_data = source_data(2:2:end);
%进行2-4电平转换,由于原始电平只有0与1两个电平,16QAM调制有-3,-1,1,3四个电平,因此需要进行电平转换,转换规则依照星座图
%这里将11转换为3,10转换为1,00转换为-1,01转换为-3
%I_data和Q_data是2-4电平转换后的I和Q通道码元,取值有-3,-1,1,3
I_data = zeros(1,Number_data/4);
Q_data = zeros(1,Number_data/4);
for i=1:Number_data/4
    %进行I通道的2-4转换
    if [I_raw_data(2*i-1) I_raw_data(2*i)] == [0 1]
            I_data(i) = -3;
    elseif [I_raw_data(2*i-1) I_raw_data(2*i)] == [0 0]
            I_data(i) = -1;
    elseif [I_raw_data(2*i-1) I_raw_data(2*i)] == [1 0]
            I_data(i) = 1;
    elseif [I_raw_data(2*i-1) I_raw_data(2*i)] == [1 1]
            I_data(i) = 3;
    end
    %进行Q通道的2-4转换
    if [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [0 1]
            Q_data(i) = -3;
    elseif [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [0 0]
            Q_data(i) = -1;
    elseif [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [1 0]
            Q_data(i) = 1;
    elseif [Q_raw_data(2*i-1) Q_raw_data(2*i)] == [1 1]
            Q_data(i) = 3;
    end
end
%将I通道码元根据采样率进行复制,形成时域的I通道波形信号
signal_I_raw_baseband = repmat(I_raw_data,[2*N 1]);
signal_I_raw_baseband = reshape(signal_I_raw_baseband,1,[]);
%将Q通道码元根据采样率进行复制,形成时域的Q通道波形信号
signal_Q_raw_baseband = repmat(Q_raw_data,[2*N 1]);
signal_Q_raw_baseband = reshape(signal_Q_raw_baseband,1,[]);
%绘制原始基带信号时域波形
figure;
subplot(511);
plot(t,signal_baseband,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-1 2]);
title("基带信号");
%绘制原始基带信号转换后的I通道时域波形(0/1)电平
subplot(512);
plot(t,signal_I_raw_baseband,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-1 2]);
title("I通道原始信号");
%绘制原始基带信号转换后的Q通道时域波形(0/1)电平
subplot(513);
plot(t,signal_Q_raw_baseband,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-1 2]);
title("Q通道原始信号");
%根据采样率将2-4转换后的I和Q通道码元进行复制生成时域波形
%由于基带信号传输4个0/1电平才能生成一个16QAM符号,即连续4个0/1电平成为一组,因此I和Q通道码元的个数是原始0/1码元的四分之一
%因此这里需要将I和Q码元复制4N次
signal_I_baseband = repmat(I_data,[4*N 1]);
signal_I_baseband = reshape(signal_I_baseband,1,[]);
signal_Q_baseband = repmat(Q_data,[4*N 1]);
signal_Q_baseband = reshape(signal_Q_baseband,1,[]);
%绘制2-4电平转换后的I通道时域波形(-3/-1/1/3)
subplot(514);
plot(t,signal_I_baseband,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-4 4]);
title("电平转换后I通道信号");
%绘制2-4电平转换后的Q通道时域波形(-3/-1/1/3)
subplot(515);
plot(t,signal_Q_baseband,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-4 4]);
title("电平转换后Q通道信号");
%载波调制
fc = 10e3; %载波频率10kHz
%生成同相载波和正交载波信号信号,这里的t是以100kHz采样生成的时间轴
signal_I_carrier = cos(2*pi*fc*t);
signal_Q_carrier = -sin(2*pi*fc*t);
%进行载波调制到fc频率上
%将I通道时域信号与同相载波信号相乘,Q通道时域信号与正交载波信号相乘
signal_I_modulation = signal_I_baseband .* signal_I_carrier;
signal_Q_modulation = signal_Q_baseband .* signal_Q_carrier;
%将I通道与Q通道时域调制信号相加得到最终的调制后的QAM时域信号
signal_QAM = signal_I_modulation + signal_Q_modulation;
%设置高斯白噪声信道信噪比(dB)
SNRdB = 10;
%给调制后的QAM时域信号根据信噪比添加高斯白噪声,相当于经过一个加性高斯白噪声信道(AWGN)
signal_QAM_AWGN = awgn(signal_QAM,SNRdB);
%绘制经过载波调制后的I通道时域信号
figure;
subplot(411);
plot(t,signal_I_modulation);
ylim([-4 4]);
title("I通道信号");
%绘制经过载波调制后的Q通道时域信号
subplot(412);
plot(t,signal_Q_modulation);
ylim([-4 4]);
title("Q通道信号");
xlabel("时间/s");
ylabel("幅度");
%绘制经过载波调制后的QAM时域信号
subplot(413);
plot(t,signal_QAM);
ylim([-6 6]);
title("QAM信号");
xlabel("时间/s");
ylabel("幅度");
%绘制经过加性高斯白噪声信道后的QAM时域信号
subplot(414);
plot(t,signal_QAM_AWGN);
ylim([-6 6]);
title("QAM信号经过AWGN信道后的信号");
xlabel("时间/s");
ylabel("幅度");
%将含噪的QAM时域信号分别与同相载波和正交载波相乘进行解调制操作
%得到I通道信号经过相干载波相乘的时域信号
signal_I_multiplied = signal_QAM_AWGN .* signal_I_carrier;
%得到Q通道信号经过相干载波相乘的时域信号
signal_Q_multiplied = signal_QAM_AWGN .* signal_Q_carrier;
%绘制与载波相乘后的I通道时域信号
figure;
subplot(411);
plot(t,signal_I_multiplied);
ylim([-6 6]);
title("I通道信号经过相干载波相乘的信号");
xlabel("时间/s");
ylabel("幅度");
%绘制与载波相乘后的Q通道时域信号
subplot(412);
plot(t,signal_Q_multiplied);
ylim([-6 6]);
title("Q通道信号经过相干载波相乘的信号");
xlabel("时间/s");
ylabel("幅度");
Rb = 1/Ts;              %码元周期Ts,码元速率1kHz,1s传输1k个0/1码元,因此最高基带频率不会超过1kHz
f_sampling = 1/dt;      %以dt=1e-5为采样间隔进行采样,采样频率是1/dt=100kHz
%设置低通滤波器,采样频率是100kHz,根据奈奎斯特采样定律,能采样的信号频率最高是100kHz/2=50kHz
%因此归一化频率最大值pi处等于50kHz
%得到低通滤波器的归一化截止频率为Rb/(f_sampling/2)=1kHz/(100kHz/2)=1/50
%30为低通滤波器的阶数
b = fir1(30,Rb/(f_sampling/2),"low");
%获得低通滤波器的幅频响应,H为幅度,W为归一化频率
%b为低通滤波器多项式参数,fir滤波器第二个参数恒定为1,512为幅频响应采样点数,默认512,如需更加精确可以增大点数
[H,W] = freqz(b,1,512);
%分别将经过相干载波相乘后的I通道和Q通道时域信号通道该低通滤波器
signal_I_filtered = filtfilt(b,1,signal_I_multiplied);
signal_Q_filtered = filtfilt(b,1,signal_Q_multiplied);
%由于与相干载波相乘后经过低通滤波器会有一个1/2的幅度衰减,在这里进行补偿,方便后面进行抽样判决
signal_I_filtered = 2 * signal_I_filtered;
signal_Q_filtered = 2 * signal_Q_filtered;
%绘制低通滤波后的I通道时域信号
subplot(413);
plot(t,signal_I_filtered,"LineWidth",2);
ylim([-4 4]);
title("经过低通滤波后I通道信号");
xlabel("时间/s");
ylabel("幅度");
%绘制低通滤波后的Q通道时域信号
subplot(414);
plot(t,signal_Q_filtered,"LineWidth",2);
ylim([-4 4]);
title("经过低通滤波后Q通道信号");
xlabel("时间/s");
ylabel("幅度");
%进行抽样判决,先新建两个变量用来存储经过低通滤波后的I和Q通道时域信号
signal_I_judgement = signal_I_filtered;
signal_Q_judgement = signal_Q_filtered;
%在抽样点上进行抽样,这里抽样频率设置的与之前的采样频率一样
%抽样判决的原理是在抽样点上将小于-2的值判断为-3,将-2~0的值判断为-1,将0~2的值判断为1,将大于2的值判断为3
%I通道与Q通道都进行抽样判决
signal_I_judgement(signal_I_judgement >= 2) = 3;
signal_I_judgement(signal_I_judgement > 0 & signal_I_judgement < 2) = 1;
signal_I_judgement(signal_I_judgement < 0 & signal_I_judgement > -2) = -1;
signal_I_judgement(signal_I_judgement <= -2) = -3;
signal_Q_judgement(signal_Q_judgement >= 2) = 3;
signal_Q_judgement(signal_Q_judgement > 0 & signal_Q_judgement < 2) = 1;
signal_Q_judgement(signal_Q_judgement < 0 & signal_Q_judgement > -2) = -1;
signal_Q_judgement(signal_Q_judgement <= -2) = -3;
%绘制判决后的I通道时域信号,应该只有-3,-1,1,3四种值
figure;
subplot(411);
plot(t,signal_I_judgement,"LineWidth",2);
ylim([-4 4]);
title("经过判决后I通道信号");
xlabel("时间/s");
ylabel("幅度");
%绘制判决后的Q通道时域信号,应该只有-3,-1,1,3四种值
subplot(412);
plot(t,signal_Q_judgement,"LineWidth",2);
ylim([-4 4]);
title("经过判决后Q通道信号");
xlabel("时间/s");
ylabel("幅度");
%由于抽样判决时的抽样频率与采样频率一样,是码元频率的N倍,因此选择码元周期的中间值作为实际判决获得的码元值
%由于采样频率是码元频率的N倍,因此原始0/1基带信号传输一个0/1电平,采样了N次,会有N个重复的点
%由因为四个基带的0/1码元才能组成一个16QAM符号,所以经过串并变换后的QAM符号的频率应该是基带码元频率的1/4,即周期变为4Ts
%而又因为一个16QAM符号由4个基带0/1信号组成,一个16QAM符号也由一个I通道符号与一个Q通道符号组成
%因此在无噪声干扰的情况下,I通道码元和Q通道码元在4个基带码元周期内应该是完全一样的,同时在4N个采样器周期内也应该是一样的
%因此间隔4N个采样点取一次值
I_judgement_data = signal_I_judgement(2*N-1:4*N:end);
Q_judgement_data = signal_Q_judgement(2*N-1:4*N:end);
%将判决后得到的实际I通道和Q通道码元符号复制,绘制时域波形(这里仅仅是为了绘制波形进行比较)
signal_I_demodulation = repmat(I_judgement_data,[4*N 1]);
signal_I_demodulation = reshape(signal_I_demodulation,1,[]);
signal_Q_demodulation = repmat(Q_judgement_data,[4*N 1]);
signal_Q_demodulation = reshape(signal_Q_demodulation,1,[]);
%绘制周期中间值采样判决后的I通道时域信号
subplot(413);
plot(t,signal_I_demodulation,"LineWidth",2);
ylim([-4 4]);
title("抽样判决得到解调后的I通道信号");
xlabel("时间/s");
ylabel("幅度");
%绘制周期中间值采样判决后的Q通道时域信号
subplot(414);
plot(t,signal_Q_demodulation,"LineWidth",2);
ylim([-4 4]);
title("抽样判决得到解调后的Q通道信号");
xlabel("时间/s");
ylabel("幅度");
%初始化I通道与Q通道的4-2电平转换码元
I_demodulation_data = [];
Q_demodulation_data = [];
%这里进行16QAM的解映射
%将3解映射为11,1解映射为10,-1解映射为00,-3解映射为01
for i = 1:Number_data / 4
    switch I_judgement_data(i)
        case 3
            I_demodulation_data = [I_demodulation_data 1 1];
        case 1
            I_demodulation_data = [I_demodulation_data 1 0];
        case -1
            I_demodulation_data = [I_demodulation_data 0 0];
        case -3
            I_demodulation_data = [I_demodulation_data 0 1];
    end
    switch Q_judgement_data(i)
        case 3
            Q_demodulation_data = [Q_demodulation_data 1 1];
        case 1
            Q_demodulation_data = [Q_demodulation_data 1 0];
        case -1
            Q_demodulation_data = [Q_demodulation_data 0 0];
        case -3
            Q_demodulation_data = [Q_demodulation_data 0 1];
    end
end
%初始化最终解调解映射后的码元向量
QAM_demodulation_data = zeros(1,Number_data);
%根据规则将I通道码元放在奇数位置上,将Q通道码元放在偶数位置上
QAM_demodulation_data(1:2:end) = I_demodulation_data;
QAM_demodulation_data(2:2:end) = Q_demodulation_data;
%复制获得最终的时域波形
signal_QAM_demodulation = repmat(QAM_demodulation_data,[N 1]);
signal_QAM_demodulation = reshape(signal_QAM_demodulation,1,[]);
%绘制基带信号时域波形
figure;
subplot(211);
plot(t,signal_baseband,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-1 2]);
title("基带信号");
%绘制经过调制,信道传输,解调后的恢复的信号时域波形
subplot(212);
plot(t,signal_QAM_demodulation,"LineWidth",2);
xlabel("时间/s");
ylabel("幅度");
ylim([-1 2]);
title("恢复码元后信号");
%进行信号频谱的绘制(这里随机信号是不是应该画功率谱...)
%fft的点数设置,这里取为时域信号的长度,可以根据需要改大,相当于在时域补零,可以让频谱更加精确
Nfft = length(signal_baseband);
%频率分辨力,与采样频率和fft的点数有关
df = f_sampling / Nfft;
%设置频率轴
f = (-Nfft/2:Nfft/2-1) * df;
%计算基带信号的频谱,并将0频率移动到中间
spectrum_signal_baseband = abs(fftshift(abs(fft(signal_baseband,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_baseband = spectrum_signal_baseband / max(spectrum_signal_baseband);
%绘制基带信号的频谱
figure;
subplot(211);
plot(f,spectrum_signal_baseband);
xlabel("频率/Hz");
ylabel("归一化幅度");
title("基带信号频谱");
%计算经过AWGN信道后QAM信号的频谱,并将0频率移动到中间
spectrum_signal_QAM_AWGN = abs(fftshift(abs(fft(signal_QAM_AWGN,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_QAM_AWGN = spectrum_signal_QAM_AWGN / max(spectrum_signal_QAM_AWGN);
%绘制经过信道后的QAM信号频谱
subplot(212);
plot(f,spectrum_signal_QAM_AWGN);
xlabel("频率/Hz");
ylabel("归一化幅度");
title("经过信道后的QAM信号频谱");
%计算经过载波相乘后的I通道信号频谱,并将0频率移动到中间
spectrum_signal_I_multiplied = abs(fftshift(abs(fft(signal_I_multiplied,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_I_multiplied = spectrum_signal_I_multiplied / max(spectrum_signal_I_multiplied);
%绘制与载波相乘后I通道信号频谱
figure;
subplot(411);
plot(f,spectrum_signal_I_multiplied);
xlabel("频率/Hz");
ylabel("归一化幅度");
title("与载波相乘后I通道信号频谱");
%计算经过载波相乘后的Q通道信号频谱,并将0频率移动到中间
spectrum_signal_Q_multiplied = abs(fftshift(abs(fft(signal_Q_multiplied,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_Q_multiplied = spectrum_signal_Q_multiplied / max(spectrum_signal_Q_multiplied);
%绘制与载波相乘后Q通道信号频谱
subplot(412);
plot(f,spectrum_signal_Q_multiplied);
xlabel("频率/Hz");
ylabel("归一化幅度");
title("与载波相乘后Q通道信号频谱");
%计算经过低通滤波后I通道信号频谱,并将0频率移动到中间
spectrum_signal_I_filtered = abs(fftshift(abs(fft(signal_I_filtered,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_I_filtered = spectrum_signal_I_filtered / max(spectrum_signal_I_filtered);
%绘制低通滤波后I通道信号频谱
subplot(413);
plot(f,spectrum_signal_I_filtered);
xlabel("频率/Hz");
ylabel("归一化幅度");
title("低通滤波后I通道信号频谱");
%计算经过低通滤波后Q通道信号频谱,并将0频率移动到中间
spectrum_signal_Q_filtered = abs(fftshift(abs(fft(signal_Q_filtered,Nfft))));
%进行频谱幅值的归一化
spectrum_signal_Q_filtered = spectrum_signal_Q_filtered / max(spectrum_signal_Q_filtered);
%绘制低通滤波后Q通道信号频谱
subplot(414);
plot(f,spectrum_signal_Q_filtered);
xlabel("频率/Hz");
ylabel("归一化幅度");
title("低通滤波后Q通道信号频谱");
%根据低通滤波后的I通道和Q通道信号在抽样判决采样点上的值,这个点的值直接影响了后续的结果
I_filtered_data = signal_I_filtered(2*N-1:4*N:end);
Q_filtered_data = signal_Q_filtered(2*N-1:4*N:end);
%绘制星座图
figure;
scatter(I_filtered_data,Q_filtered_data,"filled");
title(sprintf("%ddB信噪比条件下QAM星座图",SNRdB));
%让坐标轴放在坐标原点
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
%绘制低通滤波器的幅频响应
figure;
plot(W/pi*f_sampling/2,20*log10(abs(H)),"LineWidth",2);
title("低通滤波器幅频响应");
xlim([0 f_sampling/2]);
xlabel("频率/Hz");
ylabel("幅频相应/dB");

7 结语

作者水平有限,如文中原理和代码有错误,欢迎大家积极评论提出指正

主页有联系方式,欢迎交流讨论

两会靳东提案引关注!AI 换脸从好玩到成社会毒瘤咋回事?
« 上一篇 2026-06-20
调制与解调的意义及16QAM调制解调步骤全解析
下一篇 » 2026-06-20