メインコンテンツ

Cell-Free mMIMO ネットワークのパフォーマンスの評価

R2026b
R2024b 以降

この例では、完全な物理レイヤー処理を使用する Cell-Free (CF) massive multiple-input multiple-output (mMIMO) ネットワークのパフォーマンスを評価する方法を示します。この例を使用すると、これらのネットワークの集中型実装および分散型実装の両方を評価し、異なるチャネル遅延プロファイルにおけるセルのパフォーマンスを解析できます。評価する重要性能評価指標 (KPI) には、セル スループット、スペクトル効率、およびブロック エラー レート (BLER) が含まれます。

CF mMIMO

次の図に示すように、CF mMIMO ネットワークは、地理的に分散した多数のアクセス ポイント (AP) で構成されます。これらの AP は協調してユーザー端末 (UE) ノードにサービスを提供します。中央処理装置 (CPU) がすべての AP を制御し、リソース割り当ておよびスケジューリングを実行します。フロントホール接続は、容量が無制限であり、レイテンシがごくわずかで、エラーのない送信であると仮定し、AP を CPU にリンクします。UE ノードは複数の AP に無線で接続し、接続先 AP からの結合された信号を復号化できます。

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

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

  • デュプレックス モードは時分割複信 (TDD) である。

  • すべてのリンクのチャネル推定 (チャネル係数) は完全であり、チャネルのパス ゲインとパス フィルターから計算される。

  • この例では、チャネル状態情報基準信号 (CSI-RS) をモデル化しない。

  • ダウンリンク (DL) およびアップリンク (UL) の測定は、サウンディング基準信号 (SRS) を使用して TDD の相反性を利用する。

  • この例では、完全な物理レイヤー処理を使用する。

  • フロントホール (CPU と AP の間のリンク) は、容量が無制限であり、レイテンシがごくわずかで、エラーのない送信である。

Cell-Free mMIMO ネットワークの実装アプローチ

次の図に示すように、Cell-Free mMIMO システムは通常、集中型または分散型のいずれかの実装を使用します。集中型実装では、CPU が物理レイヤー処理を実行し、AP が CPU と UE の間で信号を中継します。分散型実装では、CPU と AP が物理レイヤー処理を分担します。分散型アプローチは、CPU の計算量を低減し、CPU と AP の間のフロントホール負荷を軽減します。

SRS 処理

CPU は、UE ノードとの接続を設定する際に、サウンディング基準信号 (SRS) の構成を UE ノードに送信します。AP は、構成された UE ノードからの SRS 信号を特定のタイム スロットで受信します。チャネル推定処理は、CF mMIMO システムが集中型と分散型の実装戦略のいずれを使用するかによって異なります。CF mMIMO の集中型実装では、各 AP がチャネルのパス ゲインとパス フィルターのインパルス応答を CPU に中継し、次いで CPU がすべての AP からの結合チャネルを推定します。

分散型実装では、各 AP がチャネルをローカルで推定し、これらの推定を CPU に送信します。CPU はそれらを連結して結合チャネル推定を形成します。これは、次のように表されます。

Hˆkul=[(Hm1kul)T(Hm2kul)T...(Hmnkul)T]T。ここで、Hm1kul は AP-mik と UEk の間の推定チャネルです。

プリコーダー計算

CPU において利用可能なチャネル推定から DL プリコーダーを計算するために、TDD の相反性を利用し、ゼロ フォーシング (ZF) プリコーディングを適用します。これは、次のように定義されます。

Wk=((HˆkHHkˆ)-1HˆkH)H.

UL 送信では、TS 138.214 に規定されているとおり、CPU はコードブックベースの UL プリコーダー (TPMI) を選択します。

物理ダウンリンク共有チャネル (PDSCH) 処理

集中型実装では、各 UE に対して CPU が送信波形を生成し、AP を介して中継します。これは、次のように表されます。

Xkdl=[(Xm1kdl)T(Xm2kdl)T...(Xmnkdl)T]T。ここで、Xmikdl は AP-mik に関連する信号です。

特定の AP-m において、CPU から受信したすべての UE ノード向けのデータが次のように重ね合わせられます。

Xmdl = ∑k∈m:Xkdl。

分散型実装では、CPU がトランスポート ブロック (TB) の符号化を実行し、各 UE に必要なプリコーディング行列とともに、それを対応する AP に送信します。AP 向けのプリコーディング行列を Wk から導出するための式は、次のとおりです。

