Main Content

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

レイ トレーシングを使用した CDL チャネル モデルのカスタマイズ

この例では、レイ トレーシング解析の出力を使用して、CDL チャネル モデル パラメーターをカスタマイズする方法を説明します。この例では、以下を行う方法を示します。

  • 3D 環境での送信機と受信機の位置の指定。

  • レイ トレーシングを使用した、チャネルの幾何学的な側面 (光線の数、角度、遅延、減衰) の計算。

  • レイ トレーシング解析の結果を使用した、CDL チャネル モデルの構成。

  • Phased Array System Toolbox™ を使用した、チャネル アンテナ アレイの指定。

  • 完全なチャネル推定の特異値分解に基づく、送受信アレイの放射パターンの可視化。

基地局と UE の構成

この例では、基地局と UE の両方が矩形アレイを使用することを想定しています。アレイの方向を、方位角と仰角を表す値のペアとして指定します。角度はともに度です。

fc = 6e9;                             % carrier frequency (Hz)
bsPosition = [22.287495, 114.140706]; % lat, lon
bsAntSize = [8 8];                    % number of rows and columns in rectangular array (base station)
bsArrayOrientation = [-30 0].';       % azimuth (0 deg is East, 90 deg is North) and elevation (positive points upwards) in deg
uePosition = [22.287323,114.140859];  % lat, lon
ueAntSize = [2 2];                    % number of rows and columns in rectangular array (UE).
ueArrayOrientation = [180 45].';      % azimuth (0 deg is East, 90 deg is North) and elevation (positive points upwards)  in deg
reflectionsOrder = 1;                 % number of reflections for ray tracing analysis (0 for LOS)
 
% Bandwidth configuration, required to set the channel sampling rate and for perfect channel estimation
SCS = 15; % subcarrier spacing
NRB = 52; % number of resource blocks, 10 MHz bandwidth

レイ トレーシングに向けた建物を含む 3 次元環境のインポートと可視化

香港の建物を指定して Site Viewer を起動します。osm ファイルの詳細については、[1] を参照してください。

if exist('viewer','var') && isvalid(viewer) % viewer handle exists and viewer window is open
    viewer.clearMap();
else
    viewer = siteviewer("Basemap","openstreetmap","Buildings","hongkong.osm");    
end

基地局と UE の作成

地図上で基地局と UE の位置を特定します。

bsSite = txsite("Name","Base station", ...
    "Latitude",bsPosition(1),"Longitude",bsPosition(2),...
    "AntennaAngle",bsArrayOrientation(1:2),...
    "AntennaHeight",4,...  % in m
    "TransmitterFrequency",fc);

ueSite = rxsite("Name","UE", ...
    "Latitude",uePosition(1),"Longitude",uePosition(2),...
    "AntennaHeight",1,... % in m
    "AntennaAngle",ueArrayOrientation(1:2));

基地局と UE の位置を可視化します。基地局は建物の屋上にあります。

bsSite.show();
ueSite.show();

レイ トレーシング解析

Shooting and Bounicng Rays (SBR) 法を使用して、レイ トレーシング解析を実行します。SBR 法には、表面反射と回折の影響は含まれますが、屈折、散乱の影響は含まれません。

pm = propagationModel("raytracing","Method","sbr","MaxNumReflections",reflectionsOrder);
rays = raytrace(bsSite,ueSite,pm,"Type","pathloss");

Site Viewer で光線を表示します。

plot(rays{1})

取得した光線から、到着時刻、平均パス ゲイン、発射角と到来角を取得します。簡略化するために、最初のパスが 0 秒時 (遅延なしに相当) に発生するものとして伝播遅延を正規化します。パス損失を使用して、平均パス ゲインを取得します。

pathToAs = [rays{1}.PropagationDelay]-min([rays{1}.PropagationDelay]);  % Time of arrival of each ray (normalized to 0 sec)
avgPathGains  = -[rays{1}.PathLoss];                                    % Average path gains of each ray
pathAoDs = [rays{1}.AngleOfDeparture];                                  % AoD of each ray
pathAoAs = [rays{1}.AngleOfArrival];                                    % AoA of each ray
isLOS = any([rays{1}.LineOfSight]);                                     % Line of sight flag

CDL チャネル モデルの設定

レイ トレーシング解析で生成された情報を使用して、CDL チャネル モデルを構成します。DelayProfile プロパティを 'Custom' に設定し、パス遅延、平均パス ゲイン、発射角と到来角 (方位角と天頂角の両方) を指定します。

