Cell-Free mMIMO ネットワークのパフォーマンスの評価
R2026bこの例では、完全な物理レイヤー処理を使用する 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 はそれらを連結して結合チャネル推定を形成します。これは、次のように表されます。
。ここで、 は AP- と の間の推定チャネルです。
プリコーダー計算
CPU において利用可能なチャネル推定から DL プリコーダーを計算するために、TDD の相反性を利用し、ゼロ フォーシング (ZF) プリコーディングを適用します。これは、次のように定義されます。
.
UL 送信では、TS 138.214 に規定されているとおり、CPU はコードブックベースの UL プリコーダー (TPMI) を選択します。
物理ダウンリンク共有チャネル (PDSCH) 処理
集中型実装では、各 UE に対して CPU が送信波形を生成し、AP を介して中継します。これは、次のように表されます。
。ここで、 は AP- に関連する信号です。
特定の AP- において、CPU から受信したすべての UE ノード向けのデータが次のように重ね合わせられます。
= 。
分散型実装では、CPU がトランスポート ブロック (TB) の符号化を実行し、各 UE に必要なプリコーディング行列とともに、それを対応する AP に送信します。AP 向けのプリコーディング行列を から導出するための式は、次のとおりです。
。ここで、 は AP- と の間のリンクに対応するプリコーディング行列を表します。
物理アップリンク共有チャネル (PUSCH) 処理
UE ノードは、UL グラントで CPU により指定されたコードブックベースのプリコーダー (TPMI) を使用して、アップリンク送信をプリコーディングします。
集中型実装では、AP- がすべての UE からの信号を受信します。各 AP は受信波形を CPU に送信します。CPU はすべての AP からの波形を結合し、サイクリック プレフィックス (CP) を除去したうえで、FFT 演算、LS チャネル推定、最小平均二乗誤差 (MMSE) イコライズ、レイヤー デマッピング、およびデスクランブルを実行して、対数尤度比 (LLR) の値を取得します。これらの LLR 値は、TB の復号化において送信ビット シーケンスの検出に寄与します。
分散型実装では、AP が受信波形から CP を除去し、FFT を実行して受信機グリッドを取得します。AP はこのグリッドを使用して、チャネル推定、MMSE イコライズ、レイヤー デマッピング、およびデスクランブルを実行し、対数尤度比の値を取得します。AP はこれらの LLR 値を CPU に送信し、CPU は に対応する LLR 値を AP 間で次のように加算します。
この は、 のデータの 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)







ノードごとの統計を読み取ります。
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:– 重要性能評価指標を計算する機能の実装









