このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MIMO シミュレーションでの OFDM の適用
単純な 2×2 MIMO のエラー レート シミュレーションで OFDM 変調器と復調器を使用します。OFDM パラメーターは 802.11n 標準に基づいています。
ユーザー指定のパイロット インデックス、挿入された DC null、2 つの送信アンテナおよび 2 つの受信アンテナを使用する OFDM 変調器と復調器のペアを作成します。アンテナによって異なるパイロット インデックスを指定します。
ofdmMod = comm.OFDMModulator(FFTLength=128, ... PilotInputPort=true, ... PilotCarrierIndices= ... cat(3,[12; 40; 54; 76; 90; 118],[13; 39; 55; 75; 91; 117]), ... InsertDCNull=true, ... NumTransmitAntennas=2); ofdmDemod = comm.OFDMDemodulator(ofdmMod); ofdmDemod.NumReceiveAntennas = 2;
各送信アンテナのパイロット サブキャリアのリソース マッピングを表示します。図のグレーの線は、パイロット信号の干渉を最小限にするための null サブキャリアの挿入を示しています。
showResourceMapping(ofdmMod)
info
メソッドを使用して、OFDM 変調器の次元を決定します。
ofdmModDim = info(ofdmMod); numData = ofdmModDim.DataInputSize(1); % Number of data subcarriers numSym = ofdmModDim.DataInputSize(2); % Number of OFDM symbols numTxAnt = ofdmModDim.DataInputSize(3); % Number of transmit antennas
データ シンボルを生成して 100 個の OFDM フレームを埋めます。
nframes = 100;
M = 4; % Modulation order to QPSK
data = randi([0 M-1],nframes*numData,numSym,numTxAnt);
そのランダム シンボルに QPSK 変調を適用し、結果として得られた列ベクトルの形状を OFDM 変調器の要件に合うように変更します。
modData = pskmod(data(:),M,pi/4); modData = reshape(modData,nframes*numData,numSym,numTxAnt);
エラー レート カウンターを作成します。
errorRate = comm.ErrorRate;
2×2 のフラット レイリー フェージング チャネルを想定して、100 フレームにわたって OFDM システムのシミュレーションを実行します。単純な最小二乗解を使用してマルチパス フェージングの影響を取り除き、OFDM 波形と QPSK データを復調します。元のデータを復調されたデータと比較して、誤り統計を生成します。
for k = 1:nframes % Find row indices for kth OFDM frame indData = (k-1)*ofdmModDim.DataInputSize(1)+1:k*numData; % Generate random OFDM pilot symbols pilotData = complex(rand(ofdmModDim.PilotInputSize), ... rand(ofdmModDim.PilotInputSize)); % Modulate QPSK symbols using OFDM dataOFDM = ofdmMod(modData(indData,:,:),pilotData); % Create flat, i.i.d., Rayleigh fading channel 2-by-2 channel chGain = complex(randn(2,2),randn(2,2))/sqrt(2); % Pass OFDM signal through Rayleigh and AWGN channels receivedSignal = awgn(dataOFDM*chGain,30); % Apply least squares solution to remove effects of fading channel rxSigMF = chGain.' \ receivedSignal.'; % Demodulate OFDM data receivedOFDMData = ofdmDemod(rxSigMF.'); % Demodulate QPSK data receivedData = pskdemod(receivedOFDMData(:),M,pi/4); % Compute error statistics dataTmp = data(indData,:,:); errors = errorRate(dataTmp(:),receivedData); end
誤りの統計を表示します。
fprintf('\nSymbol error rate = %d from %d errors in %d symbols\n',errors)
Symbol error rate = 9.721154e-02 from 2022 errors in 20800 symbols