チャネル モデルを構成する際には、次の点を考慮します。

  • レイ トレーサーは基地局と UE の間の個々の光線を検出し、CDL チャネル モデルは、クラスターの平均パス ゲイン (AveragePathGains)、発射角と到来角の平均角度 (AnglesAoAAnglesZoAAnglesAoDAnglesZoD)、クラスター内の光線の拡散 (AngleSpreads) によってプロパティが決定される光線のクラスターをモデル化します。個々の光線に対するレイ トレーシング解析から得られた情報は、CDL チャネルのクラスター平均値を構成します。

  • レイ トレーサーは静的解析を実行し、CDL チャネルは UE の移動をモデル化します。そのため、CDL チャネルでは小規模なフェージングを導入しています。

  • レイ トレーシングで取得したパス ゲインは、平均パス ゲインとみなされます。そのため、フェージングの影響により、瞬間チャネル パス ゲインは平均値と異なりますが、長いシミュレーションでのその平均値は、等方性アンテナを使用した際の規定の平均パス ゲインと一致します。

  • CDL チャネルは天頂角を使用しますが、レイ トレーシング解析は仰角を返すため、双方を変換しなければなりません。

  • 計算された光線のいずれかが見通し線 (LOS) 光線 (反射なし) である場合、HasLOSCluster CDL チャネル プロパティを true に設定します。LOS の場合、CDL モデルは最初のパスを、一方は LOS、他方はレイリー フェージング特性をもつ光線として、2 つの成分に分割します。これにより、ライス フェージング特性の組み合わせになります。そのため、LOS の場合、N 本の光線を指定すると、CDL チャネルは内部で N+1 本のパスをモデル化します。

channel = nrCDLChannel;
channel.DelayProfile = 'Custom';
channel.PathDelays = pathToAs;
channel.AveragePathGains = avgPathGains;
channel.AnglesAoD = pathAoDs(1,:);       % azimuth of departure
channel.AnglesZoD = 90-pathAoDs(2,:);    % channel uses zenith angle, rays use elevation
channel.AnglesAoA = pathAoAs(1,:);       % azimuth of arrival
channel.AnglesZoA = 90-pathAoAs(2,:);    % channel uses zenith angle, rays use elevation
channel.HasLOSCluster = isLOS;
channel.CarrierFrequency = fc;
channel.NormalizeChannelOutputs = false; % do not normalize by the number of receive antennas, this would change the receive power
channel.NormalizePathGains = false;      % set to false to retain the path gains

Phased Array System Toolbox のアレイ オブジェクトを使用して、チャネル アンテナ アレイを指定します。CDL チャネル モデルのアレイ方向プロパティは方位角とダウンチルト角を使用するのに対し、ueArrayOrientation オブジェクトと bsArrayOrientation オブジェクトは方位角と仰角を使用します。そのため、符号を変更して、仰角をダウンチルト角に変換します。

c = physconst('LightSpeed');
lambda = c/fc;

% UE array (single panel)
ueArray = phased.NRRectangularPanelArray('Size',[ueAntSize(1:2) 1 1],'Spacing', [0.5*lambda*[1 1] 1 1]);
ueArray.ElementSet = {phased.IsotropicAntennaElement};   % isotropic antenna element
channel.ReceiveAntennaArray = ueArray;
channel.ReceiveArrayOrientation = [ueArrayOrientation(1); (-1)*ueArrayOrientation(2); 0];  % the (-1) converts elevation to downtilt

% Base station array (single panel)
bsArray = phased.NRRectangularPanelArray('Size',[bsAntSize(1:2) 1 1],'Spacing', [0.5*lambda*[1 1] 1 1]);
bsArray.ElementSet = {phased.NRAntennaElement('PolarizationAngle',-45) phased.NRAntennaElement('PolarizationAngle',45)}; % cross polarized elements
channel.TransmitAntennaArray = bsArray;
channel.TransmitArrayOrientation = [bsArrayOrientation(1); (-1)*bsArrayOrientation(2); 0];   % the (-1) converts elevation to downtilt

チャネル サンプル レートの設定

チャネルを通過する信号によって、チャネル サンプル レートが決定されます。サブキャリア間隔が 15 kHz、リソース ブロック (RB) が 52 個、帯域幅が 10 MHz 相当である信号について考えます。サンプル レートを取得するには、関数 nrOFDMInfo を呼び出します。

ofdmInfo = nrOFDMInfo(NRB,SCS);

channel.SampleRate = ofdmInfo.SampleRate;

チャネル推定

簡略化するために、この例では完全なチャネル推定を仮定します。ChannelFiltering プロパティを false に設定すると、信号をチャネルに送信することなくチャネル パス ゲインを取得できます。

channel.ChannelFiltering = false;
[pathGains,sampleTimes] = channel();