Wk=[(Wm1kk)T(Wm2kk)T...(Wmkkk)T]T。ここで、Wm1kk は AP-mik と UEk の間のリンクに対応するプリコーディング行列を表します。

物理アップリンク共有チャネル (PUSCH) 処理

UE ノードは、UL グラントで CPU により指定されたコードブックベースのプリコーダー (TPMI) を使用して、アップリンク送信をプリコーディングします。

集中型実装では、AP-m がすべての UE からの信号を受信します。各 AP は受信波形を CPU に送信します。CPU はすべての AP からの波形を結合し、サイクリック プレフィックス (CP) を除去したうえで、FFT 演算、LS チャネル推定、最小平均二乗誤差 (MMSE) イコライズ、レイヤー デマッピング、およびデスクランブルを実行して、対数尤度比 (LLR) の値を取得します。これらの LLR 値は、TB の復号化において送信ビット シーケンスの検出に寄与します。

分散型実装では、AP が受信波形から CP を除去し、FFT を実行して受信機グリッドを取得します。AP はこのグリッドを使用して、チャネル推定、MMSE イコライズ、レイヤー デマッピング、およびデスクランブルを実行し、対数尤度比の値を取得します。AP はこれらの LLR 値を CPU に送信し、CPU は UEk に対応する LLR 値を AP 間で次のように加算します。

bkˆLLR=∑m∈MkbmkˆLLR

この bkˆLLR は、UEk のデータの TB 復号化に寄与します。

シナリオ構成

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

rng("default") % Reset the random number generator
numFrameSimulation = 10; % Simulation time in terms of number of 10 ms frames
networkSimulator = wirelessNetworkSimulator.init;
hPre6GCPU.reset(); % Reset the CPU Cell ID Count

完全な PHY を使用するには、抽象化タイプを none に設定します。

phyModelType = "full-phy"; % Use full physical layer processing
split = "Centralized"; % Realization

シミュレーション パラメーターを設定します。

lengthX = 1000;                % Scenario length (meters) in X direction
lengthY = 1000;                % Scenario length (meters) in Y direction
numAPs = 20; % Number of APs
numUEs = 4; % Number of UEs
% numUEConnections should not exceed numAPs
numUEConnections = 2; % Number of APs a UE can connect to
% Number of AP antennas
numTransmitAntennas = 4;
numReceiveAntennas = 4;

hPre6GCPU 関数を使用して、指定した構成で CPU ノードを作成します。位置、分割、搬送波周波数、チャネル帯域幅、サブキャリア間隔、送信アンテナ数、および受信アンテナ数などのパラメーターを設定します。

CPU = hPre6GCPU(Name="CPU-1",Position=[lengthX/2 lengthY+100 10], ...
Split=split,CarrierFrequency=1.9e9,ChannelBandwidth=20e6, SubcarrierSpacing=15e3, ...
NumTransmitAntennas=numTransmitAntennas,NumReceiveAntennas=numReceiveAntennas,SRSPeriodicityUE=5);

AP の数とエリアの寸法のパラメーターを設定し、generateAPPositions 関数を使用して AP の位置を生成します。位置に基づいて AP に名前を割り当てます。

[apPositions,apRadius] = generateAPPositions(numAPs,lengthX,lengthY);
apNames = "AP-" + (1:size(apPositions,1));

指定した構成で AP ノードを作成します。

APs = hPre6GAP(Name=apNames,Position=apPositions, ...
    TransmitPower=23,NumTransmitAntennas=numTransmitAntennas, ...
    NumReceiveAntennas=numReceiveAntennas,ReceiveGain=0,NoiseFigure=9);

AP ノードを CPU ノードに接続してネットワークを作成します。

connectAP(CPU,APs);

UE の位置を生成して、UE ノードを作成し、AP との接続を確立します。

% Generate positions for the UEs
uePositions = generateUEPositions(numUEs,lengthX,lengthY); 
% Initialize UE array
UEs = hPre6GUE.empty(0,numUEs);

