メインコンテンツ

ダウンリンク MU-MIMO を使用した NR セル パフォーマンス

この例では、link-to-system マッピングに基づく抽象物理レイヤー (PHY) に焦点を当て、5G Toolbox™ を使用してダウンリンク (DL) マルチユーザー (MU) 多入力多出力 (MIMO) のシステム パフォーマンスを評価する方法を示します。

この例を使用すると、次のことができます。

  • ダウンリンク MU-MIMO のモデル化。

  • MU-MIMO 関連のスケジューラ構成の変更、およびセル パフォーマンスへの影響の観察。

  • さまざまなチャネル遅延プロファイルにおけるセル パフォーマンスの解析。

シミュレーション結果では、セル スループット、スペクトル効率、およびブロック エラー レート (BLER) などの重要性能評価指標 (KPI) に焦点を当てます。

はじめに

MU-MIMO は、セルラー ネットワークの容量を増加させるための重要な機能です。デジタル プリコーディングは、共通の時間リソースおよび周波数リソース上でユーザーの送信を空間的に分離することにより、MU-MIMO を実現します。

DL MU-MIMO において、5G NR 基地局 (gNB) は次のいずれかの手法を使用してプリコーダーを決定します。

  • gNB は、報告されたチャネル状態情報 (CSI) タイプ II プリコーダーを使用します。この手法の詳細については、5G NR ダウンリンク CSI レポートの例を参照してください。

  • 時分割複信 (TDD) システムでは、gNB はチャネルの相反性を使用して、サウンディング基準信号 (SRS) から DL プリコーダーを計算します。この手法の詳細については、TDD Reciprocity-Based PDSCH MU-MIMO Using SRSの例を参照してください。

この例では、gNB は次の 2 つの方式を使用して DL MU-MIMO を実現します。CSI タイプ II プリコーディング、および TDD システムにおける SRS ベースのプリコーディング。

CSI-RS ベースの DL MU-MIMO

次の概要は、CSI-RS ベースの DL MU-MIMO システムにおける gNB およびユーザー端末 (UE) ノードの間の通信プロセスの詳細を示しています。

  • gNB が、CSI 基準信号 (CSI-RS) を送信します。

  • 同一セル内の UE ノードが、CSI-RS からチャネルを推定します。

  • 各 UE が、推定されたチャネルからランク インジケーター (RI)、プリコーダー マトリックス インジケーター (PMI)、およびチャネル品質インジケーター (CQI) を決定します。

  • UE ノードが、RI、PMI、および CQI を gNB に報告します。

  • UE により報告された CSI が、DL ユーザーペアリング アルゴリズムの基礎となります。

  • gNB ノードが、ペアリングされた UE ノードに対して、共有された時間リソースおよび周波数リソース上でプリコーディングされた DL 信号を送信します。

TDD システムにおける SRS ベースの DL MU-MIMO

次の概要は、SRS ベースの DL MU-MIMO システムにおける UE および gNB ノードの間の通信フローの詳細を示しています。

  • UE ノードが、SRS を送信します。

  • gNB が、受信した SRS からアップリンク (UL) チャネルを推定します。

  • gNB ノードが、チャネルの相反性を使用して、SRS から DL チャネルを直接推定します。

  • gNB が、すべての UE ノードからのチャネル推定を使用して、DL ユーザーペアリング アルゴリズムを実行します。

  • gNB ノードが、ペアリングされた UE ノードに対して、共有された時間リソースおよび周波数リソース上でプリコーディングされた DL 信号を送信します。

SRS を使用した UL CSI 推定の詳細については、SRS を使用した NR アップリンク チャネル状態情報の推定の例を参照してください。

SRS-based_MU-MIMO.png

シミュレーションの前提条件

