SRS를 사용한 NR 업링크 채널 상태 정보 추정
이 예제에서는 SRS(사운딩 기준 신호)를 사용하여 동기화, 채널 추정 및 업링크 CSI(채널 상태 정보) 추정을 수행하는 방법을 보여줍니다.
소개
사운딩 기준 신호는 동기화 및 CSI 추정을 포함하여 업링크 채널 사운딩을 위해 UE(사용자 단말)에서 사용되는 업링크 물리 신호입니다. CSI는 CQI(채널 품질 지시자), RI(랭크 지시자) 및 PMI(프리코더 행렬 지시자)로 구성됩니다. 이 예제에서는 SRS를 사용하여 주파수 선택적 시변 잡음 채널에서 적절한 PMI를 선택하는 방법을 보여줍니다. 코드북 기반 업링크 송신은 TS 38.211 Section 6.3.1.5[1]에 정의된 대로 PMI를 사용합니다.
이 예제에서는 다음을 포함한 시뮬레이션을 수행합니다.
SRS 구성 및 송신
완벽한 동기화 및 채널 추정과, 실질적인 동기화 및 채널 추정
SNR(신호 대 잡음비) 추정
PMI 선택
PMI 선택 성능 평가
시뮬레이션 길이와 SNR
10ms 프레임 수에 대한 시뮬레이션 길이를 설정합니다. 시뮬레이션할 SNR 점을 설정합니다. SNR은 RE별로 정의되며 각 수신 안테나에 적용됩니다.
numFrames = 1; % 10 ms frames snr = 20; % SNR in dB
UE 및 SRS 구성
시뮬레이션의 주요 파라미터를 설정합니다. 여기에는 다음이 포함됩니다.
리소스 블록의 대역폭(리소스 블록당 12개의 부반송파)
부반송파 간격: 15, 30, 60, 120, 240(kHz)
순환 전치 길이: 일반 또는 확장
송신 안테나와 수신 안테나의 개수: 1, 2 또는 4.
계층 개수. 송신 안테나와 수신 안테나 개수의 합보다 작거나 같아야 합니다.
지정된 SRS 파라미터에는 다음이 포함됩니다.
SRS 안테나 포트 개수: 1, 2, 4
슬롯당 SRS에 할당된 OFDM 심볼 수: 1, 2, 4
슬롯 내 SRS 송신의 시작 OFDM 심볼. 일반 CP의 경우 (8...13)이고 확장 CP의 경우 (6...11)이어야 합니다.
RB에 지정된 주파수에서 SRS의 시작 위치
대역폭 및 주파수 도약 구성인
CSRS
,BSRS
및BHop
. 주파수 도약을 비활성화하려면BHop >= BSRS
를 설정하십시오.부반송파의 SRS 주파수 밀도를 지정하는 송신 콤(comb): 2, 4
슬롯 내에서 반복되는 SRS 심볼 개수. 이 경우
Repetition
심볼 블록에서 주파수 도약이 비활성화됩니다. 반복하지 않으려면Repetition = 1
로 설정하십시오.슬롯 내 SRS의 주기성과 오프셋.
리소스 유형은 'periodic', 'semi-persistent' 및 'aperiodic'일 수 있습니다. 비주기적(aperiodic) SRS 자원 유형의 경우 모든 슬롯에서 주파수 도약 패턴이 초기화됩니다.
% Create UE/carrier configuration ue = nrCarrierConfig; ue.NSizeGrid = 52; % Bandwidth in number of resource blocks (52RBs at 15kHz SCS for 10MHz BW) ue.SubcarrierSpacing = 15; % 15, 30, 60, 120, 240 (kHz) ue.CyclicPrefix = 'Normal'; % 'Normal' or 'Extended' nTxAnts = 2; % Number of transmit antennas (1,2,4) nRxAnts = 2; % Number of receive antennas nLayers = min(nTxAnts,nRxAnts); % Configure a periodic multi-port SRS and enable frequency hopping srs = nrSRSConfig; srs.NumSRSSymbols = 4; % Number of OFDM symbols allocated per slot (1,2,4) srs.SymbolStart = 8; % Starting OFDM symbol within a slot srs.NumSRSPorts = nTxAnts; % Number of SRS antenna ports (1,2,4). srs.FrequencyStart = 0; % Frequency position of the SRS in BWP in RBs srs.NRRC = 0; % Additional offset from FreqStart specified in blocks of 4 PRBs (0...67) srs.CSRS = 14; % Bandwidth configuration C_SRS (0...63). It controls the allocated bandwidth to the SRS srs.BSRS = 0; % Bandwidth configuration B_SRS (0...3). It controls the allocated bandwidth to the SRS srs.BHop = 0; % Frequency hopping configuration (0...3). Set BHop < BSRS to enable frequency hopping srs.KTC = 2; % Comb number (2,4). Frequency density in subcarriers srs.Repetition = 2; % Repetition (1,2,4). It disables frequency hopping in blocks of |Repetition| symbols srs.SRSPeriod = [2 0]; % Periodicity and offset in slots. SRSPeriod(2) must be < SRSPeriod(1) srs.ResourceType = 'periodic'; % Resource type ('periodic', 'semi-persistent','aperiodic'). Use 'aperiodic' to disable inter-slot frequency hopping
동기화, 채널 추정 및 CSI 측정 구성
이 예제에서는 SRS 후보 슬롯에서 동기화 및 채널 추정을 수행합니다. 타이밍 및 채널 추정값은 SRS 송신이 포함된 슬롯에서만 업데이트됩니다. 주파수 도약 SRS 설정에서 채널 추정값은 SRS 심볼을 포함하는 리소스 블록에서만 업데이트됩니다. SRS 송신이 없는 경우, 이전 슬롯의 타이밍 및 채널 추정값이 유지되고 CSI 수집에 사용됩니다. 마찬가지로 잡음 파워 추정값은 SRS 후보 슬롯에서만 업데이트됩니다.
논리형 변수 practicalSynchronization
은 채널 동기화 동작을 제어합니다. true
로 설정된 경우 이 예제에서는 수신된 SRS 값을 기반으로 실질적 동기화를 수행합니다. false
로 설정된 경우 이 예제에서는 완벽한 동기화를 수행합니다. 동기화는 완벽한 채널 추정과 실질적 채널 추정의 동기화를 유지하기 위해 SRS가 송신되는 슬롯에서만 수행됩니다.
practicalSynchronization = true;
이 예제에서는 반송파 대역폭을 여러 개의 서브대역으로 분할하여 CSI를 추정합니다. RB의 주파수 서브대역 크기를 지정합니다.
csiSubbandSize = 4; % Number of RBs per subband
전파 채널 모델 구성
TDL 채널 모델 객체를 생성하고 해당 전파 특성을 지정합니다. 채널 지연 확산과 최대 도플러 편이를 선택하여 시뮬레이션 기간과 반송파 대역폭 내에서 주파수 선택적 시변 채널을 생성합니다.
channel = nrTDLChannel; channel.DelayProfile = 'TDL-C'; channel.DelaySpread = 40e-9; channel.MaximumDopplerShift = 30; channel.NumTransmitAntennas = nTxAnts; channel.NumReceiveAntennas = nRxAnts; channel.Seed = 5; % Set channel sample rate ofdmInfo = nrOFDMInfo(ue); channel.SampleRate = ofdmInfo.SampleRate; % Get the maximum delay of the channel chInfo = info(channel); maxChDelay = chInfo.MaximumChannelDelay; % Reset random generator for reproducibility rng('default');
처리 루프
슬롯당 CSI를 측정합니다. CSI는 다음 단계를 통해 얻게 됩니다.
리소스 그리드를 생성합니다. SRS 심볼과 인덱스를 사용하여 RE(리소스 요소) 그리드를 만듭니다.
파형 생성. 그런 다음 생성된 그리드는 OFDM 변조됩니다.
잡음 채널 모델링. 파형이 TDL 페이딩 채널을 통과합니다. AWGN이 추가됩니다. 각 계층의 SNR은 RE별 및 수신 안테나별로 정의됩니다.
동기화 및 OFDM 복조 수행. 완벽한 동기화의 경우, 채널 임펄스 응답을 복원하고 사용하여 수신된 파형을 동기화합니다. 실질적 동기화의 경우, 수신된 파형을 SRS와 상관시킵니다. 그런 다음 동기화된 신호에 대해 OFDM 복조가 수행됩니다.
채널 추정 수행. 완벽한 채널 추정의 경우, 채널 임펄스 응답을 복원하고 OFDM 복조를 수행하여 채널 추정값을 제공합니다. 실질적인 채널 추정의 경우, 송신된 SRS를 사용합니다.
PMI 선택. SRS 기반 채널 추정값은 각 CSI 추정 서브대역에서 최선의 PMI를 선택하는 데 사용됩니다. PMI 선택 기준에 따라, 프리코딩 후 평균 SINR(신호 대 간섭 잡음비)이 최대화됩니다.
PMI 선택 SINR 손실. SINR 손실은 추정된 PMI와 이상적 PMI로 프리코딩한 후의 SINR을 비교하여 계산됩니다. 이상적 PMI는 완벽한 채널 추정을 사용하여 선택됩니다.
% Number of slots to simulate numSlots = numFrames*ue.SlotsPerFrame; % Total number of subcarriers and symbols per slot K = ue.NSizeGrid * 12; L = ue.SymbolsPerSlot; % Initialize arrays storing channel estimates allTxGrid = zeros([K L*numSlots nTxAnts]); slotGridSize = [K L nRxAnts nTxAnts]; hEst = zeros(slotGridSize); hestInterp = zeros(slotGridSize); hEstUpdate = zeros(slotGridSize); totalGridSize = [K L*numSlots nRxAnts nTxAnts]; allHest = zeros(totalGridSize); allHestPerfect = zeros(totalGridSize); allHestInterp = zeros(totalGridSize); % Initialize noise power estimate nvar = 0; % Calculate the number of CSI subbands for the carrier numCSISubbands = ceil(ue.NSizeGrid/csiSubbandSize); % Initialize SINR per subband, slot, and PMI maxPMI = hMaxPUSCHPrecodingMatrixIndicator(nLayers,nTxAnts); sinrSubband = zeros([numCSISubbands numSlots maxPMI+1]); % Initialize PMI matrix and SINR loss pmi = NaN(numCSISubbands,numSlots); pmiPerfect = pmi; loss = zeros(size(pmi)); % Initialize timing estimation offset offset = chInfo.ChannelFilterDelay; % Calculate SRS CDM lengths cdmLengths = hSRSCDMLengths(srs); % OFDM symbols used for CSI acquisition csiSelectSymbols = srs.SymbolStart + (1:srs.NumSRSSymbols); for nSlot = 0:numSlots-1 % Update slot counter ue.NSlot = nSlot; % Generate SRS and map to slot grid [srsIndices,srsIndInfo] = nrSRSIndices(ue,srs); srsSymbols = nrSRS(ue,srs); % Create a slot-wise resource grid empty grid and map SRS symbols txGrid = nrResourceGrid(ue,nTxAnts); txGrid(srsIndices) = srsSymbols; % Determine if the slot contains SRS isSRSSlot= ~isempty(srsSymbols); % OFDM Modulation [txWaveform,waveformInfo] = nrOFDMModulate(ue,txGrid); txWaveform = [txWaveform; zeros(maxChDelay, size(txWaveform,2))]; %#ok<AGROW> % required later to flush the channel filter to obtain the received signal % Transmission through channel [rxWaveform,pathGains] = channel(txWaveform); % Add AWGN to the received time domain waveform % Normalize noise power to take account of sampling rate, which is % a function of the IFFT size used in OFDM modulation. The SNR % is defined per RE for each receive antenna (TS 38.101-4). SNR = 10^(snr/10); N0 = 1/sqrt(2.0*nRxAnts*double(waveformInfo.Nfft)*SNR); noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform))); rxWaveform = rxWaveform + noise; % Perform timing offset estimation pathFilters = getPathFilters(channel); % Timing estimation is only performed in the slots where the SRS is % transmitted to keep the perfect and practical channel estimation % synchronized. if isSRSSlot if practicalSynchronization % Practical synchronization. Correlate the received waveform % with the SRS to give timing offset estimate offset = nrTimingEstimate(ue,rxWaveform,srsIndices,srsSymbols); else offset = nrPerfectTimingEstimate(pathGains,pathFilters); %#ok<UNRCH> end end % Perform OFDM demodulation rxGrid = nrOFDMDemodulate(ue,rxWaveform(1+offset:end,:)); % Perform practical channel estimation % Update channel estimates only in the symbols and RBs containing SRS % in this slot and hold the estimates from the previous slot in other % locations. nvar is not updated when there is no SRS transmission. Use % a time-averaging window that covers all the SRS symbols transmitted. if isSRSSlot % this slot contains an SRS transmission [hEst,nvar] = nrChannelEstimate(ue,rxGrid,srsIndices,srsSymbols,'AveragingWindow',[0 7],'CDMLengths',cdmLengths); % Use channel estimate from previous slot for OFDM symbols before the first SRS symbol hestInterp = repmat(hestInterp(:,end,:,:),1,ue.SymbolsPerSlot); % Update channel estimate in OFDM symbols and RB where the SRS is % present and hold all channel estimates until the end of the slot firstSymbol = srs.SymbolStart+1; lastSymbol = srs.SymbolStart + srs.NumSRSSymbols; hEstUpdate(:,firstSymbol:lastSymbol,:,:) = hEst(:,firstSymbol:lastSymbol,:,:); hEstUpdate(:,lastSymbol:L,:,:) = repmat(hEst(:,lastSymbol,:,:),1,ue.SymbolsPerSlot-lastSymbol+1); idxHEstUpdate = hEstUpdate ~= 0; % Indices of updated channel estimates hestInterp(idxHEstUpdate) = hEstUpdate(idxHEstUpdate); else % Hold previous channel estimates if this slot does not contain SRS hestInterp = repmat(hestInterp(:,end,:,:),1,ue.SymbolsPerSlot); end % PMI Selection % Select the precoder matrix indicators for a number of layers using % the interpolated channel estimates in the OFDM symbols specified by % csiSelectSymbols. The PMIs are estimated per CSI subband [pmi(:,nSlot+1),sinrSubband(:,nSlot+1,:),subbandIndices] = hPMISelect(nLayers, hestInterp(:,csiSelectSymbols,:,:), nvar, csiSubbandSize); % PMI selection SINR loss % Calculate the performance loss as a ratio of the SINR after precoding % with PMIs selected using a practical channel estimate and the SINR % after precoding with PMIs selected using a perfect channel estimate. % Calculate perfect channel estimate for perfect PMI selection hEstPerfect = nrPerfectChannelEstimate(ue,pathGains,pathFilters,offset); % Perfect noise estimate from noise realization noiseGrid = nrOFDMDemodulate(ue,noise(1+offset:end,:)); nvarPerfect = var(noiseGrid(:)); [loss(:,nSlot+1),pmiPerfect(:,nSlot+1)] = hPMISelectionSINRLoss(pmi(:,nSlot+1), nLayers, hEstPerfect(:,csiSelectSymbols,:,:), nvarPerfect); % Save a copy of all transmitted OFDM grids and channel estimates for % display purposes thisSlot = nSlot*L + (1:L); % Symbols of the current slot allTxGrid(:,thisSlot,:) = txGrid; allHest(:,thisSlot,:,:) = hEst; allHestInterp(:,thisSlot,:,:) = hestInterp; allHestPerfect(:,thisSlot,:,:) = hEstPerfect; end
결과
이 섹션에는 구성된 모든 프레임에 대해 다음 결과가 표시됩니다.
SRS가 포함된 송신된 OFDM 그리드
완벽한 채널 추정과 실질적 채널 추정 및 채널 추정 오차. 오차는 완벽한 채널 추정과 실질적 채널 추정 간 차이의 절대값으로 계산됩니다.
완벽한 채널 추정과 실질적 채널 추정을 사용하여 선택한 PMI 및 PMI 절대 오차.
최선의 추정된 PMI로 프리코딩한 후의 서브대역당 평균 SINR
SINR 성능 손실
% Create x-axis and y-axis vectors
symbols = 0:(ue.NSlot+1)*ue.SymbolsPerSlot-1;
slots = 0:ue.NSlot;
subcarriers = 1:ue.NSizeGrid*12;
resourceBlocks = 1:ue.NSizeGrid;
SRS가 포함된 송신된 OFDM 그리드를 표시합니다.
figure imagesc(symbols,subcarriers,abs(allTxGrid(:,:,1,1))); xlabel('OFDM symbol'); ylabel('Subcarrier'); axis xy; title('Transmitted SRS (port 1)');
완벽한 채널 추정과 실질적 채널 추정, OFDM 심볼 및 부반송파당 채널 추정 오차를 표시합니다. 채널 추정 오차는 완벽한 채널 추정과 실질적 채널 추정 간 차이의 절대값으로 정의됩니다.
% Remove first OFDM symbols not containing SRS to improve visualization of % channel estimation error hEstInterp = allHestInterp; idx = 1:(srs.SRSPeriod(2)*ue.SymbolsPerSlot + srs.SymbolStart); hEstInterp(:,idx,:,:) = NaN; hEstInterp((srs.NRB*12+1):end,:,:,:) = NaN; hChannelEstimationPlot(symbols,subcarriers,allHestPerfect,hEstInterp);
완벽한 채널 추정과 실질적 채널 추정을 사용하여 선택한 PMI와 슬롯 및 RB당 PMI 선택 SINR 손실을 표시합니다. SINR 손실은 추정된 PMI와 완벽한 PMI로 프리코딩한 후의 SINR 비율로 정의됩니다. 추정된 PMI는 실질적 채널 추정을 사용하여 구하고 완벽한 PMI는 완벽한 채널 추정을 사용하여 선택합니다.
% First expand loss from subbands into RBs for display purposes
pmiRB = hExpandSubbandToRB(pmi, csiSubbandSize, ue.NSizeGrid);
pmiPerfectRB = hExpandSubbandToRB(pmiPerfect, csiSubbandSize, ue.NSizeGrid);
lossRB = hExpandSubbandToRB(loss, csiSubbandSize, ue.NSizeGrid);
hPMIPlot(slots,resourceBlocks,pmiRB,pmiPerfectRB,lossRB);
다음으로, 완벽한 채널 추정과 실질적 채널 추정을 사용하여 얻은 PMI를 비교합니다. 전체 PMI 대비 올바른 PMI 비율과 오차가 발생한 리소스 그리드의 위치가 표시됩니다.
numLayers = min(size(allHestInterp,[3 4])); if numLayers ~= 1 pmiErr = sum( abs(pmi - pmiPerfect) > 0, [1 2])./ sum( ~isnan(pmi), [1 2]); TotPMIEst = sum(~isnan(pmi),[1 2]); fprintf('Number of estimated PMI: %d \n', TotPMIEst); fprintf(' Number of wrong PMI: %d \n', ceil(pmiErr*TotPMIEst)); fprintf(' Relative error: %.1f (%%) \n', pmiErr*100); else fprintf('For a single layer, PMI is always 0.\n'); end
Number of estimated PMI: 130 Number of wrong PMI: 3 Relative error: 2.3 (%)
서브대역당 SINR을 최대화하는 PMI로 프리코딩한 후 얻은, 슬롯과 RB당 SINR를 표시합니다.
hBestSINRPlot(slots,resourceBlocks,sinrSubband,pmi,csiSubbandSize);
요약 및 심층 탐구
이 예제에서는 코드북 기반 업링크 송신 모드에서 일반적으로 사용되는 동기화, 채널 추정 및 PMI 선택에 SRS를 사용하는 방법을 보여줍니다. 또한 이 예제에서는 프리코딩 후의 SINR을 사용하여 채널 추정 및 PMI 선택 성능 손실도 평가합니다.
보다 복잡한 설정에서 채널 추정 및 PMI 선택의 성능을 검토할 수 있습니다. SRS 주기성을 늘리고, 채널 추정 에이징이 어떻게 지연을 유발하고 프리코딩 후의 SINR을 악화시키는지 관측합니다. 또한 BHop < BSRS이 성립하도록 SRS 파라미터를 설정하여 주파수 도약 조건에서 성능을 조사할 수 있습니다. 이 설정에서는 채널 추정 에이징의 빈도가 균일하지 않습니다.
부록
이 예제에서는 다음 헬퍼 함수를 사용합니다.
참고 문헌
3GPP TS 38.211. "NR; Physical channels and modulation" 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
3GPP TS 38.101-4. "NR; User Equipment (UE) radio transmission and reception. Part 4: Performance requirements" 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
로컬 함수
% Displays perfect and practical channel estimates and the channel % estimation error for the first transmit and receive ports. The channel % estimation error is defined as the absolute value of the difference % between the perfect and practical channel estimates. function hChannelEstimationPlot(symbols,subcarriers,allHestPerfect,allHestInterp) figure subplot(311) imagesc(symbols, subcarriers, abs(allHestPerfect(:,:,1,1))); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); colorbar; title('Perfect Channel Estimate (TxAnt=1, RxAnt=1)'); subplot(312) imagesc(symbols, subcarriers, abs(allHestInterp(:,:,1,1)), ... 'AlphaData',~isnan(allHestInterp(:,:,1,1))) axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); colorbar; title('SRS-based Practical Channel Estimate (TxAnt=1, RxAnt=1) '); % Display channel estimation error, defined as the difference between the % SRS-based and perfect channel estimates subplot(313) hestErr = abs(allHestInterp - allHestPerfect); imagesc(symbols, subcarriers, hestErr(:,:,1,1),... 'AlphaData',~isnan(hestErr(:,:,1,1))); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); colorbar; title('Channel Estimation Error (TxAnt=1, RxAnt=1)'); end % Displays the PMI evolution and PMI estimation SINR loss over time and % frequency. The SINR loss is defined as a ratio of the SINR after % precoding with estimated and perfect PMIs. Estimated PMIs are % obtained using a practical channel estimate and perfect PMIs are % selected using a perfect channel estimate. function hPMIPlot(slots,resourceBlocks,pmiRB,pmiPerfectRB,lossRB) figure subplot(311) imagesc(slots,resourceBlocks,pmiPerfectRB,'AlphaData',~isnan(pmiPerfectRB)); axis xy; c = clim; cm = colormap; colormap( cm(1:floor(size(cm,1)/(c(2)-c(1)) -1):end,:) ); % Adjust colormap to PMI discrete values colorbar xlabel('Slot'); ylabel('Resource block'), title('PMI Selected using Perfect Channel Estimates') subplot(312) imagesc(slots,resourceBlocks,pmiRB,'AlphaData',~isnan(pmiRB)); axis xy; colorbar, xlabel('Slot'); ylabel('Resource block'), title('PMI Selected using SRS') subplot(313) imagesc(slots,resourceBlocks,lossRB,'AlphaData',~isnan(lossRB)); colormap(gca,cm) xlabel('Slot'); ylabel('Resource block'); axis xy; colorbar; title('PMI Estimation SINR Loss (dB)') end % Displays the SINR per resource block obtained after precoding with the % PMI that maximizes the SINR per subband. function hBestSINRPlot(slots,resourceBlocks,sinrSubband,pmi,csiBandSize) % Display SINR after precoding with best PMI bestSINRPerSubband = nan(size(sinrSubband,[1 2])); % Get SINR per subband and slot using best PMI [sb,nslot] = find(~isnan(pmi)); for i = 1:length(sb) bestSINRPerSubband(sb(i),nslot(i)) = sinrSubband(sb(i),nslot(i),pmi(sb(i),nslot(i))+1); end % First expand SINR from subbands into RBs for display purposes bestSINRPerRB = hExpandSubbandToRB(bestSINRPerSubband, csiBandSize, length(resourceBlocks)); figure sinrdb = 10*log10(abs(bestSINRPerRB)); imagesc(slots,resourceBlocks,sinrdb,'AlphaData',~isnan(sinrdb)); axis xy; colorbar; xlabel('Slot'); ylabel('Resource block') title('Average SINR Per Subband and Slot After Precoding with Best PMI (dB)') end % Expands a 2D matrix of values per subband in the first dimension into a % matrix of values per resource block. function rbValues = hExpandSubbandToRB(subbandValues, bandSize, NRB) lastBandSize = mod(NRB,bandSize); lastBandSize = lastBandSize + bandSize*(lastBandSize==0); rbValues = [kron(subbandValues(1:end-1,:),ones(bandSize,1));... subbandValues(end,:).*ones(lastBandSize,1)]; end