FEATURED · 精选文章

5G仿真中的MPF-BCQI:基于多径先验的信道估计与CQI映射实现

发布时间 / 2026/9/14 2:09:38
来源 / 创域科博编辑部
栏目 / 资讯中心
5G仿真中的MPF-BCQI:基于多径先验的信道估计与CQI映射实现 简介面向5G通信系统仿真与算法验证的MATLAB项目围绕多点前传/回传协调MPF-BCQI与信道质量指示CQI反馈展开完整实现NR FDD下行与上行调度、HARQ进程管理、MAC层组包与解析等功能模块既可用于理解5G物理层与MAC层协同工作流程也适合通信工程专业学生、5G算法研究人员及网络优化工程师用于系统学习、算法复现和二次开发。压缩包共61个文件其中46个m源码脚本构成项目主干辅以9张仿真结果示意图、2个mat数据文件、2份PDF说明文档、1个mlx实时脚本和1个md说明文件整体大小约3.94MB目录结构层次分明既有可直接运行的示例入口也有按功能拆分的调度器、物理层与MAC处理模块便于快速定位关键算法与对应输出。目前已有427人学习下载。借助该工程能够直观理解多用户调度、CQI上报以及前传/回传协调在MATLAB中的实现路径还能基于现有代码调整调度权重、反馈周期、调制编码方式等参数对比不同策略对系统吞吐量、时延和误码率的影响显著降低从零搭建5G仿真环境的门槛是一份适合课程设计、毕业设计乃至科研预研的实用仿真资料。1. 5G 仿真为什么要单独做一套 MPF-BCQI拿到5g_Simulation_MATLAB_MPF-BCQI-main这个目录名时我第一反应是这又是一个链路级仿真工程核心不在 5G 波形本身而在 CQI 估计那一段。MATLAB 的 5G Toolbox 里nrChannelEstimate和nrCQISelect能用但到了多径衰落明显、用户移动的场景默认 LS 估计出来的 CQI 经常偏乐观。MPF-BCQI 这种命名把两个关键动作拆开了MPF 负责把导频位置的 LS 信道估计先做一次带多径先验的滤波BCQI 负责把滤波后每个 RE 的 SINR 折算成分块上报的 CQI。它解决的问题很具体频率选择性信道下宽带 CQI 会把深衰落的 RB 平均掉子带 CQI 又被估计噪声污染。这套流程做出来的结果可以直接喂给链路自适应和调度器。适合自己搭 PDSCH 链路、要复现论文曲线或者做系统级接口仿真的工程师往下读。2. MPF-BCQI 的算法拆解从信道估计到块级 CQI 映射2.1 MPF 滤波器的定位滤除多径带来的频域选择性在 OFDM 系统里导频位置做 LS 估计是最简单的一步把接收信号除以本地参考信号得到[ \hat H_{LS}(k) H(k) \frac{n(k)}{x(k)} ]这里的噪声被导频符号功率放大而且每个子载波独立受扰。直接拿这个结果算 SINR高频起伏会被当成真实信道导致小尺度 CQI 抖动。MPF 的思路不是对每个子载波独立处理而是利用 5G 信道的多径结构做联合滤波。时域上信道冲激响应只有少数抽头是非零的对应不同延迟频域上这些抽头表现为按指数规律相关的复正弦叠加。所以 MPF 滤波器先在导频子载波上做一次频域 LS 估计然后变换到时域按多径延迟窗口把噪声抽头置零再变换回来。这个滤波器的核心不是简单截断而是“带先验的加权”。工程实现里常见的是 MMSE 形式[ W R_{HH}(R_{HH} \sigma_n^2 I)^{-1} ]其中 (R_{HH}) 是频域信道自相关矩阵由多径延迟和平均功率决定。MATLAB 里可以先从 TDL 信道的路径参数构造这个矩阵也可以把 LS 估计变换到时域后只保留能量集中的前 (L) 个抽头。第二种做法更接近MPF这个单词里“多径先验”的含义你知道这个信道模型里有几径、大概延迟多少就知道时域窗该开多宽。我一般建议先用channel.getPathFilters()拿到路径时延取最大时延对应的采样点数量作为窗口长度再留 1~2 个保护采样。2.2 BCQI 的含义不是单个 RB而是一块 RB 上的等效 CQICQI 在 5G 里不是逐 RE 上报的UE 只能上报宽带 CQI 或者子带 CQI。子带大小在 TS 38.214 里按带宽部分配置常见的有 4 个 RB、8 个 RB、16 个 RB 三种。BCQI 要做的事就是把这些子带内的所有 RE 的 SINR 折算成一个等效 SINR再映射到 0~15 的 CQI 索引。折算方法不能简单取算术平均。频率选择性信道里一个子带内可能有几个 RE 的 SINR 特别低误块率主要由这些深衰落点决定。常用的是 EESM指数有效 SINR 映射或互信息映射。EESM 公式如下[ \text{SINR}\text{eff} -\beta \log\left(\frac{1}{N}\sum{i1}^{N} e^{-\text{SINR}_i/\beta}\right) ](\beta) 是调制编码方式相关的修正因子需要按 QPSK、16QAM、64QAM 分别标定。这个等效 SINR 再和 CQI 表的门限比较落在哪个区间就上报哪个 CQI。BCQI 和官方nrCQISelect的差别在于它把 MPF 滤波后的信道响应作为输入而不是用理想的或者未滤波的信道。对于仿真者来说这是决定链路自适应准不准的分水岭。2.3 MPF-BCQI 的输入输出与关键参数整个算法链路的输入输出很明确输入接收时域波形、解调后的资源网格、DM-RS 端口位置、发送端 PDSCH 配置、TDL 信道的多径参数、估计的噪声功率。中间量滤波后的频域信道估计 (\hat H_\text{MPF})、每个 RE 的噪声方差、每个子带内的有效 SINR。输出子带 CQI 索引、对应的 MCS 等级、误块率预测值。在写 MATLAB 代码之前先把参数表列出来作为设计基线。下面是一组我在 10 MHz、15 kHz 子载波间隔下常用的初始值参数推荐初始值作用与影响子带大小8 RB越小频率选择性还原越好但反馈开销变大时域窗长度32 个采样点对应约 2.13 μs 延迟扩展覆盖大多数 TDL 场景噪声方差估计基于 DM-RS 残差过大会把真实信道滤掉过小会残留噪声EESM βQPSK: 1.516QAM: 3.5调制阶数越高β 越大CQI 映射目标 BLER0.1对应 3GPP 规定的 CQI 上报标准MPF 滤波器和 BCQI 映射是两段相对独立又强耦合的逻辑。滤波器决定输入 SINR 的可靠程度BCQI 决定传递函数是否足够平滑。后面章节的 MATLAB 实现就按这个接口拆开写避免把滤波和 CQI 计算搅在一起。3. MATLAB 实现 MPF-BCQI 的链路级仿真主流程3.1 初始化 5G 参数与 PDSCH 资源格用 MATLAB 5G Toolbox 搭链路的第一步是配置nrCarrierConfig和nrPDSCHConfig。这里不占用整个带宽先按照 5 MHz 带宽来跑子载波间隔 15 kHz对应的资源块数量是 25。PDSCH 使用 QPSK层数设为 1DM-RS 类型选 1映射类型 A。%% 载波配置 carrier nrCarrierConfig; carrier.NSizeGrid 25; % 5 MHz 15kHz SCS carrier.SubcarrierSpacing 15; carrier.CyclicPrefix normal; carrier.NCellID 1; carrier.NSlot 0; carrier.NFrame 0; %% PDSCH 配置 pdsch nrPDSCHConfig; pdsch.Modulation QPSK; pdsch.NumLayers 1; pdsch.DMRS.DMRSConfigurationType 1; pdsch.DMRS.DMRSLength 1; pdsch.DMRS.DMRSAdditionalPosition 1; pdsch.DMRS.DMRSTypeAPosition 2; pdsch.PRBSet (0:carrier.NSizeGrid-1).;重要参数是PRBSet它决定 PDSCH 占用的 RB 集合。后续 BCQI 计算子带时也要对齐到这个集合避免把空 RB 算进去。DMRSAdditionalPosition设置得越高时域跟踪能力越强但导频开销也变大。链路仿真初期建议用AdditionalPosition 1否则 MPF 滤波器的时域窗口收到多个 DM-RS 符号复杂度上去了性能提升不明显。3.2 构造 TDL 多径信道并过数据5G Toolbox 的标准做法是用nrTDLChannel构造多径信道。这里选 TDL-E 模型它带有较明显的延迟扩展比较能暴露 CQI 高估问题。Doppler 先设成 5 Hz模拟慢速移动。channel nrTDLChannel; channel.DelayProfile TDL-E; channel.DelaySpread 300e-9; channel.MaximumDopplerShift 5; channel.NumTransmitAntennas 1; channel.NumReceiveAntennas 1; channel.MIMOCorrelation low; channel.SampleRate 7.68e6; % 5 MHz 带宽典型采样率 % 生成一个 OFDM 符号块 [txWaveform, txInfo] nrOFDMModulate(carrier, zeros([carrier.NSizeGrid*12, 14, pdsch.NumLayers])); channelInfo channel.info(); fprintf(采样率: %g Hz\n, channel.SampleRate);channel.info()在多个 MATLAB 版本里返回包含SamplesPerSymbol、PathDelays、ChannelFilterDelay等信息的结构体可用于后续 MPF 窗口计算。真正传数据时把编码调制后的 PDSCH 符号填入资源网格再整体过信道% 生成传输块并编码 trBlk randi([0 1], 1000, 1); [dlsch, pdschExt] hDLSCH(trBlk, pdsch, carrier); % 简写实际是 nrDLSCH 编码流程 [dataSymbols, pdschInfo] nrPDSCH(carrier, pdsch, dlsch); % 填入资源网格并 OFDM 调制 txGrid nrResourceGrid(carrier); [~, pdschIndices] nrPDSCHIndices(carrier, pdsch); txGrid(pdschIndices) dataSymbols; txWaveform nrOFDMModulate(carrier, txGrid); % 过信道并加噪声 snr 20; % dB rxWaveform channel(txWaveform); rxWaveform rxWaveform(1:length(txWaveform), :); % 去掉滤波延迟 noise sqrt(10^(-snr/10)) * complex(randn(size(rxWaveform)), randn(size(rxWaveform))); rxWaveform rxWaveform noise;这里需要注意nrTDLChannel会引入信道滤波器延迟通常输出比输入长。接收端要先裁剪对齐否则后续nrOFDMDemodulate会报错或者引入符号定时偏差。用channelInfo.ChannelFilterDelay可以精确对齐没把握时直接截到和发送波形等长再配合循环前缀冗余影响可控。3.3 接收端 MPF 滤波与 BCQI 计算函数解调后先用nrChannelEstimate得到 LS 信道估计然后把它传入自己实现的 MPF 滤波器。下面是一个基于时域窗口截断的 MATLAB 函数适合快速验证function hMPF mpfFilter(hLS, winLen) % hLS 维度: 子载波数 x 符号数 x 接收天线 x 发送层 % winLen: 时域抽头保留长度单位是采样点 [Nsc, Nsym, Nr, Nl] size(hLS); hMPF zeros(size(hLS)); for r 1:Nr for l 1:Nl H ifft(hLS(:, :, r, l), Nsc * 2, 1); % 2x 过采样避免频域混叠 H(winLen1:end-winLen, :) 0; hMPF(:, :, r, l) fft(H, Nsc * 2, 1); hMPF(:, :, r, l) hMPF(1:Nsc, :, r, l); end end end这段滤波器的逻辑是把频域 LS 估计反变换到时域只保留中间连续的winLen个抽头。多径信道的能量都集中在这一小段而噪声均匀散布在全部抽头上所以置零其余抽头能显著提高估计信噪比。做两次 FFT 的原因是为了让时域分辨率提高一倍窗口位置更好控制。这个函数的缺点也很明显遇到大时延扩展且 DM-RS 符号较少时窗内会混入噪声窗外又会丢掉真实路径。建议先跑理想信道估计对比确认滤波造成的 MSE 变化趋势。BCQI 计算部分按 RB 分块每块用 EESM 折算有效 SINR再查 CQI 表rbSize 8; % 每个子带包含的 RB 数 numRB carrier.NSizeGrid; subbandCQI zeros(ceil(numRB/rbSize), 1); sinrSubband zeros(size(subbandCQI)); for sb 1:length(subbandCQI) rbIndices ((sb-1)*rbSize1 : min(sb*rbSize, numRB)).; reStart (rbIndices(1)-1)*12 1; reEnd rbIndices(end)*12; hSelect hMPF(reStart:reEnd, :, :, :); signalPower mean(abs(hSelect).^2, [2 3 4]); sinrPerRE signalPower / noisePower; % EESM beta 1.5; sinrSubband(sb) -beta * log(mean(exp(-sinrPerRE ./ beta))); end % 根据 BLER0.1 的门限选择 CQI cqiThreshold [0, 2.5, 4.5, 6.0, 8.0, 9.5, 11.0, 12.5, 14.0, 15.5, 17.0, 18.5, 20.0, 21.5, 23.0, 24.5]; % dB cqi find(sinrSubband(sb) cqiThreshold, 1, last);噪声功率估计不能直接用发送前的 SNR 反推因为接收端不知道实际 SNR。常见做法是从 DM-RS 位置的估计残差里计算。把 LS 估计值与 MPF 滤波结果相减统计方差再除以导频符号能量。这样得到的噪声功率包含了信道估计误差和实际 AWGNBCQI 映射更保守也更容易对齐误块率目标。4. 参数调优子带大小、滤波器阶数和 DMRS 密度怎么配合4.1 子带划分决定 CQI 上报粒度和反馈开销BCQI 的“块”大小直接决定频率选择性信道的还原能力。子带设成 4 个 RB 时每个子带只有 48 个 RE在低 SNR 下统计波动很大设成 16 个 RB 时深衰落点会被平均掉CQI 偏乐观。实际做链路仿真时我一般先跑一遍理想信道估计下的宽带 CQI 作为基线再对比不同子带大小的预测误差。一个比较稳妥的做法是让子带大小和反馈上报周期匹配调度周期短时用 8 RB周期长时用 16 RB。从实现角度还需要保证子带边界与PDSCH.PRBSet对齐。如果 PDSCH 从中间某个 RB 开始按整个带宽均匀分割子带会计算到不包含 PDSCH 的 RB导致 CQI 被拉低。一个修正方法就是像前面代码那样先取PRBSet的实际范围再在这个范围内划分连续子带。注意 5G 标准里子带大小是 UE 上报配置里的参数超过带宽部分范围时要截断。4.2 滤波器阶数、多径先验与噪声方差设置MPF 的时域窗口长度是直接影响 CQI 精度的参数。窗口开太长噪声滤不干净窗口开太短真实多径被截断频域上会产生“拖尾”失真。一个简单公式是[ L \frac{\text{DelaySpread} \times \text{NumSubcarriers}}{T_s} ]其中 (T_s) 是 OFDM 符号有效时长。以 15 kHz 子载波间隔为例符号有效时间为 66.7 μs如果延迟扩展为 300 ns理论抽头数量只有 5 不到。但由于采样率和 FFT 过采样实际保留 16~32 个点足够。我在 TDL-E 信道下测试过窗口从 16 加到 64MSE 变化不大但 CQI 在高阶调制下的误判明显增多。噪声方差估计是最容易被忽略的环节。nrChannelEstimate返回的 LS 估计本身带有噪声如果直接用这个噪声功率算 SINR得到的 CQI 会比实际低。反过来如果用发送端已知的理论噪声功率又会高估。推荐用两层估计先对 DM-RS 所在 OFDM 符号做 LS 残差统计再用 MPF 输出的残留更新一次噪声估计。这样能把信道估计误差也归入 CQI 映射链路自适应会更稳。4.3 DMRS 密度和天线端口配置对 BCQI 的影响DM-RS 密度决定了 MPF 滤波器能获取多少原始观测。配置类型 1 在频域上是每隔一个子载波放置一个 DM-RS类型 2 是每隔两个子载波。类型 1 的频域采样更密对短时延扩展的分辨率更好但支持的天线端口数少类型 2 更适合天线端口多的高阶 MIMO。做 MPF-BCQI 这类研究时端口数一旦超过 4建议直接上类型 2否则单个端口上的导频 RE 太少时域窗内可用的频率样本不足滤波增益会下降。下面的表给出一组参考配置可以按信道模型组合场景DM-RS 配置子带大小MPF 窗口备注慢速、小延迟扩展Type 1AdditionalPos18 RB16低复杂度中速、TDL-CType 1AdditionalPos28 RB24兼顾时变高速、TDL-EType 2AdditionalPos34 RB32需跟踪快变DM-RS 其他配置不变时提高AdditionalPosition会增加每个时隙里 DM-RS 符号数量MPF 滤波可以从时域上做插值能更精确跟踪 Doppler 变化。但代价是 PDSCH 可用 RE 减少吞吐量在低 MCS 时反而下降。实际链路仿真时要固定目标 BLER比较的是传输的有效吞吐量而不是单纯比较 CQI 命中率。5. 验证 CQI 输出与排查滤波失效的几个技巧5.1 用 BLER 曲线验证 CQI 映射是否正确CQI 是否准确最终要看误块率而不是看 SINR 估计误差。在仿真里固定一个 CQI 索引遍历 SNR画 BLER 曲线。CQI 表映射正确时每个 CQI 对应的 BLER 曲线应该在目标值 0.1 附近交叉且各曲线间距保持稳定。如果 BCQI 计算结果和实际 BLER 偏差超过一个 CQI 级别优先查 CQI 表是 1 索引还是 0 索引开头。很多自带 CQI 表是从 0 开始索引的而 MATLABnrCQISelect返回的是 1~15混用时会导致 CQI 偏移一档这个偏移在 BLER 曲线上表现为整体左移或右移。5.2 检查滤波器是否把时变信道抹平MPF 滤波容易犯的错是把频率选择性滤掉了但把时间选择性也一起抹掉。验证方式是打印某个 RB 子载波上的信道幅度随时间的变化曲线。如果滤波后曲线比原始 DM-RS 估计平缓很多说明时域截断窗口没有保留足够多的 OFDM 符号间变化。更直接的指标是比较滤波前后的信道估计 MSE。用理想信道作为参考MSE 下降且 BLER 下降说明滤波有效MSE 下降但 BLER 上升基本可以断定滤波把真实路径截掉了。5.3 常见错误SINR 归一化、CQI 表偏移、时延抽头截断最后集中说三个我实际排查过的坑。第一个是 SINR 归一化错误MATLAB 里nrPDSCH输出的符号能量不为 1通常是按调制阶数归一化到 QPSK 平均能量。接收端算 SINR 时如果不先把信号功率归一化BCQI 的有效 SINR 会整体抬高几个 dB。第二个是时延抽头截断TDL 模型的抽头位置有随机抖动getPathFilters给出的滤波器延迟可能超过设定的窗口长度导致首个路径被截掉。解决办法是在 MPF 窗口前额外多留ceil(maxPathDelay * sampleRate)个采样点。第三个是子带边界和 DM-RS 符号重叠某些 RB 内没有 DM-RSMPF 滤波器需要靠相邻 RB 插值补全如果子带太小滤波结果可能全是插值出来的此时要退回到粗粒度子带。最后的验证技巧是把 MPF-BCQI 换回nrChannelEstimate加nrCQISelect的标准链路对比同一 SNR 下的 CQI 分布直方图。两个结果的均值差在 1 个 CQI 以内属于正常超过 2 个 CQI 就说明 MPF 的某个参数设置走到了错误的角落不要继续调 CQI 表回头从时域窗和噪声方差两个入口检查。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