📁 项目结构
csirs_ce/
├── src/ # 核心算法源码
│ ├── core/ # 配置、栅格与通用工具
│ ├── csirs/ # CSI-RS 符号与索引
│ └── channel/ # 信道、同步与估计
├── examples/ # 示例与报告脚本
│ ├── run_nr_channel_estimation_using_csirs.m # 端到端示例入口
│ └── run_nr_channel_estimation_advanced_report.m # 高级图与报告入口
📄 文档体系
文档体系由算法与代码两条主线构成。两类文档共同支撑复现与二次分析。
📘 算法文档
docs/算法文档.md:覆盖 CSI-RS 标准语义、估计原理与公式推导。
📒 代码文档
docs/代码文档.md:覆盖模块职责、接口定义、主流程与数据结构。
💻 核心代码展示
🔥 CSI-RS 参考信号生成模块
该模块负责导频符号生成与资源配置解析。实现覆盖多行配置、密度模式与周期调度。
function [sym, info] = nr_csi_rs(carrier, csirs_cfg)
% NR_CSI_RS 5G NR 信道状态信息参考信号生成
carrier = nr_utils_to_carrier_struct(carrier);
nslot = carrier.NSlot;
nframe = nr_utils_get_field(carrier, 'NFrame', 0);
scs = nr_utils_get_field(carrier, 'SubcarrierSpacing', 15);
if strcmpi(carrier.CyclicPrefix, 'extended')
symPerSlot = 12;
else
symPerSlot = 14;
end
rowNumber = nr_utils_get_field(csirs_cfg, 'RowNumber', 3);
if numel(rowNumber) > 1
[sym, info] = generate_multi_resource(carrier, csirs_cfg, symPerSlot, 10 * scs / 15);
return;
end
🌟 OFDM 调制主链模块
该模块负责栅格维度校验、相位预补偿与调制主过程。其输出直接进入信道建模链路。
% 获取 OFDM 参数
info = nr_ofdm_info(carrier, varargin{:});
% 验证栅格维度
K = carrier.NSizeGrid * 12;
assert(size(grid, 1) == K, ...
'nr_ofdm_modulate:invalidGrid', ...
'栅格行数 (%d) 必须等于 NSizeGrid*12 (%d)', size(grid, 1), K);
N = size(grid, 2);
P = size(grid, 3);
nfft = info.Nfft;
% 获取当前时隙的 CP 长度和符号相位
nSlot = carrier.NSlot;
[cp_lengths, sym_phases] = get_slot_params(info, nSlot, N);
% 相位预补偿
if any(sym_phases ~= 0)
phase_matrix = reshape(exp(1j * sym_phases(1:N)), 1, N);
grid = grid .* phase_matrix;
end
🚀 实用信道估计核心模块
该模块执行 LS 估计、CDM 去扩和扩展网格写回。后续再衔接插值、去噪与噪声方差估计。
% LS 估计与 CDM 解扩(扩展子载波网格)
eRB = 4;
eK = eRB * 12;
Kext = K + eK;
Hext = complex(zeros(Kext, N, R, P, 'like', rxGrid));
Hn = complex(nan(Kext, N, R, P, 'like', rxGrid));
for p = 1:P
[ksubs, nsubs, thisPort] = get_port_subscripts(K, N, P, refInd, p);
refSymThisPort = refSym(thisPort);
un = unique(nsubs).';
for uni = 1:numel(un)
n = un(uni);
mask = (nsubs == n);
k = ksubs(mask);
if isempty(k)
continue;
end
refS = refSymThisPort(mask);
for r = 1:R
hLS = rxGrid(k, n, r) ./ refS;
if fdCDM > 1
hLS = despread_fd_cdm(hLS, fdCDM);
end
Hext(k + eK/2, n, r, p) = hLS;
end
end
end
🎬 一键运行
run('startup_csirs_ce.m');
run('examples/run_nr_channel_estimation_using_csirs.m');
run('examples/run_nr_channel_estimation_advanced_report.m');
结果预览
在 SNR=50 dB、Seed=2026、2Tx/2Rx 配置下,最新报告给出全局 NMSE 为 -35.09 dB。 图示说明:单次运行会输出资源映射、信道图谱、误差统计、时频趋势与 MIMO 指标图。
📸 演示图片预览









🛒 获取方式
📚 参考文献
- 3GPP TS 38.211, NR; Physical channels and modulation.
- 3GPP TR 38.901, Study on channel model for frequencies from 0.5 to 100 GHz.
- 3GPP TS 38.214, NR; Physical layer procedures for data.