この例では、次の前提条件を仮定します。

  • CSI-RS ポート数は gNB の送信アンテナ数と同じです。

  • SRS アンテナ ポート数は UE ノードの送信アンテナ数と同じです。

  • CSI-RS ベースの MU-MIMO の場合、スケジューラは同一のランクを報告する UE ノード同士のみをペアリングします。したがって、一方の UE ノードがランク 1 を報告し、他方の UE がランク 2 を報告する場合、スケジューラはこれら 2 つの UE ノードをペアリングしません。

  • gNB は、再送信パケットをシングルユーザー (SU) MIMO として送信します。

  • この例において、CSI-RS ベースの DL MU-MIMO では、スケジューラはペアリングされた UE ノードに対する実効的な変調および符号化スキーム (MCS) の計算をサポートしません。代わりにスケジューラは、UE ノードにより報告されたチャネル品質インジケーター (CQI) に対応する MCS を使用します。このため、特に SemiOrthogonalityFactor を 1 未満の値に設定した場合、BLER が高くなる可能性があります。SRS ベースの DL MU-MIMO の場合、スケジューラはペアリングされた UE ノードに対する実効的な MCS およびプリコーディング行列を再計算します。ただし、スケジューラはペアリングの一環としてのランク選択を実行しません。UE ノードは、シングルユーザー MIMO の設定に基づいて選択されたランクを使用します。

  • CSI-RS ベースの MU-MIMO の場合、スケジューラは SemiOrthogonalityFactor および報告された PMI インデックス (i1) をユーザーペアリングに使用します。

  • SRS ベースの MU-MIMO の場合、スケジューラは SRS 測定から得られた広帯域 DL チャネル推定をユーザーペアリングに使用します。

シナリオのシミュレーション

無線ネットワーク シミュレーターを作成します。

rng("default")                             % Reset the random number generator
numFrameSimulation = 50; % Simulation time in terms of number of 10 ms frames
networkSimulator = wirelessNetworkSimulator.init;

duplexType を "TDD" または "FDD" に設定します。SRS ベースの DL MU-MIMO の場合、duplexType を "TDD" に設定しなければなりません。

duplexType = "TDD";

gNB ノードを作成し、以下のパラメーターを指定します。

  • 送信電力 — 34 dBm

  • サブキャリア間隔 — 15 kHz

  • 搬送波周波数 — 2.6 GHz

  • チャネル帯域幅 — 5 MHz

  • 送信アンテナの数 — 32

  • 受信アンテナの数 — 32

  • デュプレックス モード — TDD

  • 受信ゲイン — 11 dB

  • この gNB に接続するすべての UE ノードの SRS 伝送周期性 — 20 スロット

gNBPosition = [0 0 30]; % [x y z] meters position in Cartesian coordinates
gNB = nrGNB(Name="gNB", Position=gNBPosition, TransmitPower=34, SubcarrierSpacing=15000, ...
    CarrierFrequency=2.6e9, ChannelBandwidth=5e6, NumTransmitAntennas=32, ...
    NumReceiveAntennas=32, DuplexMode=duplexType, ReceiveGain=11, ...
    SRSPeriodicityUE=20, NumResourceBlocks=25);

ダウンリンク CSI 測定信号タイプ csiMeasurementSignalDLType を "SRS" に設定します。または、"CSI-RS" に設定することもできます。ユーザーペアリング アルゴリズムは選択したダウンリンク測定信号タイプに依存することに注意してください。

csiMeasurementSignalDLType = "SRS";

以下のフィールドを設定して、DL MU-MIMO の構造体 muMIMOConfiguration を構成します。これらのフィールドの詳細については、configureScheduler関数の名前と値の引数 MUMIMOConfigDL を参照してください。

  • ペアリングされる UE ノードの最大数 — 2

  • レイヤーの最大数 — 8

  • RB の最小数 — 2

  • DL SINR の最小値 — 10 dB

muMIMOConfiguration = struct(MaxNumUsersPaired=2, MaxNumLayers=8, MinNumRBs=2, ...
    MinSINR=10);

configureScheduler 関数を使用して、以下のスケジューラ パラメーターを設定します。

  • リソース割り当てタイプ — 0

  • トランスミッション時間間隔 (TTI) あたりの UE ノードの最大数 — 10

  • MU-MIMO 構成の構造体 — muMIMOConfiguration

  • DL 用 CSI 測定信号 — SRS

