主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

使用 MATLAB 的 QPSK 和 OFDM

此示例说明如何仿真基本通信系统,该系统使用四相相移键控 (QPSK) 调制信号,然后对其进行正交频分复用 (OFDM)。它再使信号通过加性高斯白噪声信道,然后对信号进行解复用和解调。最后,该系统计算误码数。为了对系统进行建模,此示例说明了 MATLAB® System object™ 的用法。

设置仿真参数。

M = 4;                 % Modulation alphabet
k = log2(M);           % Bits/symbol
numSC = 128;           % Number of OFDM subcarriers
cpLen = 32;            % OFDM cyclic prefix length
maxBitErrors = 100;    % Maximum number of bit errors
maxNumBits = 1e7;      % Maximum number of bits transmitted

构造用于仿真的 System object:OFDM 调制器、OFDM 解调器和错误率计算器。使用名称-值参量设置对象属性。

根据仿真参数设置 OFDM 调制器和解调器对。必须使用 System object 进行 OFDM 加窗,因为在一个符号处应用该方法需要有关前一个符号的采样的信息。System object 将此信息保存为内部状态。有关详细信息,请参阅OFDM Raised Cosine Windowing

ofdmMod = comm.OFDMModulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen, ...
    Windowing=true, ...
    WindowLength=16);
ofdmDemod = comm.OFDMDemodulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen);

创建错误率计算器。将 ResetInputPort 属性设置为 true,以便可以在仿真期间重置它。

errorRate = comm.ErrorRate(ResetInputPort=true);

要确定 OFDM 调制器的输入和输出维度,请使用 ofdmMod 对象的 info 函数

ofdmDims = info(ofdmMod)
ofdmDims = struct with fields:
    DataInputSize: [117 1]
       OutputSize: [160 1]

ofdmDims 结构体变量确定数据子载波数。

numDC = ofdmDims.DataInputSize(1)
numDC = 
117

根据数据子载波数和每符号的位数确定 OFDM 帧大小(以位为单位)。

frameSize = [k*numDC 1];

基于所需的 Eb/No 范围、每符号的位数以及数据子载波数与子载波总数的比率设置 SNR 向量。

EbNoVec = (0:10)';
snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);

初始化 BER 和错误统计数组。

berVec = zeros(length(EbNoVec),3);
errorStats = zeros(1,3);

在 Eb/No 值的范围内仿真通信链路。对于每个 Eb/No 值,仿真运行到系统记录了 maxBitErrors 或发射的总位数超出 maxNumBits

for m = 1:length(EbNoVec)
    snr = snrVec(m);
    
   while errorStats(2) <= maxBitErrors && errorStats(3) <= maxNumBits
       dataIn = randi([0,1],frameSize);                
       qpskTx = pskmod(dataIn,M,InputType="bit");      
       txSig = ofdmMod(qpskTx);                        
       powerDB = 10*log10(var(txSig));                 
       noiseVar = 10.^(0.1*(powerDB-snr));
       noise = sqrt(noiseVar/2)*complex(randn(size(txSig)), ...
           randn(size(txSig)));
       rxSig = txSig + noise;
       qpskRx = ofdmDemod(rxSig);                      
       dataOut = pskdemod(qpskRx,M,OutputType="bit");  
       errorStats = errorRate(dataIn,dataOut,0);       
   end
    
    berVec(m,:) = errorStats;                          
    errorStats = errorRate(dataIn,dataOut,1);          
end

要确定 QPSK 系统的理论 BER,请使用 berawgn 函数。

berTheory = berawgn(EbNoVec,'psk',M,'nondiff');

为了比较结果,可在同一图上绘制理论数据和仿真数据。

figure
semilogy(EbNoVec,berVec(:,1),'*')
hold on
semilogy(EbNoVec,berTheory)
legend('Simulation','Theory','Location','Best')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
grid on
hold off

Figure contains an axes object. The axes object with xlabel Eb/No (dB), ylabel Bit Error Rate contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Simulation, Theory.