毫米波   频率的支持需要定向链接,这导致在 NR 中初始访问光束管理程序的规范。光束管理是一组第 1 层(物理)和第 2 层(中等访问控制)程序,用于获取和维护一组光束对链(在 gNB 中使用的光束与 UE 使用的光束配对)。下行链路和上行链路传输和接收  都适用光束管理程序。这些程序包括:

 rng(211);                           % Set RNG state for repeatability%% Simulation Parameters
%
% Define system parameters for the example. Modify these parameters to
% explore their impact on the system.prm.NCellID = 1;                    % Cell ID
prm.FreqRange = 'FR1';              % Frequency range: 'FR1' or 'FR2'
prm.CenterFreq = 3.5e9;             % Hz
prm.SSBlockPattern = 'Case B';      % Case A/B/C/D/E
prm.SSBTransmitted = [ones(1,8) zeros(1,0)];   % 4/8 or 64 in lengthprm.TxArraySize = [8 8];            % Transmit array size, [rows cols]
prm.TxAZlim = [-60 60];             % Transmit azimuthal sweep limits
prm.TxELlim = [-90 0];              % Transmit elevation sweep limitsprm.RxArraySize = [2 2];            % Receive array size, [rows cols]
prm.RxAZlim = [-180 180];           % Receive azimuthal sweep limits
prm.RxELlim = [0 90];               % Receive elevation sweep limitsprm.ElevationSweep = false;         % Enable/disable elevation sweep
prm.SNRdB = 30;                     % SNR, dB
prm.RSRPMode = 'SSSwDMRS';          % {'SSSwDMRS', 'SSSonly'}prm = validateParams(prm);%% Synchronization Signal Burst Configuration
%
% Set up the synchronization signal burst parameters by using the specified
% system parameters. For initial access, set the SSB periodicity to 20 ms.txBurst.BlockPattern = prm.SSBlockPattern;
txBurst.SSBTransmitted = prm.SSBTransmitted;
txBurst.NCellID = prm.NCellID;
txBurst.SSBPeriodicity = 20;
txBurst.NFrame = 0;
txBurst.Windowing = 0;
txBurst.DisplayBurst = true;% Assume same subcarrier spacing for carrier as the burst
carrier = nrCarrierConfig('NCellID',prm.NCellID,'NFrame',txBurst.NFrame);
carrier.SubcarrierSpacing = prm.SCS;
carrierInfo = nrOFDMInfo(carrier);
txBurst.SampleRate = carrierInfo.SampleRate;c = physconst('LightSpeed');   % Propagation speed
lambda = c/prm.CenterFreq;     % Wavelengthprm.posTx = [0;0;0];           % Transmit array position, [x;y;z], meters
prm.posRx = [100;50;0];        % Receive array position, [x;y;z], meterstoRxRange = rangeangle(prm.posTx,prm.posRx);
spLoss = fspl(toRxRange,lambda);    % Free space path loss% Transmit array
if prm.IsTxURA% Uniform rectangular arrayarrayTx = phased.URA(prm.TxArraySize,0.5*lambda, ...'Element',phased.IsotropicAntennaElement('BackBaffled',true));
else% Uniform linear arrayarrayTx = phased.ULA(prm.NumTx, ...'ElementSpacing',0.5*lambda, ...'Element',phased.IsotropicAntennaElement('BackBaffled',true));
end% Receive array
if prm.IsRxURA% Uniform rectangular arrayarrayRx = phased.URA(prm.RxArraySize,0.5*lambda, ...'Element',phased.IsotropicAntennaElement);
else% Uniform linear arrayarrayRx = phased.ULA(prm.NumRx, ...'ElementSpacing',0.5*lambda, ...'Element',phased.IsotropicAntennaElement);
end% Scatterer locations
prm.FixedScatMode = true;
if prm.FixedScatMode% Fixed single scatterer locationprm.ScatPos = [50; 80; 0];
else% Generate scatterers at random positionsNscat = 10;        % Number of scatterers azRange = -180:180;elRange = -90:90;randAzOrder = randperm(length(azRange));randElOrder = randperm(length(elRange));azAngInSph = azRange(randAzOrder(1:Nscat));elAngInSph = elRange(randElOrder(1:Nscat));r = 20;            % radius[x,y,z] = sph2cart(deg2rad(azAngInSph),deg2rad(elAngInSph),r);prm.ScatPos = [x;y;z] + (prm.posTx + prm.posRx)/2;
end% Configure channel
channel = phased.ScatteringMIMOChannel;
channel.PropagationSpeed = c;
channel.CarrierFrequency = prm.CenterFreq;
channel.SampleRate = txBurst.SampleRate;
channel.SimulateDirectPath = false;
channel.ChannelResponseOutputPort = true;
channel.Polarization = 'None';
channel.TransmitArray = arrayTx;
channel.TransmitArrayPosition = prm.posTx;
channel.ReceiveArray = arrayRx;
channel.ReceiveArrayPosition = prm.posRx;
channel.ScattererSpecificationSource = 'Property';
channel.ScattererPosition = prm.ScatPos;
channel.ScattererCoefficient = ones(1,size(prm.ScatPos,2));% Get maximum channel delay
[~,~,tau] = channel(complex(randn(txBurst.SampleRate*1e-3,prm.NumTx), ...randn(txBurst.SampleRate*1e-3,prm.NumTx)));
maxChDelay = ceil(max(tau)*txBurst.SampleRate);%% Burst Generation
%
% Create the SS burst waveform [ <#14 3> ] by calling the |hSSBurst| helper
% function. The generated waveform is not yet beamformed.% Create and display burst information
txBurstInfo = hSSBurstInfo(txBurst);
disp(txBurstInfo);% Generate burst waveform and grid
[burstWaveform,txBurstGrid] = hSSBurst(txBurst);%% Transmit-End Beam Sweeping
%
% To achieve TRP beam sweeping, beamform each of the SS blocks in the
% generated burst using analog beamforming. Based on the number of SS
% blocks in the burst and the sweep ranges specified, determine both the
% azimuth and elevation directions for the different beams. Then beamform
% the individual blocks within the burst to each of these directions.% Number of beams at both transmit and receive ends
numBeams = sum(txBurst.SSBTransmitted);% Transmit beam angles in azimuth and elevation, equi-spaced
azBW = beamwidth(arrayTx,prm.CenterFreq,'Cut','Azimuth');
elBW = beamwidth(arrayTx,prm.CenterFreq,'Cut','Elevation');
txBeamAng = hGetBeamSweepAngles(numBeams,prm.TxAZlim,prm.TxELlim, ...azBW,elBW,prm.ElevationSweep);% For evaluating transmit-side steering weights
SteerVecTx = phased.SteeringVector('SensorArray',arrayTx, ...'PropagationSpeed',c);% Apply steering per OFDM symbol for each SSB
carrier.NSizeGrid = txBurstInfo.NRB;
ofdmInfo = nrOFDMInfo(carrier);
gridSymLengths = repmat(ofdmInfo.SymbolLengths,1, ...size(txBurstGrid,2)/length(ofdmInfo.SymbolLengths));
%   repeat burst over numTx to prepare for steering
strTxWaveform = repmat(burstWaveform,1,prm.NumTx)./sqrt(prm.NumTx);
for ssb = 1:length(txBurstInfo.SSBIndex)% Extract SSB waveform from burstblockSymbols = txBurstInfo.OccupiedSymbols(ssb,:);startSSBInd = sum(gridSymLengths(1:blockSymbols(1)-1))+1;endSSBInd = sum(gridSymLengths(1:blockSymbols(4)));ssbWaveform = strTxWaveform(startSSBInd:endSSBInd,1);% Generate weights for steered directionwT = SteerVecTx(prm.CenterFreq,txBeamAng(:,ssb));% Apply weights per transmit element to SSBstrTxWaveform(startSSBInd:endSSBInd,:) = ssbWaveform.*(wT');end% Receive beam angles in azimuth and elevation, equi-spaced
azBW = beamwidth(arrayRx,prm.CenterFreq,'Cut','Azimuth');
elBW = beamwidth(arrayRx,prm.CenterFreq,'Cut','Elevation');
rxBeamAng = hGetBeamSweepAngles(numBeams,prm.RxAZlim,prm.RxELlim, ...azBW,elBW,prm.ElevationSweep);% For evaluating receive-side steering weights
SteerVecRx = phased.SteeringVector('SensorArray',arrayRx, ...'PropagationSpeed',c);% AWGN level
SNR = 10^(prm.SNRdB/20);                        % Convert to linear gain
N0 = 1/(sqrt(2.0*prm.NumRx*double(ofdmInfo.Nfft))*SNR); % Noise Std. Dev.% Generate a reference grid for timing correction
%   assumes an SSB in first slot
pssRef = nrPSS(carrier.NCellID);
pssInd = nrPSSIndices;
pbchdmrsRef = nrPBCHDMRS(carrier.NCellID,txBurstInfo.ibar_SSB(1));
pbchDMRSInd = nrPBCHDMRSIndices(carrier.NCellID);
pssGrid = zeros([240 4]);
pssGrid(pssInd) = pssRef;
pssGrid(pbchDMRSInd) = pbchdmrsRef;
refGrid = zeros([12*carrier.NSizeGrid ofdmInfo.SymbolsPerSlot]);
refGrid(txBurstInfo.OccupiedSubcarriers, ...txBurstInfo.OccupiedSymbols(1,:)) = pssGrid;% Loop over all receive beams
rsrp = zeros(numBeams,numBeams);
for rIdx = 1:numBeams% Fading channeltxWave = [strTxWaveform; zeros(maxChDelay,size(strTxWaveform,2))];fadWave = channel(txWave);% AWGN, after accounting for path lossnoise = N0*complex(randn(size(fadWave)),randn(size(fadWave)));rxWaveform = fadWave*(10^(spLoss/20)) + noise;% Generate weights for steered directionwR = SteerVecRx(prm.CenterFreq,rxBeamAng(:,rIdx));% Apply weights per receive elementif strcmp(prm.FreqRange, 'FR1')strRxWaveform = rxWaveform.*(wR');else  % for FR2, combine signal from antenna elementsstrRxWaveform = rxWaveform*conj(wR);end% Correct timingoffset = nrTimingEstimate(carrier, ...strRxWaveform(1:ofdmInfo.SampleRate*1e-3,:),refGrid*wR(1)');if offset > maxChDelayoffset = 0;endstrRxWaveformS = strRxWaveform(1+offset:end,:);% OFDM DemodulaterxGrid = nrOFDMDemodulate(carrier,strRxWaveformS);% Loop over all SSBs in rxGrid (transmit end)for tIdx = 1:numBeams% Get each SSB gridrxSSBGrid = rxGrid(txBurstInfo.OccupiedSubcarriers, ...txBurstInfo.OccupiedSymbols(tIdx,:),:);% Make measurements, store per receive, transmit beam        rsrp(rIdx,tIdx) = measureSSB(rxSSBGrid,prm.RSRPMode,txBurst.NCellID);end
end%% Beam Determination
%
% After the dual-end sweep and measurements are complete, determine the
% best beam-pair link based on the RSRP measurement.[m,i] = max(rsrp,[],'all','linear');    % First occurence is output
% i is column-down first (for receive), then across columns (for transmit)
[rxBeamID,txBeamID] = ind2sub([numBeams numBeams],i(1));% Display the selected beam pair
disp(['Selected Beam pair with RSRP: ' num2str(10*log10(rsrp(rxBeamID, ...txBeamID))+30) ' dBm', 13 '  Transmit #' num2str(txBeamID) ...' (Azimuth: ' num2str(txBeamAng(1,txBeamID)) ', Elevation: ' ...num2str(txBeamAng(2,txBeamID)) ')' 13 '  Receive #' num2str(rxBeamID) ...' (Azimuth: ' num2str(rxBeamAng(1,rxBeamID)) ', Elevation: ' ...num2str(rxBeamAng(2,rxBeamID)) ')' ]);% Display final beam pair patterns
h = figure('Position',figposition([32 55 32 40]),'MenuBar','none');
h.Name = 'Selected Transmit Array Response Pattern';
wT = SteerVecTx(prm.CenterFreq,txBeamAng(:,txBeamID));
pattern(arrayTx,prm.CenterFreq,'PropagationSpeed',c,'Weights',wT);h = figure('Position',figposition([32 55 32 40]),'MenuBar','none');
h.Name = 'Selected Receive Array Response Pattern';
wR = SteerVecRx(prm.CenterFreq,rxBeamAng(:,rxBeamID));
pattern(arrayRx,prm.CenterFreq,'PropagationSpeed',c,'Weights',wR);% Plot MIMO scenario with tx, rx, scatterers, and determined beams
prmScene = struct();
prmScene.txArraySize = prm.TxArraySize;
prmScene.rxArraySize = prm.RxArraySize;
prmScene.txElemPos = getElementPosition(arrayTx); % meters
prmScene.rxElemPos = getElementPosition(arrayRx); % meters
prmScene.txArrayPos = prm.posTx;
prmScene.rxArrayPos = prm.posRx;
prmScene.txAzAngles = -90:90;
prmScene.rxAzAngles = [90:180 -179:-90];
prmScene.scatPos = prm.ScatPos;
prmScene.lambda = lambda;
prmScene.arrayScaling = 1;
hPlotSpatialMIMOScene(prmScene,wT,wR);
if ~prm.ElevationSweepview(2);
endfunction prm = validateParams(prm)
% Validate user specified parameters and return updated parameters
%
% Only cross-dependent checks are made for parameter consistency.if strcmpi(prm.FreqRange,'FR1')if prm.CenterFreq > 7.125e9 || prm.CenterFreq < 410e6error(['Specified center frequency is outside the FR1 ', ...'frequency range (410 MHz - 7.125 GHz).']);endif strcmpi(prm.SSBlockPattern,'Case D') ||  ...strcmpi(prm.SSBlockPattern,'Case E')error(['Invalid SSBlockPattern for selected FR1 frequency ' ...'range. SSBlockPattern must be one of ''Case A'' or ' ...'''Case B'' or ''Case C'' for FR1.']);endif ~((length(prm.SSBTransmitted)==4) || ...(length(prm.SSBTransmitted)==8))error(['SSBTransmitted must be a vector of length 4 or 8', ...'for FR1 frequency range.']);endif (prm.CenterFreq <= 3e9) && (length(prm.SSBTransmitted)~=4)error(['SSBTransmitted must be a vector of length 4 for ' ...'center frequency less than or equal to 3GHz.']);endif (prm.CenterFreq > 3e9) && (length(prm.SSBTransmitted)~=8)error(['SSBTransmitted must be a vector of length 8 for ', ...'center frequency greater than 3GHz and less than ', ...'or equal to 7.125GHz.']);endelse % 'FR2'if prm.CenterFreq > 52.6e9 || prm.CenterFreq < 24.25e9error(['Specified center frequency is outside the FR2 ', ...'frequency range (24.25 GHz - 52.6 GHz).']);endif ~(strcmpi(prm.SSBlockPattern,'Case D') || ...strcmpi(prm.SSBlockPattern,'Case E'))error(['Invalid SSBlockPattern for selected FR2 frequency ' ...'range. SSBlockPattern must be either ''Case D'' or ' ...'''Case E'' for FR2.']);endif length(prm.SSBTransmitted)~=64error(['SSBTransmitted must be a vector of length 64 for ', ...'FR2 frequency range.']);endendprm.NumTx = prod(prm.TxArraySize);prm.NumRx = prod(prm.RxArraySize);    if prm.NumTx==1 || prm.NumRx==1error(['Number of transmit or receive antenna elements must be', ... ' greater than 1.']);endprm.IsTxURA = (prm.TxArraySize(1)>1) && (prm.TxArraySize(2)>1);prm.IsRxURA = (prm.RxArraySize(1)>1) && (prm.RxArraySize(2)>1);if ~( strcmpi(prm.RSRPMode,'SSSonly') || ...strcmpi(prm.RSRPMode,'SSSwDMRS') )error(['Invalid RSRP measuring mode. Specify either ', ...'''SSSonly'' or ''SSSwDMRS'' as the mode.']);end% Select SCS based on SSBlockPatternswitch lower(prm.SSBlockPattern)case 'case a'scs = 15;case {'case b', 'case c'}scs = 30;case 'case d'scs = 120;case 'case e'scs = 240;endprm.SCS = scs;endfunction rsrp = measureSSB(rxSSBGrid,mode,NCellID)
% Compute the reference signal received power (RSRP) based on SSS, and if
% selected, also PBCH DM-RS.sssInd = nrSSSIndices;                       % SSS indicesnumRx = size(rxSSBGrid,3);rsrpSSS = zeros(numRx,1);for rxIdx = 1:numRx% Extract signals per rx elementrxSSBGridperRx = rxSSBGrid(:,:,rxIdx);rxSSS = rxSSBGridperRx(sssInd);% Average power contributions over all REs for RSrsrpSSS(rxIdx) = mean(rxSSS.*conj(rxSSS));endif strcmpi(mode,'SSSwDMRS')pbchDMRSInd = nrPBCHDMRSIndices(NCellID);    % PBCH DM-RS indicesrsrpDMRS = zeros(numRx,1);for rxIdx = 1:numRx% Extract signals per rx elementrxSSBGridperRx = rxSSBGrid(:,:,rxIdx);rxPBCHDMRS = rxSSBGridperRx(pbchDMRSInd);% Average power contributions over all REs for RSrsrpDMRS(rxIdx) = mean(rxPBCHDMRS.*conj(rxPBCHDMRS));end        endswitch lower(mode)case 'sssonly'  % Only SSSrsrp = max(rsrpSSS);     % max over receive elementscase 'ssswdmrs' % Both SSS and PBCH-DMRSrsrp = max(rsrpSSS+rsrpDMRS)/2; % max over receive elementsend
end

本文内容参考:MATLAB2020帮助文档。

位置如下图所示:

NR SSB Beam Sweeping相关推荐

  1. 5G/NR SSB与PRACH occasion如何关联?

    首先:SSB与PRACH occasion为什么能够关联参考为什么SSB与PRACH occasion能够关联? SSB如何映射PRACH和preamble参考:5G/NR SSB如何映射PRACH和 ...

  2. NR SSB概述 - PBCH 211及DMRS

    1. PBCH 211 1.1 加扰 1.2 调制 1.3 资源映射 参照"NR SSB概述 - 时域频域分布" 章节. 2. DMRS 2.1 序列 在每个SSB初始化一次 2. ...

  3. [5G][NR] SSB

    1. 什么是SSB? SSB即Synchronization Signal Block,包括PSS,SSS,PBCH. 3gpp 38.300中提供了SSB的时频资源示意图.可见,SSB中的PSS和S ...

  4. NR SSB概述 - PSS/SSS序列及PBCH

    NR中小区ID的与LTE中的一样,都由和决定,其中 ,  , 那么小区ID. 1. PSS,SSS PSS和SSS都是长度为127的序列,通过PSS同步获得及时间位置信息,从而获得SSS的位置,根据S ...

  5. 5G NR SSB(SS/PBCH Block)详解

    我们都知道LTE中终端设备也就是手机是通过基站广播发送的主同步序列和辅同步序列实现同步的,但在NR中,出现了SSB的概念,简单的说就是由原来的主同步序列.辅同步序列.物理广播信道和解调参考信号组合在一 ...

  6. NR SSB概述 - 时域频域分布

    SSB包含了PSS,SSS,PBCH. 通过PSS和SSS,UE可以获得定时信息,频偏信息,小区ID等信息:通过PBCH可以获得无线帧号,与空口进行对齐,以及调度SIB1的一些信息. 下面先将SSB作 ...

  7. 5G NR SSB和CORESET0复用模式

    在初始小区搜索过程中,UE通过PBCH获取的MIB信息,其中包括频率.SFN.子载波间隔.k_ssb和pdcch_ConfigSib1等信息.但这些信息不足以让UE进一步进行随机接入,所以UE还需要继 ...

  8. 5G NR 下行同步SSB(4)-- 频域配置多个SSB

    笔者在微信公众号GiveMe5G定期发布学习文章(更多更及时),欢迎订阅和分享,文章下方有二维码. 5G NR在时域上通过TDM的方式发送多个SSB以达到广播消息beam sweeping的效果,那么 ...

  9. 5G/NR PRACH和preamble如何与SSB进行映射?

    首先:可参考:5G/NR 为什么SSB与preamble occasion能够关联?和5G/NR SSB与PRACH occasion如何关联? 高层通过参数ssb-perRACH-OccasionA ...

最新文章

  1. GitHub:数据科学最全资料集合
  2. 科学研究发现:说谎,是儿童成长的里程碑
  3. Requested bean is currently in creation: Is there an unresolvable circular reference?
  4. 微型计算机组装实验报告虚拟,微型计算机组装与维护实训(附光盘)
  5. 《吃土》读书笔记-笔记初稿
  6. gerber文件怎么导贴片坐标_SMT贴片机在线编程调试
  7. Esper epl语句实验
  8. python 等值面 插值_利用numpy/scipy从三维阵列计算等值面
  9. JAVA语言程序设计(基础篇)第四章——课后习题解
  10. 巨杉数据库入选Gartner数据库报告,中国首家入选厂商
  11. java rslinx_如何使用AB PLC仿真软件Studio 5000 Logix Emulate
  12. 微图App有哪些实用的功能?
  13. ICMP协议和ARP协议
  14. 增强 扫描王 源码_制作一个类“全能扫描王”的简易扫描软件(opencv)
  15. python创作音乐: 计算机创作,计算音乐
  16. 介绍一下大型企业数据防泄密产品选型的思路
  17. 计算机组成原理编码键盘实验报告,计算机组成原理实验报告–杨睿.doc
  18. 模电学习笔记(七)——差分放大器电路(减法器)
  19. oracle linux7.9安装 Oracle Enterprise Manager Cloud Control13.5
  20. MPTCP iperf 发包方式

热门文章

  1. 人民币转换---java代码实现
  2. Algebra:Chapter 0 - 引言
  3. 消费升级:谁赢得供应链,谁就赢得市场
  4. Jupyter notebook打开方式
  5. 安装openssh-server报Depends: openssh-client (= 1:6.6p1-2ubuntu2.8)错误
  6. C小程序——统计字符串中出现指定串abcd的次数
  7. 「镁客早报」华为余承东欢迎苹果使用5G芯片;三星首款折叠手机本月开卖...
  8. 访谈编码怎么做_【建模28】胜任力构建的技能——编码
  9. 中国个人站长上的四个大当
  10. SpringBoot+Vue项目在线学习网站