allocationType = 0; % Resource allocation type
configureScheduler(gNB, ResourceAllocationType=allocationType, ...
    MaxNumUsersPerTTI=10, MUMIMOConfigDL=muMIMOConfiguration, ...
    CSIMeasurementSignalDL=csiMeasurementSignalDLType);

UE ノードの数を設定し、以下の仕様を使用してすべての UE ノードの位置を計算します。

  • gNB からの UE の相対距離 — 500 (単位はメートル)

  • 水平面における方位角のスイープ範囲 — [-60 60] (単位は度)

numUEs =10; % Number of UE nodes
% For all UEs, specify position in spherical coordinates (r, azimuth, elevation)
% relative to gNB.
ueRelPosition = [ones(numUEs, 1)*500 (rand(numUEs, 1)-0.5)*120 zeros(numUEs, 1)];
% Convert spherical to Cartesian coordinates considering gNB position as origin
[xPos, yPos, zPos] = sph2cart(deg2rad(ueRelPosition(:,2)), ...
    deg2rad(ueRelPosition(:,3)), ueRelPosition(:,1));
% Convert to absolute Cartesian coordinates
uePositions = [xPos yPos zPos] + gNBPosition;
ueNames = "UE-" + (1:size(uePositions,1));

UE ノードを作成します。各 UE について、名前、位置、受信機ゲイン、送信アンテナ数、および受信アンテナ数を指定します。

UEs = nrUE(Name=ueNames, Position=uePositions, ReceiveGain=0, ...
    NumTransmitAntennas=1, NumReceiveAntennas=1);

UE を gNB に接続し、DL 方向でフルバッファ トラフィックを構成します。CSI レポートの周期性 (スロット単位) を指定します。

connectUE(gNB, UEs, FullBufferTraffic="DL", CSIReportPeriodicity=10)

ネットワーク シミュレーターに gNB ノードと UE ノードを追加します。

addNodes(networkSimulator, gNB)
addNodes(networkSimulator, UEs)

リンクレベル チャネルの "N""N" 列の行列を作成します。"N" はセル内のノードの数です。インデックス ("i", "j") の要素には、ノード "i" からノード "j" へのチャネル インスタンスが格納されます。インデックス ("i", "j") の要素が空の場合、ノード "i" からノード "j" へのチャネルが存在しないことを示します。"i" および "j" はノード ID を表します。

% Set delay profile, delay spread (in seconds), and maximum Doppler
% shift (in Hz)
channelConfig = struct(DelayProfile="CDL-C", DelaySpread=10e-9, ...
    MaximumDopplerShift=1);
channels = hNRCreateCDLChannels(channelConfig, gNB, UEs);

channels を使用してカスタム チャネル モデルを作成します。シミュレーターにカスタム チャネルをインストールします。ネットワーク シミュレーターは、転送中のパケットを受信機に渡す前に、パケットにそのチャネルを適用します。

customChannelModel  = hNRCustomChannelModel(channels);
addChannelModel(networkSimulator, @customChannelModel.applyChannelModel)

トレースを記録するには、enableTracestrue に設定します。enableTracesfalse, に設定した場合、シミュレーターはトレースを記録しません。enableTracesfalse に設定すると、シミュレーションを高速化できます。

enableTraces = true;

スケジューリング ロガーと PHY ロガーを設定します。

if enableTraces
    % Create an object for scheduler trace logging
    simSchedulingLogger = helperNRSchedulingLogger(numFrameSimulation, gNB, UEs);
    % Create an object for PHY trace logging
    simPhyLogger = helperNRPhyLogger(numFrameSimulation, gNB, UEs);
end

シミュレーション中の 1 秒あたりのメトリクス プロット更新回数 numMetricPlotUpdates, を指定します。

% This parameter impacts the simulation time
numMetricPlotUpdates =200;

メトリクス ビジュアライザーを設定します。

metricsVisualizer = helperNRMetricsVisualizer(gNB, UEs, ...
    RefreshRate=numMetricPlotUpdates, PlotSchedulerMetrics=true, ...
    PlotPhyMetrics=false,PlotCDFMetrics=true,LinkDirection="DL");

MAT ファイルにログを書き込みます。これらのログはシミュレーション後の解析に使用できます。

if enableTraces
    simulationLogFile = "simulationLogs"; % For logging the simulation traces
