使用 MATLAB 检查 16-QAM
此示例说明如何使用由基带调制器、信道和解调器组成的通信链路处理数据流。该示例在针状图中显示部分随机数据,在星座图中显示发射和接收信号,并计算误码率 (BER)。要向通信链路添加脉冲整形滤波器,请参阅对 16-QAM 信号使用脉冲整形示例。要向包含脉冲形状滤波的通信链路添加前向纠错,请参阅对 16-QAM 信号使用前向纠错示例。
调制随机信号
调制方案使用基带 16-QAM,信号通过加性高斯白噪声 (AWGN) 信道。基本仿真操作使用以下 Communications Toolbox™ 和 MATLAB® 函数。
rng- 控制随机数生成randi- 生成随机数据流bit2int- 将二进制数据转换为整数值符号qammod- 使用 16-QAM 进行调制comm.AWGNChannel- 使用 AWGN 损伤发射数据scatterplot- 创建星座图qamdemod- 使用 16-QAM 进行解调int2bit- 将整数值符号转换为二进制数据biterr- 计算系统 BER
生成随机二进制数据流
在 MATLAB 中,表示信号的常规格式是向量或矩阵。数据流的长度(即列向量中的行数)任意设置为 30,000。将 rng 函数设置为其默认状态或任何静态种子值,以便示例产生可复现的结果。然后,使用 randi 函数生成一个包含随机二进制数据流值的列向量。
定义参数。
M = 16; % Modulation order k = log2(M); % Number of bits per symbol n = 30000; % Number of symbols per frame sps = 1; % Number of samples per symbol (oversampling factor) rng default % Use default random number generator dataIn = randi([0 1],n*k,1); % Generate vector of binary data
使用针状图显示随机二进制数据流的前 40 个位的二进制值。在调用 stem 函数时使用冒号 (:) 运算符以选择二进制向量的一部分。
stem(dataIn(1:40),'filled'); title('Random Bits'); xlabel('Bit Index'); ylabel('Binary Value');

将二进制数据转换为整数值符号
qammod 函数的默认配置要求整数值数据作为要调制的输入符号。在此示例中,二进制数据流在使用 qammod 函数之前预处理为整数值。特别是,bit2int 函数将每个 4 元组转换为 [0, (M–1)] 范围内的一个对应整数。在此示例中,调制阶数 M 为 16。
通过指定每符号的位数(由 定义)来执行位到符号的映射。然后,使用 bit2int 函数将每个 4 元组转换为整数值。
dataSymbolsIn = bit2int(dataIn,k);
在针状图中绘制前 10 个符号。
figure; % Create new figure window. stem(dataSymbolsIn(1:10)); title('Random Symbols'); xlabel('Symbol Index'); ylabel('Integer Value');

使用 16-QAM 进行调制
使用 qammod 函数对 dataSymbolsIn 列向量应用相位偏移量为零的 16-QAM 调制,以执行二进制编码和格雷编码的位到符号映射。
dataMod = qammod(dataSymbolsIn,M,'bin'); % Binary-encoded dataModG = qammod(dataSymbolsIn,M); % Gray-encoded
调制操作输出复数列向量,其中包含作为 16-QAM 信号星座图元素的值。此示例后面部分的星座图显示二进制和格雷符号映射。
有关调制函数的详细信息,请参阅Digital Baseband Modulation。有关将格雷编码与相移键控 (PSK) 调制结合使用的示例,请参阅Symbol Mapping Examples。
添加高斯白噪声
调制信号使用 awgn 函数以指定的信噪比 (SNR) 通过信道。将每比特能量与噪声功率谱密度之比 () 转换为 SNR 值,以供 awgn 函数使用。sps 变量在此示例中不重要,但它简化了通过扩展示例以使用脉冲整形的过程。有关详细信息,请参阅对 16-QAM 信号使用脉冲整形示例。
通过使用 convertSNR 函数计算当信道具有 10 dB 的 时的 SNR。
EbNo = 10; snr = convertSNR(EbNo,'ebno', ... samplespersymbol=sps, ... bitspersymbol=k);
使信号通过 AWGN 信道以执行二进制和格雷编码符号映射。
receivedSignal = awgn(dataMod,snr,'measured'); receivedSignalG = awgn(dataModG,snr,'measured');
创建星座图
使用 scatterplot 函数显示调制信号 dataMod 和在信道后接收的含噪信号的同相和正交分量。星座图中存在 AWGN 的影响。
sPlotFig = scatterplot(receivedSignal,1,0,'g.'); hold on scatterplot(dataMod,1,0,'k*',sPlotFig)

