1.算法概述
正交振幅调制是利用已调信号在相同带宽内的频谱正交来实现两路并行的数据信息传输,其信道频带利用率与单边带调制一样,主要用于高速数据传输系统中。QAM系统组成框图如下所示。
发送端形成的正交振幅调制信号为:
假设接收端所产生的的相干载波与发送端完全相同,那么,相互正交的两路解调器的输出分别为:
经低通滤波后,上、下两支路输出的基带波形分别为
QAM调制(正交幅度调制)中,数据信号由相互正交的两个载波的幅度变化表示。模拟信号的相位调制和数字信号的PSK(相移键控)可以被认为是幅度不变、仅有相位变化的特殊的正交幅度调制。模拟信号频率调制和数字信号的FSK(频移键控)也可以被认为是QAM的特例,因为它们本质上就是相位调制。接收端完成相反过程,正交解调出两个相反码流,均衡器补偿由信道引起的失真,判决器识别复数信号并映射回原来的二进制信号。
QAM是一种矢量调制,将输入比特先映射(一般采用格雷码)到一个复平面(星座)上,形成复数调制符号,然后将符号的I、Q分量(对应复平面的实部和虚部,也就是水平和垂直方向)采用幅度调制,分别对应两个在时域上正交的载波(cosot和sinot)。这样与幅度调制(AM)相比,其频谱利用率将提高一倍。QAM是幅度、相位联合调制的技术,它同时利用了载波的幅度和相位来传递信息比特,因此在最小距离相同的条件下可实现更高的频带利用率,QAM最高已达到1024-QAM(1024个样点)。样点数目越多,其传输效率越高,例如具有16个样点的16-QAM信号,每个样点表示一种矢量状态,16-QAM有16态,每4位二进制数规定了16态中的一态,16-QAM中规定了16种载波和相位的组合。
在QAM(正交幅度调制)中,数据信号由相互正交的两个载波的幅度变化表示。模拟信号的相位调制和数字信号的PSK(相移键控)可以被认为是幅度不变、仅有相位变化的特殊的正交幅度调制。因此,模拟信号相位调制和数字信号的PSK(相移键控)也可以被认为是QAM的特例,因为其本质上就是相位调制。
QAM是一种矢量调制,将输入比特先映射(一般采用格雷码)到一个复平面(星座)上,形成复数调制符号,然后将符号的I、Q分量(对应复平面的实部和虚部,也就是水平和垂直方向)采用幅度调制,分别对应调制在相互正交(时域正交)的两个载波(coswt和sinwt)上。这样与幅度调制(AM)相比,其频谱利用率将提高1倍。QAM是幅度、相位联合调制的技术,它同时利用了载波的幅度和相位来传递信息比特,因此在最小距离相同的条件下可实现更高的频带利用率,QAM最高已达到1024-QAM(1024个样点)。样点数目越多,其传输效率越高,例如具有16个样点的16-QAM信号,每个样点表示一种矢量状态,16-QAM有16态,每4位二进制数规定了16态中的一态,16-QAM中规定了16种载波和相位的组合,16-QAM的每个符号和周期传送4比特。
QAM调制器的原理是发送数据在比特/符号编码器(也就是串–并转换器)内被分成两路,各为原来两路信号的1/2,然后分别与一对正交调制分量相乘,求和后输出。接收端完成相反过程,正交解调出两个相反码流,均衡器补偿由信道引起的失真,判决器识别复数信号并映射回原来的二进制信号。如图2所示的是16-QAM的调制原理图。作为调制信号的输入二进制数据流经过串–并变换后变成四路并行数据流。这四路数据两两结合,分别进入两个电平转换器,转换成两路4电平数据。例如,00转换成-3,01转换成-1,10转换成1,11转换成3。这两路4电平数据g1(t)和g2(t)分别对载波cos2πfct和sin2πfct进行调制,然后相加,即可得到16-QAM信号。
采用QAM调制技术,信道带宽至少要等于码元速率,为了定时恢复,还需要另外的带宽,要增加15%左右。与其他调制技术相比,QAM编码具有能充分利用带宽、抗噪声能力强等优点。但QAM调制技术用于ADSL的主要问题是如何适应不同电话线路之间较大的性能差异。要取得较为理想的工作特性,QAM接收器需要一个和发送端具有相同的频谱和相应特性的输入信号用于解码,QAM接收器利用自适应均衡器来补偿传输过程中信号产生的失真,因此采用QAM的ADSL系统的复杂性来自于它的自适应均衡器。
当对数据传输速率的要求高过8-PSK能提供的上限时,采用QAM的调制方式。因为QAM的星座点比PSK的星座点更分散,星座点之间的距离因此更大,所以能提供更好的传输性能。但是QAM星座点的幅度不是完全相同的,所以它的解调器需要能同时正确检测相位和幅度,不像PSK解调只需要检测相位,这增加了QAM解调器的复杂性。
2.仿真效果预览
MATLAB2022A仿真结果:
3.核心MATLAB预览
clear;
close all;
warning off;
addpath(genpath(pwd));
SNRs = -4:28;
[h_fig, h_lines] = QAM_BER_Curves(SNRs);
QAM_BER = zeros(9,length(SNRs));
hold on
simLines = semilogy(SNRs, QAM_BER,'*');
[QAM_BER, QAM_SER] = QAM_Simulate(SNRs, simLines);
A67