end

ネットワーク トポロジを表示します。

networkVisualizer = wirelessNetworkViewer(ShowNodeNames=false);
addNodes(networkVisualizer, gNB)
addNodes(networkVisualizer, UEs)

指定したフレーム数 numFrameSimulation でシミュレーションを実行します。

% Calculate the simulation duration (in seconds)
simulationTime = numFrameSimulation*1e-2;
% Run the simulation
run(networkSimulator, simulationTime);

Figure Wireless Network Viewer contains an axes object. The axes object with xlabel X-axis (m), ylabel Y-axis (m) contains 22 objects of type line. One or more of the lines displays its values using only markers These objects represent nrGNB, nrUE.

Figure ECDF of Block Error Rate (BLER) contains an axes object and another object of type uigridlayout. The axes object with title Average Cell DL BLER, xlabel BLER, ylabel ECDF contains 3 objects of type line, constantline. This object represents Average BLER.

Figure ECDF of Cell Throughput contains an axes object and another object of type uigridlayout. The axes object with title Cell DL Throughput, xlabel Cell Throughput (Mbps), ylabel ECDF contains 3 objects of type line, constantline. This object represents Cell Throughput.

結果の概要

セル スループット、スペクトル効率、およびセル スループットと平均 BLER に関する経験累積分布関数 (ECDF) プロットを含む、システム KPI を表示します。ECDF プロットを使用して、スループットと BLER が "x" 軸に示された特定の値以下になるスロットの割合を特定できます。

% Read performance metrics
displayPerformanceIndicators(metricsVisualizer)
Peak DL throughput: 17.77 Mbps
Achieved cell DL throughput: 19.28 Mbps
Achieved DL throughput for each UE: [1.95        2.02        1.93           2         1.9        1.94        1.93        1.94        1.83        1.83]
Peak DL spectral efficiency: 3.55 bits/s/Hz
Achieved DL spectral efficiency for cell: 3.86 bits/s/Hz
Block error rate for each UE in the DL direction: [0.16       0.165       0.162       0.163       0.181       0.163       0.188       0.181        0.22       0.204]

ブロック エラー レート (BLER) は、複数の要因により発生する可能性があります。これには、CSI-RS 送信などによりスロット内の実際のリソース オーバーヘッドが、トランスポート ブロック サイズ (TBS) の計算で使用されるオーバーヘッド値 (xOH) を上回る状況などが含まれます。3GPP TS 38.214 の Section 5.1.3.2 によると、CSI-RS ポート数を 32 に設定した場合でも、xOH の最大値は 18 です。gNB が 32 ポートを構成した場合、実際のオーバーヘッドが xOH の値を上回る可能性があります。その結果、レート マッチングのパンクチャが増加し、PDSCH と CSI-RS が同一スロットを共有する場合、パケットの復号化が確実に失敗します。

if enableTraces
    simulationLogs = cell(1, 1);
    if gNB.DuplexMode == "FDD"
        logInfo = struct(DLTimeStepLogs=[], ULTimeStepLogs=[], ...
            SchedulingAssignmentLogs=[], PhyReceptionLogs=[]);
        [logInfo.DLTimeStepLogs, logInfo.ULTimeStepLogs] = ...
            getSchedulingLogs(simSchedulingLogger);
    else % TDD
        logInfo = struct(TimeStepLogs=[], SchedulingAssignmentLogs=[], ...
            PhyReceptionLogs=[]);
        logInfo.TimeStepLogs = getSchedulingLogs(simSchedulingLogger);
    end
    % Get the scheduling assignments log
    logInfo.SchedulingAssignmentLogs = getGrantLogs(simSchedulingLogger);
    % Get the PHY reception logs
    logInfo.PhyReceptionLogs = getReceptionLogs(simPhyLogger);
    % Save simulation logs in a MAT-file
    simulationLogs{1} = logInfo;
    save(simulationLogFile, "simulationLogs")
end

DL スロットごとの RB あたりの UE ノードの平均数のヒストグラムを表示します。これは、各 DL 送信スロットにおいて同一の RB に割り当てられた UE ノードの平均数を示します。このメトリクスの計算は、リソース割り当てタイプ 0 および 1 で使用される個別の周波数割り当て方式に従います。