for i = 1:numUEs
    % Calculate the distances from the UE to all APs
    distance = sqrt((apPositions(:,1)-uePositions(i,1)).^2+(apPositions(:,2)-uePositions(i,2)).^2);
    [~,closestAPIdx] = sort(distance,"ascend"); % Sort APs by proximity to the UE 

    % Generate UE name based on numUEConnections
    ueName = "UE" + i + " AP-";
    for j = 1:numUEConnections
        ueName = ueName + floor(APs(closestAPIdx(j)).APCellID/3);
        if(j ~= numUEConnections)
            ueName = ueName + "-";
        end
    end

    % Create a UE node with the specified configuration
    UEs(i) = hPre6GUE(Name=ueName,Position=uePositions(i,:),TransmitPower=20, ...
        NumTransmitAntennas=1,NumReceiveAntennas=1,ReceiveGain=0,NoiseFigure=9);

    % Connect the UE to the nearest APs
    for j = 1:numUEConnections
        APs(closestAPIdx(j)).connectUE(UEs(i), FullBufferTraffic="on");
    end
end

CPU ノード、AP ノード、および UE ノードをシミュレーターに追加します。

addNodes(networkSimulator,CPU)
addNodes(networkSimulator,APs)
addNodes(networkSimulator,UEs)

リンクレベル チャネルの "N" 行 "N" 列の行列を作成します。ここで "N" はシステム内のノードの総数です。インデックス ("i","j") の要素には、ノード "i" からノード "j" へのチャネル インスタンスが格納されます。空の要素は、対応するノード間のチャネルがモデル化されていないことを示します。

numNodes = length(CPU) + numAPs + numUEs;
channels = cell(numNodes,numNodes);
channelConfig = struct(DelaySpread=300e-9);
for i = 1:numAPs
    channels = createCDLChannels(channels,channelConfig,APs(i),UEs);
end

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

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

グラフをプロットするためのメトリクス ビジュアライザーを設定します。

enablePHYPlot = true; % Enable plotting of PHY metrics.
enableSchPlot = true; % Enable plotting of scheduler metrics.
enableCDFPlot = true; % Enable plotting of CDF metrics.

メトリクス プロットの 1 秒あたりの更新回数を設定します。

numMetricPlotUpdates = 50; % Updates plots every 20 milliseconds

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

metricsVisualizer = helperNRMetricsVisualizer(CPU,UEs,RefreshRate=numMetricPlotUpdates, ...
    PlotSchedulerMetrics=enableSchPlot,PlotPhyMetrics=enablePHYPlot,PlotCDFMetrics=enableCDFPlot);

シナリオの可視化を有効にします。

enableVisualization = true;
if enableVisualization
hPre6GNetworkVisualizer();
end

numFrameSimulation フレームの間、シミュレーションを実行します。

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

% Run the simulation
run(networkSimulator,simulationTime)

Figure Network Layout Visualization contains an axes object and another object of type uigridlayout. The axes object with xlabel X-axis (Meters), ylabel Y-axis (Meters) contains 78 objects of type scatter, image, line.

Figure ECDF of Block Error Rate (BLER) contains 2 axes objects. Axes object 1 with title Average Cell DL BLER, xlabel BLER, ylabel ECDF contains 3 objects of type stair, constantline. This object represents Average BLER. Axes object 2 with title Average Cell UL BLER, ylabel ECDF contains 3 objects of type stair, constantline.

Figure ECDF of Cell Throughput contains 2 axes objects. Axes object 1 with title Cell DL Throughput, xlabel Cell Throughput (Mbps), ylabel ECDF contains 3 objects of type stair, constantline. This object represents Cell Throughput. Axes object 2 with title Cell UL Throughput, ylabel ECDF contains 3 objects of type stair, constantline.

Figure ECDF of Application Layer Latency contains 2 axes objects. Axes object 1 with title Average App DL Latency, xlabel Latency (s), ylabel ECDF contains 2 objects of type constantline. Axes object 2 with title Average App UL Latency, ylabel ECDF contains 2 objects of type constantline.

ノードごとの統計を読み取ります。

cpuStats = CPU.statistics();
ueStats = UEs.statistics();

システム パフォーマンス インジケーターの達成値を、その理論上のピーク値 (オーバーヘッドをゼロと仮定) と比較します。

displayPerformanceIndicators(metricsVisualizer);
Peak UL throughput: 54.64 Mbps
Achieved cell UL throughput: 45.48 Mbps
Achieved UL throughput for each UE: [11.38        11.34        11.37        11.37]
Peak UL spectral efficiency: 2.73 bits/s/Hz
Achieved UL spectral efficiency for cell: 2.27 bits/s/Hz 
Block error rate for each UE in the UL direction: [0  0  0  0]

