Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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)

Figure OFDM Subcarrier Mapping for Tx Antenna 1 contains an axes object. The axes object with title OFDM Subcarrier Mapping for Tx Antenna 1, xlabel OFDM Symbols, ylabel Subcarrier Indices contains an object of type image.

Figure OFDM Subcarrier Mapping for Tx Antenna 2 contains an axes object. The axes object with title OFDM Subcarrier Mapping for Tx Antenna 2, xlabel OFDM Symbols, ylabel Subcarrier Indices 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;
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

参考

関数

オブジェクト

関連するトピック