RAT0

RB (スロット) あたりの UE ノードの平均数 =i=1N(Ui×RBGSizei)TotalRB

  • N は、リソース ブロック グループ (RBG) の総数です。

  • Ui は、"i" 番目の RBG に割り当てられた UE ノードの数です。

  • RBGSizei は、"i" 番目の RBG に含まれる RB の数です。

  • TotalRB は、キャリア帯域幅に含まれる RB の総数です。

RAT1

RB (スロット) あたりの UE ノードの平均数 =j=1MUjTotalRB

  • M は、リソース ブロック (RB) の総数です。

  • Uj は、"j" 番目の RB に割り当てられた UE ノードの数です。

  • TotalRB は、キャリア帯域幅に含まれる RB の総数です。

if enableTraces
    avgNumUEsPerRB = calculateAvgUEsPerRBDL(logInfo, gNB.NumResourceBlocks, allocationType, duplexType);
    % Plotting the histogram
    figure
    theme("light")
    histogram(avgNumUEsPerRB, "BinWidth", 0.1);
    title("Distribution of Average Number of UEs per RB in DL Slots");
    xlabel("Average Number of UEs per RB");
    ylabel("Number of Occurrence");
    grid on
end

Figure contains an axes object. The axes object with title Distribution of Average Number of UEs per RB in DL Slots, xlabel Average Number of UEs per RB, ylabel Number of Occurrence contains an object of type histogram.

このヒストグラムは、UE ノード間のペアリングのレベルを表しており、MU-MIMO 送信において複数のユーザーが同一のリソース ブロックを共有する頻度を示しています。

ローカル関数

DL スロットごとの RB あたりの UE ノードの平均数を計算し、このメトリクスを可視化してユーザーペアリングのレベルに関する指標を得ます。

function avgUEsPerRB = calculateAvgUEsPerRBDL(logInfo, numResourceBlocks, ratType, duplexMode)
    %calculateAvgUEsPerRBDL Calculate average number of UE nodes per RB in DL slots.
    %   AVGUESPERRB = calculateAvgUEsPerRBDL(LOGINFO, NUMRESOURCEBLOCKS, RATTYPE,
    %   DUPLEXMODE) calculates the average number of UE nodes per RB for each DL
    %   slot based on the log information.
    %
    %   LOGINFO is a structure containing detailed logs of the simulation.
    %   NUMRESOURCEBLOCKS is an integer specifying the number of resource blocks in
    %   carrier bandwidth RATTYPE is an integer indicating the resource allocation
    %   type (0 or 1). DUPLEXMODE is a string that indicates the duplex mode, which
    %   can be either "TDD" or "FDD".
    %
    %   The function returns AVGUEsPerRB, a vector containing the average number of
    %   UE nodes per RB for each DL slot, allowing for analysis of resource
    %   allocation efficiency.
    
    % Determine the appropriate data source based on the duplex mode
    if strcmp(duplexMode, "TDD")
        timeStepLogs = logInfo.TimeStepLogs;
        freqAllocations = timeStepLogs(:, 5);
    elseif strcmp(duplexMode, "FDD")
        timeStepLogs = logInfo.DLTimeStepLogs;
        freqAllocations = timeStepLogs(:, 4);
    end
    
    % Extract the number of slots
    numOfSlots = size(timeStepLogs, 1) - 1;
    
    % Determine RBG sizes for RAT0
    if ~ratType
        % Determine the nominal RBG size P based on TR 38.214
        numRBG = size(freqAllocations{2}, 2);
        P = ceil(numResourceBlocks / numRBG);
        % Initialize the RBG sizes
        numRBsPerRBG = P * ones(1, numRBG);
        % Calculate the size of the last RBG
        remainder = mod(numResourceBlocks, P);
        if remainder > 0
            numRBsPerRBG(end) = remainder;
        end
    end
    
    % Initialize a vector to store the average number of UEs per RB for DL slots
    avgUEsPerRB = zeros(1, numOfSlots);
    
    % Iterate over each slot
    for slotIdx = 1:numOfSlots
        % For TDD, extract the type of slot (DL or UL)
        if strcmp(duplexMode, "TDD")
            slotType = timeStepLogs{slotIdx + 1, 4};
            if ~strcmp(slotType, "DL")
                continue; % Skip UL slots in TDD
            end
        end
    
        % Extract the frequency allocation for the current DL slot
        freqAllocation = freqAllocations{slotIdx + 1};
    
        if ~ratType
            % Process RAT0
            totalUniqueUEs = sum(arrayfun(@(rbgIdx) nnz(freqAllocation(:, rbgIdx) > 0) * ...
                numRBsPerRBG(rbgIdx), 1:length(numRBsPerRBG)));
            avgUEsPerRB(slotIdx) = totalUniqueUEs / numResourceBlocks;
    
        else
            % Process RAT1
            ueRBUsage = zeros(1, numResourceBlocks); % Vector to count UEs per RB
    
            for ueIdx = 1:size(freqAllocation, 1)
                startRB = freqAllocation(ueIdx, 1);
                numContiguousRBs = freqAllocation(ueIdx, 2);
                ueRBUsage(startRB + 1:(startRB + numContiguousRBs)) = ...
                    ueRBUsage(startRB + 1:(startRB + numContiguousRBs)) + 1;
            end
    
            avgUEsPerRB(slotIdx) = mean(ueRBUsage(ueRBUsage > 0));
        end
    end
    
    % Remove entries for UL slots (if any), which is relevant for TDD
    avgUEsPerRB = avgUEsPerRB(avgUEsPerRB > 0);
