使用 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