主要内容

使用 MATLAB 检查 16-QAM

此示例说明如何使用由基带调制器、信道和解调器组成的通信链路处理数据流。该示例在针状图中显示部分随机数据,在星座图中显示发射和接收信号,并计算误码率 (BER)。要向通信链路添加脉冲整形滤波器,请参阅对 16-QAM 信号使用脉冲整形示例。要向包含脉冲形状滤波的通信链路添加前向纠错,请参阅对 16-QAM 信号使用前向纠错示例。

调制随机信号

调制方案使用基带 16-QAM,信号通过加性高斯白噪声 (AWGN) 信道。基本仿真操作使用以下 Communications Toolbox™ 和 MATLAB® 函数。

生成随机二进制数据流

在 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');

Figure contains an axes object. The axes object with title Random Bits, xlabel Bit Index, ylabel Binary Value contains an object of type stem.

将二进制数据转换为整数值符号

qammod 函数的默认配置要求整数值数据作为要调制的输入符号。在此示例中,二进制数据流在使用 qammod 函数之前预处理为整数值。特别是,bit2int 函数将每个 4 元组转换为 [0, (M–1)] 范围内的一个对应整数。在此示例中,调制阶数 M 为 16。

通过指定每符号的位数(由 k=log2(M) 定义)来执行位到符号的映射。然后,使用 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');

Figure contains an axes object. The axes object with title Random Symbols, xlabel Symbol Index, ylabel Integer Value contains an object of type stem.

使用 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) 通过信道。将每比特能量与噪声功率谱密度之比 (Eb/N0) 转换为 SNR 值,以供 awgn 函数使用。sps 变量在此示例中不重要,但它简化了通过扩展示例以使用脉冲整形的过程。有关详细信息,请参阅对 16-QAM 信号使用脉冲整形示例。

通过使用 convertSNR 函数计算当信道具有 10 dB 的 Eb/N0 时的 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)

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains 2 objects of type line. One or more of the lines displays its values using only markers This object represents Channel 1.

解调 16-QAM

使用 qamdemod 函数解调接收数据并输出整数值数据符号。

dataSymbolsOut = qamdemod(receivedSignal,M,'bin'); % Binary-encoded data symbols
dataSymbolsOutG = qamdemod(receivedSignalG,M);     % Gray-coded data symbols

将整数值符号转换为二进制数据

使用 int2bit 函数将来自 QAM 解调器的二进制编码数据符号转换为长度为 (Nsym×Nbits/sym) 的二进制向量。Nsym 是 QAM 符号的总数,Nbits/sym 是每符号的位数。对于 16-QAM,Nbits/sym = 4。对格雷编码符号重复该过程。

这是此示例前面部分中执行的位到符号映射的逆过程。

dataOut = int2bit(dataSymbolsOut,k);
dataOutG = int2bit(dataSymbolsOutG,k);

计算系统 BER

biterr 函数根据原始二进制数据流 dataIn 和接收的数据流 dataOutdataOutG 计算误码统计量。格雷编码会显著降低 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])

Figure Scatter Plot contains an axes object. The axes object with title 16-QAM Symbol Mapping, xlabel In-Phase, ylabel Quadrature contains 65 objects of type line, text. One or more of the lines displays its values using only markers This object represents Channel 1.

检查绘图

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

另请参阅

函数

主题