解调 16-QAM
使用 qamdemod 函数解调接收数据并输出整数值数据符号。
dataSymbolsOut = qamdemod(receivedSignal,M,'bin'); % Binary-encoded data symbols dataSymbolsOutG = qamdemod(receivedSignalG,M); % Gray-coded data symbols
将整数值符号转换为二进制数据
使用 int2bit 函数将来自 QAM 解调器的二进制编码数据符号转换为长度为 的二进制向量。 是 QAM 符号的总数, 是每符号的位数。对于 16-QAM, = 4。对格雷编码符号重复该过程。
这是此示例前面部分中执行的位到符号映射的逆过程。
dataOut = int2bit(dataSymbolsOut,k); dataOutG = int2bit(dataSymbolsOutG,k);
计算系统 BER
biterr 函数根据原始二进制数据流 dataIn 和接收的数据流 dataOut 及 dataOutG 计算误码统计量。格雷编码会显著降低 BER。
使用错误率函数计算错误统计量。使用 fprintf 函数显示结果。
[numErrors,ber] = biterr(dataIn,dataOut); fprintf('\nThe binary coding bit error rate is %5.2e, based on %d errors.\n', ... ber,numErrors)
The binary coding bit error rate is 2.13e-03, based on 255 errors.
[numErrorsG,berG] = biterr(dataIn,dataOutG); fprintf('\nThe Gray coding bit error rate is %5.2e, based on %d errors.\n', ... berG,numErrorsG)
The Gray coding bit error rate is 1.67e-03, based on 200 errors.
绘制信号星座图
前面显示的星座图绘制了 QAM 星座图中的点,但未指示符号值与星座图点之间的映射。在本节中,星座图指示数据到星座图点的二进制编码和格雷编码映射。
显示 16-QAM 星座图的自然编码和格雷编码二进制符号映射
通过使用二进制编码符号映射和格雷编码符号映射,对完整的星座图点集应用 16-QAM 调制。
M = 16; % Modulation order x = (0:15); % Integer input symbin = qammod(x,M,'bin'); % 16-QAM output (binary-coded) symgray = qammod(x,M,'gray'); % 16-QAM output (Gray-coded)
使用 scatterplot 函数绘制星座图,并用星座图点的二进制(红色)和格雷(绿色)表示对其进行注解。
scatterplot(symgray,1,0,'b*'); for k = 1:M text(real(symgray(k)) - 0.0,imag(symgray(k)) + 0.3, ... dec2base(x(k),2,4),'Color',[0 1 0]); text(real(symgray(k)) - 0.5,imag(symgray(k)) + 0.3, ... num2str(x(k)),'Color',[0 1 0]); text(real(symbin(k)) - 0.0,imag(symbin(k)) - 0.3, ... dec2base(x(k),2,4),'Color',[1 0 0]); text(real(symbin(k)) - 0.5,imag(symbin(k)) - 0.3, ... num2str(x(k)),'Color',[1 0 0]); end title('16-QAM Symbol Mapping') axis([-4 4 -4 4])

检查绘图
使用格雷编码符号映射可改进 BER 性能,因为格雷编码信号星座图点与每个邻点仅一个位不同。使用二进制编码符号映射时,一些相邻的星座图点有两个位不同。例如,1 的二进制编码值 (0 0 0 1) 和 2 的二进制编码值 (0 0 1 0) 有两个位不同(第三个位和第四个位)。