CSI-RS를 사용하여 NR 채널 추정
이 예제는 TS 38.211 Section 7.4.1.5 정의에 따라, 주어진 반송파 및 CSI-RS(채널 상태 정보 기준 신호) 리소스 구성에 대해 CSI-RS 심볼과 인덱스를 생성하는 방법을 보여줍니다. 이 예제에서는 생성된 심볼을 반송파 리소스 그리드에 매핑하고, 수신기 측에서 채널 추정을 수행하고, 추정된 채널을 실제 채널과 비교하는 방법을 보여줍니다.
소개
CSI-RS는 다운링크(DL) 기준 신호입니다. NR 표준은 ZP(zero-power) 및 NZP(non-zero-power) CSI-RS를 정의합니다.
UE(사용자 단말) 프로세스는 NZP-CSI-RS를 이용합니다.
이동성 및 빔 관리를 위한 L1-RSRP(reference signal received power: 기준 신호 수신 전력) 측정
DL CSI 수집
간섭 측정
시간 및 주파수 추적
ZP-CSI-RS는 DL CSI 수집 및 간섭 측정에 사용됩니다. 또한 특정 리소스 요소(RE)를 마스킹 처리하여 PDSCH 송신에 사용할 수 없게 만듭니다. ZP라는 이름이 나타내듯이, 해당 RE에서는 아무것도 송신되지 않습니다.
이 예제에서는 CSI-RS를 사용하여 CSI 수집의 기초를 형성하는 채널 추정을 수행하는 방법을 보여줍니다.
구성 객체 초기화하기
15kHz 부반송파 간격을 사용하는 5MHz 반송파를 나타내는 반송파 구성 객체를 만듭니다.
carrier = nrCarrierConfig; carrier.NSizeGrid = 25; carrier.SubcarrierSpacing = 15; carrier.NSlot = 1; carrier.NFrame = 0
carrier = nrCarrierConfig with properties: NCellID: 1 SubcarrierSpacing: 15 CyclicPrefix: 'normal' NSizeGrid: 25 NStartGrid: 0 NSlot: 1 NFrame: 0 IntraCellGuardBands: [0x2 double] Read-only properties: SymbolsPerSlot: 14 SlotsPerSubframe: 1 SlotsPerFrame: 10
행 번호 3은 NZP로, 행 번호 5는 ZP로 지정된 두 개의 CSI-RS 리소스를 나타내는 CSI-RS 구성 객체를 만듭니다.
csirs = nrCSIRSConfig; csirs.CSIRSType = {'nzp','zp'}; csirs.CSIRSPeriod = {[5 1],[5 1]}; csirs.Density = {'one','one'}; csirs.RowNumber = [3 5]; csirs.SymbolLocations = {1,6}; csirs.SubcarrierLocations = {6,4}; csirs.NumRB = 25
csirs = nrCSIRSConfig with properties: CSIRSType: {'nzp' 'zp'} CSIRSPeriod: {[5 1] [5 1]} RowNumber: [3 5] Density: {'one' 'one'} SymbolLocations: {[1] [6]} SubcarrierLocations: {[6] [4]} NumRB: 25 RBOffset: 0 NID: 0 Read-only properties: NumCSIRSPorts: [2 4] CDMType: {'FD-CDM2' 'FD-CDM2'}
CSI-RS의 전력 스케일링(단위: dB)을 고려합니다.
powerCSIRS = 0; disp(['CSI-RS power scaling: ' num2str(powerCSIRS) ' dB']);
CSI-RS power scaling: 0 dB
CSI-RS 심볼 및 인덱스 생성하기
지정된 반송파와 CSI-RS 구성 파라미터에 대해 CSI-RS 심볼을 생성합니다. 전력 스케일링을 적용합니다.
sym = nrCSIRS(carrier,csirs); csirsSym = sym*db2mag(powerCSIRS);
변수 csirsSym
은 CSI-RS 심볼을 포함하는 열 벡터입니다.
지정된 반송파 및 CSI-RS 구성 파라미터에 대해 CSI-RS 인덱스를 생성합니다.
csirsInd = nrCSIRSIndices(carrier,csirs);
변수 csirsInd
도 csirsSym
과 동일한 크기의 열 벡터입니다.
ZP 리소스와 NZP 리소스를 모두 구성하는 경우 ZP 신호 생성이 NZP 신호 생성보다 우선합니다.
반송파 그리드 초기화하기
하나의 슬롯에 대한 반송파 리소스 그리드를 초기화합니다.
ports = max(csirs.NumCSIRSPorts); % Number of antenna ports
txGrid = nrResourceGrid(carrier,ports);
CSI-RS 심볼을 반송파 그리드에 매핑하기
리소스 요소 매핑을 수행합니다.
txGrid(csirsInd) = csirsSym;
그리드에 CSI-RS(ZP와 NZP 모두) 위치를 플로팅합니다.
plotGrid(size(txGrid),csirsInd,csirsSym);
OFDM 변조 수행하기
OFDM 변조를 수행하여 시간 영역 파형을 생성합니다.
[txWaveform,ofdmInfo] = nrOFDMModulate(carrier,txGrid);
시간 영역 파형을 채널에 통과시키고 AWGN 잡음 추가하기
수신 안테나 개수를 구성합니다.
R = 4;
채널을 구성합니다.
channel = nrTDLChannel;
channel.NumTransmitAntennas = ports;
channel.NumReceiveAntennas = R;
channel.DelayProfile = 'TDL-C';
channel.MaximumDopplerShift = 10;
channel.DelaySpread = 1e-8;
채널의 샘플 레이트를 설정합니다.
waveformInfo = nrOFDMInfo(carrier); channel.SampleRate = waveformInfo.SampleRate
channel = nrTDLChannel with properties: DelayProfile: 'TDL-C' DelaySpread: 1.0000e-08 MaximumDopplerShift: 10 SampleRate: 7680000 PathGainSampleRate: 'signal' MIMOCorrelation: 'Low' Polarization: 'Co-Polar' TransmissionDirection: 'Downlink' NumTransmitAntennas: 4 NumReceiveAntennas: 4 NormalizePathGains: true InitialTime: 0 NumSinusoids: 48 RandomStream: 'mt19937ar with seed' Seed: 73 NormalizeChannelOutputs: true ChannelFiltering: true TransmitAndReceiveSwapped: false ChannelResponseOutput: 'path-gains'
구성된 채널에 따라, 채널 지연을 고려하기 위해 송신된 파형에 0을 추가합니다.
chInfo = info(channel); maxChDelay = chInfo.MaximumChannelDelay; txWaveform = [txWaveform; zeros(maxChDelay,size(txWaveform,2))];
파형을 채널에 통과시킵니다.
[rxWaveform,pathGains] = channel(txWaveform);
실제 전파 채널 H_actual
을 생성하기 위해, 완벽한 채널 추정을 수행합니다.
pathFilters = getPathFilters(channel); H_actual = nrPerfectChannelEstimate(carrier,pathGains,pathFilters);
AWGN 잡음을 파형에 추가합니다. 이 예제에서 사용하는 SNR 정의에 대한 설명은 SNR Definition Used in Link Simulations 항목을 참조하십시오.
SNRdB = 50; % in dB SNR = 10^(SNRdB/10); % Linear value N0 = 1/sqrt(2.0*R*double(ofdmInfo.Nfft)*SNR); % Noise variance rng(0); noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform))); rxWaveform = rxWaveform + noise;
NZP-CSI-RS를 사용하여 타이밍 동기화를 수행합니다. 타이밍 오프셋을 추정하기 위해, nrTimingEstimate
를 사용하고 NZP-CSI-RS를 기준으로 고려합니다.
% Disable ZP-CSI-RS resource, not going to be used for timing and channel % estimation csirs.CSIRSPeriod = {[5 1],'off'}; % Generate reference symbols and apply power scaling refSym = db2mag(powerCSIRS)*nrCSIRS(carrier,csirs); % Generate reference indices refInd = nrCSIRSIndices(carrier,csirs); offset = nrTimingEstimate(carrier,rxWaveform,refInd,refSym)
offset = 7
rxWaveform = rxWaveform(1+offset:end,:);
수신된 시간 영역 파형에 OFDM 복조를 수행합니다.
rxGrid = nrOFDMDemodulate(carrier,rxWaveform); % Of size K-by-L-by-R
추정된 채널을 실제 채널과 비교하기
NZP-CSI-RS를 사용하여 실질적인 채널 추정을 수행합니다. CSI-RS 심볼 csirsSym
은 동일한 CDM 유형이어야 합니다.
cdmLen = [2 1]; % Corresponds to CDMType = 'FD-CDM2' [H_est,nVar] = nrChannelEstimate(carrier,rxGrid,refInd,refSym,'CDMLengths',cdmLen); disp(['Estimated noise variance = ' num2str(nVar)])
Estimated noise variance = 0.00011155
첫 번째 송신 안테나와 첫 번째 수신 안테나 간의 추정된 채널과 실제 채널을 플로팅합니다.
figure; % Plot the estimated channel subplot(1,2,1) imagesc(abs(H_est(:,:,1,1))); colorbar; title('Estimated Channel') axis xy; xlabel('OFDM Symbols'); ylabel('Subcarriers'); % Plot the actual channel subplot(1,2,2) imagesc(abs(H_actual(:,:,1,1))); colorbar; title('Actual Channel') axis xy; xlabel('OFDM Symbols'); ylabel('Subcarriers');
채널 추정 오차를 계산합니다.
H_err = (H_est - H_actual(:,:,:,1:size(H_est,4))); [minErr,maxErr] = bounds(abs(H_err),'all'); disp(['Absolute value of the channel estimation error is in the range of [' num2str(minErr) ', ' num2str(maxErr) ']'])
Absolute value of the channel estimation error is in the range of [2.4865e-05, 0.029678]
로컬 함수
function plotGrid(gridSize,csirsInd,csirsSym) % plotGrid(GRIDSIZE,CSIRSIND,CSIRSSYM) plots the carrier grid of size GRIDSIZE % by populating the grid with CSI-RS symbols using CSIRSIND and CSIRSSYM. figure() cmap = colormap(gcf); chpval = {20,2}; chpscale = 0.25*length(cmap); % Scaling factor tempSym = csirsSym; tempSym(tempSym ~= 0) = chpval{1}; % Replacing non-zero-power symbols tempSym(tempSym == 0) = chpval{2}; % Replacing zero-power symbols tempGrid = complex(zeros(gridSize)); tempGrid(csirsInd) = tempSym; image(chpscale*tempGrid(:,:,1)); % Multiplied with scaling factor for better visualization axis xy; names = {'NZP CSI-RS','ZP CSI-RS'}; clevels = chpscale*[chpval{:}]; N = length(clevels); L = line(ones(N),ones(N),'LineWidth',8); % Generate lines % Index the color map and associate the selected colors with the lines set(L,{'color'},mat2cell(cmap( min(1+clevels,length(cmap) ),:),ones(1,N),3)); % Set the colors according to cmap % Create legend legend(names{:}); title('Carrier Grid Containing CSI-RS') xlabel('OFDM Symbols'); ylabel('Subcarriers'); end
참고 문헌
[1] 3GPP TS 38.211. “NR; Physical channels and modulation.” 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.