레이 트레이싱을 통한 CDL 채널 모델 사용자 지정
이 예제에서는 레이 트레이싱 분석의 출력값을 사용하여 CDL 채널 모델 파라미터를 사용자 지정하는 방법을 보여줍니다. 이 예제에서는 다음을 수행하는 방법을 보여줍니다.
3차원 환경에서 송신기와 수신기의 위치 지정.
레이 트레이싱을 사용하여 레이 개수, 각도, 지연 및 감쇠 등 채널의 기하학적 측면 계산.
레이 트레이싱 분석 결과로 CDL 채널 모델 구성.
Phased Array System Toolbox™를 사용하여 채널 안테나 배열 지정.
완벽한 채널 추정값의 특이값 분해를 기반으로 송신 및 수신 배열 방사 패턴의 시각화.
기지국 및 UE 구성
이 예제에서는 기지국과 UE가 모두 사각형 배열을 사용한다고 가정합니다. 배열 방향은 방위각과 고도를 나타내는 값의 쌍으로 지정됩니다. 두 각도의 단위는 모두 도(Degree)입니다.
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차원 환경을 가져오고 시각화하기
홍콩의 건물로 사이트 뷰어를 시작합니다. osm 파일에 대한 자세한 내용은 [1]을 참조하십시오.
if exist('viewer','var') && isvalid(viewer) % viewer handle exists and viewer window is open clearMap(viewer); 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의 위치를 시각화합니다. 기지국은 건물 꼭대기에 있습니다.
show(bsSite); show(ueSite);
레이 트레이싱 분석
SBR(Shooting and Bouncing Ray) 방법을 사용하여 레이 트레이싱 분석을 수행합니다. SBR 방법에는 표면 반사와 회절로 인한 영향은 포함되지만 굴절이나 산란으로 인한 영향은 포함되지 않습니다.
pm = propagationModel("raytracing","Method","sbr","MaxNumReflections",reflectionsOrder); rays = raytrace(bsSite,ueSite,pm,"Type","pathloss");
사이트 뷰어에 레이를 표시합니다.
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
), 평균 도래각 및 발사각(AnglesAoA
,AnglesZoA
,AnglesAoD
,AnglesZoD
) 그리고 군집의 레이 산포(AngleSpreads
)에 의해 속성이 결정되는 레이 군집을 모델링합니다. 개별 레이에 대한 레이 트레이싱 분석에서 가져온 정보에 따라 CDL 채널의 군집 평균 값이 구성됩니다.레이 추적기는 정적 분석을 수행하는 반면, CDL 채널은 UE 움직임을 모델링합니다. 따라서 CDL 채널에는 소규모 페이딩이 발생합니다.
레이 트레이싱에서 얻은 경로 이득은 평균 경로 이득으로 간주됩니다. 따라서 페이딩으로 인해 순시 채널 경로 이득은 평균값과 다르지만, 등방성 안테나를 사용할 경우 긴 시뮬레이션에서는 평균값이 지정된 평균 경로 이득과 일치하게 됩니다.
CDL 채널은 천정각을 사용하는 반면 레이 트레이싱 분석은 고도각을 반환하므로 둘 간에 변환을 수행해야 합니다.
계산된 레이 중 하나라도 가시선(LOS) 레이(반사 없음)인 경우
HasLOSCluster
CDL 채널 속성을true
로 설정하십시오. LOS의 경우 CDL 모델은 첫 번째 경로를 두 개의 성분으로 분할하는데 하나는 LOS이고 다른 하나는 레일리(Rayleigh) 페이딩 특성을 갖습니다. 이 경우 결합된 라이시안(Rician) 페이딩 특성이 생성됩니다. 따라서 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
채널 샘플링 레이트 설정하기
채널을 통과하는 신호에 따라 채널 샘플링 레이트가 결정됩니다. 부반송파 간격 15kHz와 52개의 리소스 블록(RB)(10MHz의 대역폭과 동일함)을 갖는 신호를 예로 들어 보겠습니다. 샘플링 레이트를 구하기 위해 nrOFDMInfo
함수를 호출합니다.
ofdmInfo = nrOFDMInfo(NRB,SCS); channel.SampleRate = ofdmInfo.SampleRate;
채널 추정
단순화하기 위해 이 예제에서는 완벽한 채널 추정을 가정합니다. ChannelFiltering
속성을 false
로 설정하면 채널을 통해 신호를 보내지 않고도 채널 경로 이득을 구할 수 있습니다.
channel.ChannelFiltering = false; [pathGains,sampleTimes] = channel();
채널에서 반환된 경로 이득을 플로팅합니다. 결과를 레이 감쇠 값에서 얻은 지정된 평균 경로 이득과 비교합니다.
LOS의 경우 처음 두 경로가 첫 번째 레이에 해당하므로 처음 두 경로를 합해야 합니다.
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);
첫 번째 송신 안테나와 첫 번째 수신 안테나 사이의 시간과 주파수에서 채널 응답을 플로팅합니다. 이 플롯은 채널이 시간과 주파수 상에서 어떻게 동작하는지 보여줍니다. 도플러 편이가 작은 경우 한 슬롯의 관측 기간 동안 채널은 크게 변하지 않습니다.
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에서 다운로드할 수 있습니다. 데이터는 ODbL(Open Data Commons Open Database License)에 따라 라이선스가 부여됩니다(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
참고 항목
함수
객체
nrCDLChannel
|phased.URA
(Phased Array System Toolbox)