Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

MIMO の OFDM のシミュレーション

この例では、単純な 2×2 MIMO の誤り率シミュレーションで OFDM 変調器と復調器を使用する方法を説明します。OFDM パラメーターは 802.11n 標準に基づいています。

QPSK 変調器と復調器のペアを作成します。

qpskMod = comm.QPSKModulator;
qpskDemod = comm.QPSKDemodulator;

ユーザー指定のパイロット インデックス、挿入された 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)

Figure OFDM Subcarrier Mapping for Tx Antenna 1 contains an axes. The axes with title OFDM Subcarrier Mapping for Tx Antenna 1 contains an object of type image.

Figure OFDM Subcarrier Mapping for Tx Antenna 2 contains an axes. The axes with title OFDM Subcarrier Mapping for Tx Antenna 2 contains an object of type image.

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;
data = randi([0 3],nframes*numData,numSym,numTxAnt);

そのランダム シンボルに QPSK 変調を適用し、結果として得られた列ベクトルの形状を OFDM 変調器の要件に合うように変更します。

modData = qpskMod(data(:));
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
    chGain = complex(randn(2,2),randn(2,2))/sqrt(2); % Random 2x2 channel

    % 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 = qpskDemod(receivedOFDMData(:));

    % 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.471154e-02 from 1970 errors in 20800 symbols