5G下行CSI-RS波束细化全流程
好!今天我们聚焦5G NR系统的核心技术------CSI-RS波束细化,从理论到实操完整拆解其实现逻辑。本节课的目标是:掌握波束管理的两阶段流程、理解收发波束赋形的核心原理、能独立梳理代码中的关键技术节点。
一、波束细化的核心意义
在正式拆解代码前,我们先明确两个核心问题:
1. 为什么需要波束管理?
5G采用高频段传输(如FR1的3.5GHz、FR2的28GHz),高频信号路径损耗大、覆盖范围小。通过波束赋形,可将电磁波能量聚焦于目标方向,提升信号增益,解决高频覆盖难题。
2. 波束细化的两阶段逻辑(3GPP协议要求)
P-1 阶段(初始波束对捕获)
核心动作:发射端(gNB)扫 SSB 宽波束,接收端(UE)扫接收宽波束,双向波束扫描后基于 RSRP 筛选初始宽波束对。
特点:波束宽度大(典型 30°×30°),覆盖范围广,保证 UE 快速接入,但增益低,非数据传输最优解。
参考信号:SSB(同步信号块)。
P-2 阶段(发射端波束细化)
核心动作:固定接收波束(P-1 阶段筛选的最优接收宽波束),发射端在该接收波束的覆盖角度范围内,用 CSI-RS 窄波束进行扫描,基于 RSRP 筛选最优发射窄波束。
特点:仅优化发射端,接收端波束保持不变,提升下行链路的发射增益。
参考信号:NZP-CSI-RS(下行)、SRS(上行)。
P-3 阶段(接收端波束调整)
核心动作:固定发射波束(P-2 阶段筛选的最优发射窄波束),接收端在该发射波束的覆盖角度范围内,用窄波束进行扫描,基于 RSRP 筛选最优接收窄波束。
特点:仅优化接收端,进一步提升链路的接收增益,最终形成收发双窄波束的最优波束对,满足高指向性、高增益的单播数据传输需求。
参考信号:NZP-CSI-RS(下行)、SRS(上行)。
本示例重点关注发射机的下行链路波束细化。(对应的P1和P2阶段),对应的实例过程可以参考对应的下面这个图:

二、核心流程总览:从信号到决策的全链路
整个仿真流程严格遵循3GPP协议(TS 38.211/38.215),我们先建立全局认知,再逐步拆解。核心流程如下:
A[CSI-RS资源配置] --> B[天线阵列与散射体建模]
B --> C[发射端波束赋形+OFDM调制]
C --> D[散射MIMO信道+AWGN噪声添加]
D --> E[时间同步(信号对齐关键)]
E --> F[OFDM解调+接收波束赋形]
F --> G[RSRP测量+最优波束筛选]
G --> H[波束宽度计算+结果验证]
提示:整个流程可理解为"基站发信号→信号过信道→终端收信号→终端选最优波束"的闭环,核心是"波束的生成与筛选"。