end

その他の調査

次の変更を行って例を実行してみてください。

  • さまざまな CDL 遅延プロファイル (CDL-A/B/C/D/E) がユーザーペアリング戦略およびシステム KPI に与える影響を解析します。

  • CSI アンテナ ポート、パネルの構成、アンテナの向き、およびチャネル遅延プロファイルなどのアンテナ構成がシステム KPI に与える影響を解析します。

  • DL MU-MIMO 構成を変更し、それがシステム KPI に与える影響を観察します。たとえば、次の表は、40 個の UE ノードがある周波数分割複信 (FDD) モードの静的シナリオにおける SemiOrthogonalityFactor と平均 BLER の関係を示しています。このシミュレーション設定では、CSI-RS ベースの DL MU-MIMO でスケジューラがユーザーをペアリングする際、実効的な MCS が計算されません。

準直交性係数

平均 BLER

1.0

0.0982

0.9

0.1255

0.75

0.2387

0.5

0.3712

次の図は、SemiOrthogonalityFactor が平均 BLER およびセル スループットに与える影響を示しています。FDD モードを使用して検討したこのシナリオでは、SemiOrthogonalityFactor1 に設定し、CSI タイプ II プリコーダーを使用した場合、直交ユーザーは存在しません。

BLER as a Function of Semi-Orthogonality Factor.png Cell Throughput as a Function of Semi-Orthogonality Factor.png

  • DL CSI 測定信号タイプを変更し、それが MU-MIMO パフォーマンスに与える影響を観察します。たとえば、次のプロットは、TDD モードにおける CSI-RS ベースおよび SRS ベースの SU-MIMO と MU-MIMO について、平均 BLER およびセル スループットの比較を示しています。

BLER Comparison New.png Cell Throughput Comparison New.png

サポート関数

この例では、次のヘルパー クラスと補助関数を使用します。

  • helperNRMetricsVisualizer – メトリクス可視化機能の実装

  • helperNRSchedulingLogger – スケジューリング情報のロギング機能の実装

  • helperNRPhyLogger – PHY パケット受信情報のロギング機能の実装

  • hNRCreateCDLChannels – gNB から UE、および UE から gNB へのリンクに対する CDL チャネルの作成

  • hNRCustomChannelModel – チャネル モデリング機能の実装

  • hNRKPIManager: 重要性能評価指標を計算する機能の実装

Copyright 2022-2026 The MathWorks, Inc..

参照

[1] 3GPP TS 38.214. “NR; Physical layer procedures for data.” 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

参考

オブジェクト

トピック