Peak DL throughput: 75.37 Mbps
Achieved cell DL throughput: 56.76 Mbps
Achieved DL throughput for each UE: [14.07        14.28        14.12        14.29]
Peak DL spectral efficiency: 3.77 bits/s/Hz
Achieved DL spectral efficiency for cell: 2.84 bits/s/Hz
Block error rate for each UE in the DL direction: [0  0  0  0]

displayPerformanceIndicators 関数は、以下のパフォーマンス インジケーター、すなわち達成データ レート (UL および DL)、達成スペクトル効率 (UL および DL)、および達成ブロック エラー レート (UL および DL) を表示します。この例では、3GPP TR 37.910 に従ってピーク値を計算します。

ローカル関数

createCDLChannels は、セル内の各 DL リンクおよび各 UL リンクに対して CDL チャネル インスタンスを設定します。

function channels = createCDLChannels(channels,channelConfig,AP,UEs)
    %createCDLChannels Creates channels between the AP node and UE nodes in a cell
    %   CHANNELS = createCDLChannels(CHANNELS,CHANNELCONFIG,AP,UES) creates channels
    %   between AP and UES in a cell.
    %
    %   CHANNELS is an N-by-N array, where N is the number of nodes in the cell.
    %
    %   CHANNLECONFIG is a structure with these fields: DelayProfile and
    %   DelaySpread.
    %
    %   AP is an hPre6GAP node.
    %
    %   UES is an array of hPre6GUE nodes.
    % Create a channel matrix to hold the channel objects
    
    % Get waveform sample rate from AP configuration
    waveformInfo = nrOFDMInfo(AP.NumResourceBlocks,AP.SubcarrierSpacing/1e3);
    sampleRate = waveformInfo.SampleRate;
    
    % Create a CDL channel model object with the desired configuration,
    % including the delay profile (CDL-A, B, C, D, or E), delay spread, and
    % Doppler frequency.
    cdlChannel = nrCDLChannel(CarrierFrequency=AP.CarrierFrequency, ...
        TransmitArrayOrientation=[0 12 0]', SampleRate=sampleRate);
    for fname=fieldnames(channelConfig)'
        cdlChannel.(fname{1})=channelConfig.(fname{1});
    end
    cdlChannel.TransmitAntennaArray.Element = 'isotropic';
    cdlChannel.ChannelFiltering = false;
    cdlChannel.NormalizeChannelOutputs = false;
    
    numUEs = length(UEs);
    % For each UE, set DL and UL channel instances
    for ueIdx = 1:numUEs
        % Create DL channel with custom delay profile
        dlChannel = hMakeCustomCDL(cdlChannel);
        % Configure the channel seed based on the UE number
        % (results in independent fading for each UE)
        dlChannel.Seed = 73 + (ueIdx - 1);
    
        % Set antenna configuration for the link using the maximum of Tx and Rx
        % antenna counts at each node (AP and UE)
        numTxAntsDL = max(AP.NumTransmitAntennas, AP.NumReceiveAntennas);
        numRxAntsDL = max(UEs(ueIdx).NumReceiveAntennas, UEs(ueIdx).NumTransmitAntennas);
    
        % Set antenna panel
        dlChannel = hArrayGeometry(dlChannel,numTxAntsDL,numRxAntsDL,"downlink");
    
        % Compute the LOS angle from AP to UE
        [~,depAngleDL] = rangeangle(UEs(ueIdx).Position',AP.Position');
        % Configure the azimuth and zenith departure angle offsets for this UE
        dlChannel.AnglesAoD(:) = dlChannel.AnglesAoD(:) + depAngleDL(1);
        % Convert elevation angle to zenith angle
        dlChannel.AnglesZoD(:) = dlChannel.AnglesZoD(:) - dlChannel.AnglesZoD(1) + (90 - depAngleDL(2));
    
        % Compute the LOS angle from UE to AP
        [~,arrAngleDL] = rangeangle(AP.Position',UEs(ueIdx).Position');
        % Configure the azimuth and zenith arrival angle offsets for this UE
        dlChannel.AnglesAoA(:) = dlChannel.AnglesAoA(:) - dlChannel.AnglesAoA(1) + arrAngleDL(1);
        % Convert elevation angle to zenith angle
        dlChannel.AnglesZoA(:) = dlChannel.AnglesZoA(:) - dlChannel.AnglesZoA(1) + (90 - arrAngleDL(2));
        dlDict = dictionary;
        dlDict(AP.CarrierFrequency) = {dlChannel};
        channels{AP.ID,UEs(ueIdx).ID} = dlDict;

        % Create UL channel
        ulChannel = clone(dlChannel);
        ulChannel.swapTransmitAndReceive();
        ulDict = dictionary;
        ulDict(AP.CarrierFrequency) = {ulChannel};
        channels{UEs(ueIdx).ID,AP.ID} = ulDict;
    end
end

generateAPPositions は、AP の位置を生成します。

function [apPositions,apRadius] = generateAPPositions(numAPs,lengthX,lengthY)
    %generateAPPositions generate AP positions
    % The generateAPPositions function returns the apPositions and apRadius 
    % based on the generated positions.
    %
    % Input arguments:
    % numAPs  - Number of APs to be placed.
    % lengthX - Length of the scenario area in the X-direction (meters).
    % lengthY - Length of the scenario area in the Y-direction (meters).
    %
    % Output arguments:
    % apPosition - Matrix of AP positions.
    % apRadius   - Radius of the area covered by each AP

    % Calculate the number of APs to be placed in rows (a) and columns (b) of
    % the scenario area.
    a = round(sqrt(numAPs*lengthX/lengthY));
    while(a > 0)
        b = numAPs/a;
        if b == floor(b)
            break
        end
        a = a - 1;
    end
    flag = 0;
    if a == 1 && b > 3
        flag = 1;
        a = round(sqrt((numAPs-1)*lengthX/lengthY));
        while(a > 0)
            b = (numAPs-1)/a;
            if b == floor(b)
                break
            end
            a = a - 1;
        end
    end

    % Create segments of the scenario area.
    subX = lengthX/a;
    subY = lengthY/b;
    % Calculate radius per AP
    apRadius = max(subX,subY)/2;
    % initialize position array
    x = zeros(numAPs,1);
    y = zeros(numAPs,1);
    k = 1;
    % Define lengths of the random region in sub-segment.
    rx = 0.3*b/(a+b);
    ry = 0.3*a/(a+b);
    for i = 1:a
        for j = 1:b
            if flag && j==b
                continue
            end
            % Assign x and y coordinates with random variation. 
            x(k) = subX*(i-(0.5+rx)+2*rx*rand);
            y(k) = subY*(j-(0.5+ry)+2*ry*rand);
            k = k + 1;
        end
    end
    if flag
        subX = lengthX/(a+1);
        for i = 1:(a+1)
            x(k) = subX*(i-(0.5+rx)+2*rx*rand);
            y(k) = subY*(b-(0.5+ry)+2*ry*rand);
            k = k + 1;
        end
    end
    z = 30*ones(numAPs,1); % Set AP height (z-coordinate) to a constant value (30 meters). 
    apPositions = [x y z];  % Combine x-, y-, and z-coordinates into a single matrix. 
end

generateUEPositions は、UE ノードの位置を生成します。

function [uePositions] = generateUEPositions(numUEs,lengthX,lengthY)
    %generateUEPositions Generate random UE positions in a segment
    % This function returns the uePositions
    %
    % numUEs - Number of UEs.
    % lengthX - Scenario length (meters) in X-direction.
    % lengthY - Scenario length (meters) in Y-direction.

    % Initialize position array
    x = zeros(numUEs,1);
    y = zeros(numUEs,1);
    for i = 1:numUEs
        % Distribute UEs in four quadrants
        rx = mod(i,4);
        ry = mod(rx,2);
        x(i) = (floor(rx/2)+rand)*lengthX/2;
        y(i) = (ry+rand)*lengthY/2;
    end
    z = 3*ones(numUEs,1); % UE height in meters
    uePositions = [x y z];
end

サポート関数

この例では、次のヘルパーを使用します。

  • hPre6GCPU:– CPU ノードの実装

  • hPre6GCPUMAC:– CPU MAC 機能の実装

  • hPre6GCPUFullPHY:– CPU PHY 機能の実装

  • hPre6GScheduler:– スケジューラ機能の実装

  • hPre6GAP:– AP ノードの実装

  • hPre6GAPLowPHY:– AP の下位 PHY 機能の実装

  • hPre6GUE:– UE ノードの実装

  • hPre6GUEMAC:– UE MAC 機能の実装

  • hPre6GUEFullPHY:– UE の完全な PHY 機能の実装

  • helperNetworkVisualizer:– ネットワーク可視化機能の実装

  • hArrayGeometry:– CDL チャネル モデルのアンテナ アレイ ジオメトリの構成

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

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

  • hMakeCustomCDL:– カスタム遅延プロファイルを使用した CDL の構成

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