三、分模块代码精讲(重点+难点解析)
模块1:CSI-RS资源配置------定义"测量基准"
核心目标:配置用于波束测量的CSI-RS信号参数,确保终端能通过该信号评估波束质量。
% 1. 载波配置(50MHz带宽,30kHz子载波间隔,FR1典型配置)
carrier = nrCarrierConfig;
carrier.NSizeGrid = 133; % 50MHz对应133个PRB(每个PRB含12个子载波)
carrier.SubcarrierSpacing = 30;
carrier.NSlot = 0; % 第0时隙
carrier.NFrame = 0; % 第0帧
% 2. CSI-RS核心配置(12个NZP-CSI-RS资源,单端口用于RSRP测量)
numNZPRes = 12; % 12个资源对应12个发射波束
csirs = nrCSIRSConfig;
csirs.CSIRSType = repmat({'nzp'},1,numNZPRes); % 非零功率CSI-RS(测量用)
csirs.CSIRSPeriod = 'on'; % 时隙内持续发射
csirs.Density = repmat({'one'},1,numNZPRes); % 时频域分布密度
csirs.RowNumber = repmat(2,1,numNZPRes); % 单端口配置(RSRP测量要求)
csirs.SymbolLocations = {0,1,2,3,4,5,6,7,8,9,10,11}; % 时域分布式部署
csirs.SubcarrierLocations = repmat({0},1,numNZPRes);
csirs.NumRB = 25; % CSI-RS占用25个PRB带宽
% 3. 验证配置+获取激活资源
validateCSIRSPorts(csirs); % 校验是否为单端口(RSRP测量硬性要求)
csirsTransmitted = getActiveCSIRSRes(carrier,csirs); % 激活资源二进制向量
powerCSIRS = 0; % CSI-RS功率缩放(0dB表示无额外增益/衰减)
关键讲解:
- 单端口CSI-RS:3GPP TS 38.215明确要求,RSRP测量需使用单端口CSI-RS,否则测量结果无效;
- 12个资源=12个波束:后续每个CSI-RS资源对应一个独立发射波束,实现空间扫描;
- 分布式部署:SymbolLocations配置0~11个符号,适配30kHz子载波间隔下的7个有效符号,避免时域冲突。
模块2:天线阵列与散射体建模------模拟真实通信场景
核心目标:构建基站(发射端)、终端(接收端)和散射体的空间模型,为波束赋形提供物理基础。
% 1. 基础物理参数
fc = 3.5e9; % 载波频率3.5GHz(FR1)
c = physconst('LightSpeed'); % 光速
lambda = c/fc; % 波长(用于计算天线间距)
% 2. 天线阵列配置(基站大规模MIMO vs 终端小规模阵列)
txArySize = [8 8]; % 基站8×8 URA阵列(64根天线,大规模MIMO)
rxArySize = [2 2]; % 终端2×2 URA阵列(4根天线,兼顾性能与成本)
nTx = prod(txArySize); % 发射天线数:64
nRx = prod(rxArySize); % 接收天线数:4
% 3. 空间位置配置(三维笛卡尔坐标)
txArrayPos = [0;0;0]; % 基站位于原点(x=0,y=0,z=0)
rxArrayPos = [100;50;0]; % 终端位于(100,50,0),与基站同一水平面
toRxRange = rangeangle(txArrayPos,rxArrayPos); % 收发直线距离(≈111.8m)
spLoss = fspl(toRxRange,lambda); % 自由空间路径损耗
% 4. 天线阵列对象创建(URA/ULA自动判断)
txAntenna = phased.IsotropicAntennaElement('BackBaffled',true); % 基站天线背腔(避免反向辐射)
rxAntenna = phased.IsotropicAntennaElement('BackBaffled',false); % 终端天线全向接收
txArray = phased.URA('Element',txAntenna,'Size',txArySize,'ElementSpacing',lambda/2); % 基站URA阵列
rxArray = phased.URA('Element',rxAntenna,'Size',rxArySize,'ElementSpacing',lambda/2); % 终端URA阵列
% 5. 散射体配置(单散射体模拟NLOS场景)
fixedScatMode = true;
if fixedScatMode
numScat = 1;
scatPos = [60;10;15]; % 散射体坐标(60,10,15),位于收发之间高空
else
% 随机散射体模式
...
end
关键讲解:
- 天线间距:lambda/2(半波长)是MIMO阵列的标准配置,可最大化空间分集增益;
- 散射体的作用:模拟非视距(NLOS)场景------信号需经散射体反射才能到达终端,因此波束必须对准散射体;
- 背腔配置:基站天线开启背腔(BackBaffled=true),避免能量向反向辐射;终端天线关闭背腔,保证全向捕获信号。
模块3:发射端波束赋形------从宽波束到窄波束
核心目标:生成SSB初始宽波束和CSI-RS精细窄波束,完成"粗对准→精对准"的过渡。这是本节课的核心难点。
% 1. 导向矢量计算器创建(波束赋形的核心工具)
txArrayStv = phased.SteeringVector('SensorArray',txArray,'PropagationSpeed',c);
% 2. P-1阶段:SSB宽波束对准散射体
[~,scatAng] = rangeangle(scatPos(:,1),txArrayPos); % 散射体相对基站的角度(方位角+俯仰角)
azTxBeamWidth = 30; % SSB方位波束宽度30°
elTxBeamWidth = 30; % SSB俯仰波束宽度30°
ssbTxAng = getInitialBeamDir(scatAng,azTxBeamWidth,elTxBeamWidth); % SSB波束指向(对准散射体)
% 3. P-2阶段:CSI-RS窄波束扫描(SSB范围内)
numBeams = sum(csirsTransmitted); % 激活波束数=12
% 扫描范围:以SSB波束为中心,覆盖SSB的30°范围
azSweepRange = [ssbTxAng(1) - azTxBeamWidth/2 ssbTxAng(1) + azTxBeamWidth/2];
elSweepRange = [ssbTxAng(2) - elTxBeamWidth/2 ssbTxAng(2) + elTxBeamWidth/2];
% 计算单波束固有宽度(用于均匀扫描)
azBW = beamwidth(txArray,fc,'Cut','Azimuth'); % 方位角固有波束宽度
elBW = beamwidth(txArray,fc,'Cut','Elevation'); % 俯仰角固有波束宽度
% 生成12个CSI-RS波束的精准指向角度
csirsBeamAng = hGetBeamSweepAngles(numBeams,azSweepRange,elSweepRange,azBW,elBW);
% 4. 计算预编码矩阵wT(64×12,每列对应一个波束的加权系数)
wT = zeros(nTx,numBeams);
for beamIdx = 1:numBeams
tempW = txArrayStv(fc,csirsBeamAng(:,beamIdx)); % 计算导向矢量
wT(:,beamIdx) = tempW;
end
% 5. 应用波束赋形(信号加权)
bfGrid = nrResourceGrid(carrier,nTx); % 初始化发射时频网格
activeRes = find(logical(csirsTransmitted)); % 激活资源索引
for resIdx = 1:numNZPRes
txSlotGrid = nrResourceGrid(carrier,ports); % 单资源空网格
txSlotGrid(csirsInd{resIdx}) = db2mag(powerCSIRS)*csirsSym{resIdx}; % 填充CSI-RS符号
reshapedSymb = reshape(txSlotGrid,[],ports); % 展平信号
beamIdx = find(activeRes == resIdx);
if ~isempty(beamIdx)
bfSymb = reshapedSymb * wT(:,beamIdx)'; % 应用预编码(核心操作)
bfGrid = bfGrid + reshape(bfSymb,size(bfGrid)); % 叠加到总网格
end
end
% 6. OFDM调制(时频域转换)
[tbfWaveform,ofdmInfo] = nrOFDMModulate(carrier,bfGrid);
tbfWaveform = tbfWaveform/sqrt(nTx); % 功率归一化
关键讲解:
- 导向矢量(Steering Vector):
- 作用:将"波束方向"转换为"天线加权系数",让多天线信号在目标方向相位叠加增强;
- 举例:wT的某一列是[0.1+0.2j, 0.3-0.1j, ...](64个复数),每个元素对应一根天线的相位/幅度权重。
- 预编码矩阵wT:
- 维度64×12:64根发射天线,12个波束,每列对应一个波束的加权策略;
- 核心操作
bfSymb = reshapedSymb * wT(:,beamIdx)':将单端口CSI-RS信号(1×N)与加权系数(64×1)相乘,得到64根天线的定向发射信号。
- 宽→窄波束过渡:
- SSB波束30°:覆盖广,用于初始捕获;
- CSI-RS波束≈5°:覆盖窄,增益高,用于精细优化。
模块4:信道传输与时间同步------模拟真实链路+信号对齐
核心目标:模拟信号在真实信道中的传输损耗,完成接收端时间同步(关键预处理步骤)。
% 1. 散射MIMO信道建模
chan = phased.ScatteringMIMOChannel;
chan.PropagationSpeed = c;
chan.CarrierFrequency = fc;
chan.SimulateDirectPath = false; % 关闭视距路径(NLOS场景)
chan.ScattererPosition = scatPos; % 绑定散射体
% 补偿信道时延(添加零后缀)
[~,~,tau] = chan(complex(randn(chan.SampleRate*1e-3,nTx),randn(chan.SampleRate*1e-3,nTx)));
maxChDelay = ceil(max(tau)*chan.SampleRate);
tbfWaveform = [tbfWaveform; zeros(maxChDelay,nTx)];
% 信号过信道
fadWave = chan(tbfWaveform);
% 2. 添加AWGN噪声(模拟真实链路噪声)
rxGain = 10.^((spLoss)/20); % 接收增益(补偿路径损耗)
fadWaveG = fadWave*rxGain;
SNRdB = 20; % 信噪比20dB
SNR = 10^(SNRdB/10);
N0 = 1/sqrt(2.0*nRx*double(ofdmInfo.Nfft)*SNR);
noise = N0*complex(randn(size(fadWaveG)),randn(size(fadWaveG)));
rxWaveform = fadWaveG + noise;
% 3. 时间同步(核心预处理,避免解调失真)
refSym = nrCSIRS(carrier,csirs); % 本地生成CSI-RS参考符号
refInd = nrCSIRSIndices(carrier,csirs); % 参考符号时频索引
offset = nrTimingEstimate(carrier,rxWaveform,refInd,refSym); % 估计时延偏移
syncTdWaveform = rxWaveform(1+offset:end,:); % 补偿时延,得到同步后波形
关键讲解:
- 信道建模:关闭视距路径(SimulateDirectPath=false),严格模拟NLOS场景,信号必须经散射体反射;
- 时间同步的意义:信道时延会导致接收信号与本地参考信号错位,若不同步,后续OFDM解调会出现严重的子载波间干扰(ICI);
- 同步原理:通过本地CSI-RS符号与接收信号的互相关,找到峰值位置,确定时延偏移并补偿。
模块5:接收端处理与波束决策------筛选最优波束
核心目标:完成接收波束赋形,测量各CSI-RS波束的RSRP,筛选最优波束并验证细化效果。
% 1. OFDM解调(时域→时频域)
rxGrid = nrOFDMDemodulate(carrier,syncTdWaveform);
% 2. 接收波束赋形(定向接收散射体方向信号)
rxArrayStv = phased.SteeringVector('SensorArray',rxArray,'PropagationSpeed',c);
[~,scatRxAng] = rangeangle(scatPos(:,1),rxArrayPos); % 散射体相对终端的角度
azRxBeamWidth = 30; elRxBeamWidth = 30; % 初始接收宽波束(与SSB匹配)
rxAng = getInitialBeamDir(scatRxAng,azRxBeamWidth,elRxBeamWidth); % 接收波束指向
wR = rxArrayStv(fc,rxAng); % 接收波束加权系数(4×1)
% 3. FR1/FR2差异化波束赋形
temp = rxGrid;
if strcmpi(freqRange,'FR1')
% FR1:加权不合并(分集接收)
rbfGrid = reshape(reshape(temp,[],nRx).*wR',size(temp,1),size(temp,2),[]);
else
% FR2:加权+合并(提升增益,毫米波场景)
rbfGrid = reshape(reshape(temp,[],nRx)*conj(wR),size(temp,1),size(temp,2),[]);
end
% 4. RSRP测量(评估波束质量)
meas = nrCSIRSMeasurements(carrier,csirs,rbfGrid); % 按协议测量RSRP
RSRPdBm = max(meas.RSRPPerAntenna,[],1); % 提取各波束最优RSRP(dBm)
disp(['RSRP measurements of all CSI-RS resources (in dBm):' 13 num2str(RSRPdBm)]);
% 5. 筛选最优波束
[~,maxRSRPIdx] = max(RSRPdBm(logical(csirsTransmitted))); % 激活资源中最优波束索引
[~,maxRSRPResIdx] = max(RSRPdBm); % 全局最优资源索引
% 6. 计算最优波束宽度(验证细化效果)
if numBeams == 0
disp('无CSI-RS发射,未完成波束细化');
else
refBeamWts = wT(:,maxRSRPIdx); % 最优波束加权系数
% 计算方位/俯仰波束宽度
csirsAzBeamWidth = beamwidth(txArray,fc,'PropagationSpeed',c,'Weights',refBeamWts,'CutAngle',csirsBeamAng(2,maxRSRPIdx));
csirsElBeamWidth = beamwidth(txArray,fc,'PropagationSpeed',c,'Weights',refBeamWts,'Cut','Elevation','CutAngle',csirsBeamAng(1,maxRSRPIdx));
% 输出对比结果
disp(['初始SSB波束宽度(方位/俯仰):' num2str(azTxBeamWidth) '°/' num2str(elTxBeamWidth) '°']);
disp(['细化后波束宽度(方位/俯仰):' num2str(csirsAzBeamWidth) '°/' num2str(csirsElBeamWidth) '°']);
end
关键讲解:
- 接收波束赋形差异(FR1 vs FR2):
- FR1(Sub-6GHz):加权不合并,保留多天线信号维度,后续可做分集均衡;
- FR2(毫米波):加权+合并,通过多天线合并提升信噪比,抵消毫米波大路径损耗。
- RSRP测量:
- 核心指标:RSRP值越大(dBm越接近0),波束质量越好;
- 举例:RSRP=-68dBm优于-82dBm,对应波束对准效果更好。
- 波束细化效果验证:
- 输出结果典型值:初始30°×30°,细化后5°×5°;
- 增益提升:波束宽度缩小,增益提升~10dB,链路质量显著优化。
四、关键知识点总结
前面定义的CSI-RS根据激活的数量来进行波束的发送,实例中是12个CSI-RS,对应发射12个波束,接收端对应接收最好的(RPSP最好的了),下面是运行示例得到的结果图。

关键点1:发射端的波束赋形
这里包括两个对应的p1和p2的操作。
对应的P1是基于SSB的初始化阶段,对应的初始化波束方向是分别30°(可以设定成对应的(方位角-1515),(俯仰角-1515))。值得注意的是,我在学习这个一块的时候,因为第一次接触对应的波束成形,一开始没搞清楚这两个角度分别是什么样子,对应的就是方位角和俯仰角 。后面找的一个图,很形象的说明了这个问题。

对应的在xy轴的这个就是方位角,对应沿着Z轴的这个,其实就算是对应的俯仰角了。这样一看其实还是蛮清晰明了的。
P2是在P1的基础上进行的,对应的精细化测量每一个波束的角度,因为前面的操作试镜时将波束固定在一个大致范围内,后面操作要测量每一个发射波束的精准角度对(方位角 + 俯仰角)。
后面要基于这些角度对,来生成发送端的预编码矩阵WT(可以理解成发送端的预编码,也可以叫对应的波束赋形的矩阵),这个矩阵后续要与信号相乘来指导信号的波束方向。对应的知道波束方向,实际就是对应的方向操控,因为每一个矩阵都是复数,对应的包括幅度和相位,通过相位的叠加增强,给信号加 "方向权重",从而实现:相位叠加增强目标方向、抵消其他方向"------ 典型的数字波束赋形!
按照本实例来说的话:
% 维度变化(以 64 发射天线为例):
% 原始信号:reshapedSymb(11172×1)→ 单端口的 CSI-RS 信号向量;
% 预编码向量:wT(:,beamIdx)'(1×64)→ 该波束的 64 天线加权系数;
% 赋形后信号:bfSymb(11172×64)→ 每个时频点的信号都被分配到 64 个天线,且每个天线的信号都带 "相位 / 幅度权重";
% 物理意义:这一步就是让 64 个天线单元发射的信号 "相位叠加增强目标方向、抵消其他方向"------ 典型的数字波束赋形!
关键点2:信道散射体的定义
这个关键点其实是写给我自己的,哈哈。因为第一次接触这种信道的建模仿真方式,觉得很有意思,他对应的将
发送端BS,
散射体(就比如树林高楼,这种障碍物叫做散射体)
接收端UE
都把它放在对应的三维度坐标系下,给出对应的坐标位置,这个挺有意思的。
还有就是对应信道最大时间延迟的,在波形期间必须找出来,然后进行截断,这个点之前也没太注意,这次仿真学习的时候发现学习了一下,发现对应的% 计算信道最大时延 不同散射体到发射 / 接收端的距离不同 → 信号传播时间不同(时延不同);这些不同时延的信号,会在接收端 "叠加"------ 形成 "时延拖尾"。所以要对应的进行截断。
关键点3:接收波束赋形
因为发送端这么多波束发送过来,接收端一般UE,对应部署的天线数目其实是不多的,所以对应的如何进行接收,选择哪个波束接收也是需要研究的。
因为NR目前规定了高频段和低频段两个频段,分别对应的是FR1和FR2的频段。一般来说,对应的是
% FR1 频段:无合并的接收波束赋形
% FR1 频段波长较长,终端多采用分集接收(不合并天线),
% 保留多天线信号维度,后续可做分集合并 / 均衡,因此用 "逐元素加权" 而非 "矩阵合并"。
% FR2 频段:带合并的接收波束赋形
% FR2 频段路径损耗大,必须通过 "多天线加权合并" 提升信噪比(波束增益),
% 且毫米波终端多为小规模阵列(2/4 天线),合并后单路信号足够满足解调需求。
对应的FR2,需要对应的接受端的矩阵WR。
% wR 的本质:接收端 "空间滤波 / 波束成形"
% 接收端没有 "预编码" 的说法,wR 的核心作用是 "空间滤波"------ 把多根接收天线的信号,按 wR 的共轭转置加权后合并成单路信号,是 "多对一" 的合并(4 路天线信号→1 路有效信号)
% 预编码(wT):发射端 "拆分信号到多天线",目标是 "定向发射";
% 接收波束(wR):接收端 "合并多天线信号到单路",目标是 "定向接收"。
% 发射端的预编码 = 发射波束成形;
% 接收端的空间滤波 = 接收波束成形;
终端通过测量不同 CSI-RS 资源(对应不同发射波束)的 RSRP(参考信号接收功率), 筛选出信号质量最优的发射波束,计算其波束宽度,并对比初始 SSB 宽波束,完成 "初始粗波束→精细窄波束" 的波束细化。