チャネルから返されるパス ゲインをプロットします。その結果を光線減衰値から取得した規定の平均パス ゲインと比較します。

  • LOS の場合、最初の 2 つのパスが最初の光線に対応するため、最初の 2 つのパスは一緒に追加されなければなりません。

  • CDL チャネル モデルは、統計的チャネル モデルであり、UE の移動を考慮します。そのため、返されるパス ゲインは瞬間ゲインです。レイ トレーシング解析によるパス ゲインは、チャネル モデルによって平均パス ゲインとして解釈されます。

  • チャネル モデルが返す瞬間パス ゲインには、各光線の方向でのアンテナ素子のゲインが含まれます。レイ トレーシング解析で取得したカスタム パス ゲインには、アンテナ素子のゲインが含まれません。したがって、平均については、等方性アンテナ素子についてのみチャネル パス ゲインと平均ゲインが一致します。

pg=permute(pathGains,[2 1 3 4]); % first dimension is the number of paths
if isLOS
    % in LOS cases sum the first to paths, they correspond to the LOS ray
    pg = [sum(pg(1:2,:,:,:)); pg(3:end,:,:,:)];
end
pg = abs(pg).^2;
plot(pow2db(pg(:,1,1,1)),'o-.');hold on
plot(avgPathGains,'x-.');hold off
legend("Instantaneous (1^{st} tx - 1^{st} rx antenna)","Average (from ray tracing)")
xlabel("Path number"); ylabel("Gain (dB)")
title('Path gains')

スロット 0 の完全なチャネル推定を取得します。

pathFilters = getPathFilters(channel);
nSlot = 0;
[offset,~] = nrPerfectTimingEstimate(pathGains,pathFilters);
hest = nrPerfectChannelEstimate(pathGains,pathFilters,NRB,SCS,nSlot,offset,sampleTimes);

最初の送信アンテナと最初の受信アンテナの間のチャネル応答を時間と周波数でプロットします。このプロットでは、チャネルが時間と周波数でどのように動作するかを示しています。ドップラー シフトが小さい場合、チャネルは 1 スロットの観測周期内であまり変化しません。

surf(pow2db(abs(hest(:,:,1,1)).^2));
shading('flat');
xlabel('OFDM Symbols');ylabel('Subcarriers');zlabel('Magnitude Squared (dB)');
title('Channel Magnitude Response (1^{st} tx - 1^{st} rx antenna)');

ビームフォーミングの重みの取得

特異値分解 (SVD) を使用して、ビームフォーミングの重みを計算します。レイヤーは 1 つと仮定します。関数 getBeamformingWeights は、サブバンド ビームフォーミングを有効にし、帯域端 (最初のサブキャリア) からオフセットを開始して、複数のリソース ブロックにまたがってチャネル条件を平均化します。

nLayers = 1;
scOffset = 0;   % no offset
noRBs = 1;      % average channel conditions over 1 RB to calculate beamforming weights
[wbs,wue,~] = getBeamformingWeights(hest,nLayers,scOffset,noRBs);

放射パターンのプロット

UE と基地局について、取得した放射パターンをプロットします。

% Plot UE radiation pattern
ueSite.Antenna = clone(channel.ReceiveAntennaArray); % need a clone, otherwise setting the Taper weights would affect the channel array
ueSite.Antenna.Taper = wue;
pattern(ueSite,fc,"Size",4);

% Plot BS radiation pattern
bsSite.Antenna = clone(channel.TransmitAntennaArray); % need a clone, otherwise setting the Taper weights would affect the channel array
bsSite.Antenna.Taper = wbs;
pattern(bsSite,fc,"Size",5);

参考文献

[1] osm ファイルは、クラウドソーシングによる世界中の地図データへのアクセスを提供する https://www.openstreetmap.org からダウンロードされたものです。このデータは Open Data Commons Open Database License (ODbL) https://opendatacommons.org/licenses/odbl/https://opendatacommons.org/licenses/odbl によりライセンスされています。

ローカル関数

function [wtx,wrx,D] = getBeamformingWeights(hEst,nLayers,scOffset,noRBs)
% Get beamforming weights given a channel matrix hEst and the number of
% layers nLayers. One set of weights is provided for the whole bandwidth.
% The beamforming weights are calculated using singular value (SVD)
% decomposition.
%
% Only part of the channel estimate is used to get the weights, this is
% indicated by an offset SCOFFSET (offset from the first subcarrier) and a
% width in RBs (NORBS).

% Average channel estimate
[~,~,R,P] = size(hEst);
%H = permute(mean(reshape(hEst,[],R,P)),[2 3 1]);

scNo = scOffset+1;
hEst = hEst(scNo:scNo+(12*noRBs-1),:,:,:);
H = permute(mean(reshape(hEst,[],R,P)),[2 3 1]);

% SVD decomposition
[U,D,V] = svd(H);
wtx = V(:,1:nLayers).';
wrx = U(:,1:nLayers)';
end

参考

関数

オブジェクト