从 OCDM 基础链路到多径均衡、CFO、MIMO、PAPR/OOBE、ISAC 的完整闭环实现 扁平工程结构 · 全中文注释 · 固定文件名自动存图 · 结果可复现
做 OCDM 研究/教学时,常见问题是“有算法没工程、能跑通但不可维护、结果图不稳定难复现”。 本项目的目标是:在一个统一代码框架里,把 基础通信链路 + 关键增强模块 全部打通。
| 常见痛点(零散代码) | 本项目解决方案 |
|---|---|
| 🔴 只有单一 AWGN 示例,缺少工程扩展链路 | ✅ 一套代码覆盖 AWGN、多径均衡、CFO、2x2 MIMO、PAPR/OOBE、ISAC |
| 🔴 输入输出维度混乱,函数耦合严重 | ✅ 统一参数协议
ocdm_param+ 明确的列向量/块矩阵约定 |
| 🔴 随机性强、图像文件名漂移,难以复现实验 | ✅
rng_seed+ 固定文件名 + 自动覆盖落盘 |
| 🔴 多径与均衡实现不稳,低 SNR 容易数值炸裂 | ✅ ZF 近零频点保护 + MMSE 正则项 + 参数合法性校验 |
| 🔴 论文图能画但工程文档缺失 | ✅ 提供算法文档 + 代码文档 + 项目文档三层文档体系 |
OCDM/ ├── 【环境与工具】 │ ├── chirpcomm_startup.m # 工程路径初始化 + docs/figures 自动创建 │ ├── setup_example_env.m # 示例统一入口 │ └── save_figure_stable.m # 固定文件名存图(无时间戳) │ ├── 【核心变换与收发】 │ ├── parse_modem_param.m # 参数协议校验 │ ├── fast_dfnt.m # DFnT(chirp-FFT-chirp) │ ├── fast_inv_dfnt.m # IDFnT(chirp-IFFT-chirp) │ ├── ocdm_modem_tx.m # OCDM 发射机(加 CP 串行) │ └── ocdm_modem_rx.m # OCDM 接收机(去 CP + 均衡) │ ├── 【信道与均衡支撑】 │ ├── extract_nr_tdl_profile.m # NR-TDL 连续模型离散化 │ ├── sanitize_discrete_profile.m # 离散 PDP 清洗 │ ├── build_channel_tap_set.m # 固定信道样本集 │ └── apply_multipath_and_noise.m # 多径传播 + AWGN │ ├── 【CFO 模块】 │ ├── apply_cfo_to_signal.m # 频偏注入 │ ├── estimate_cfo_cp_correlation.m # CP 相关 CFO 估计 │ └── compensate_cfo_signal.m # 频偏补偿 │ ├── 【MIMO 模块】 │ └── simulate_mimo_ocdm_frame.m # 2x2 MIMO 频域 ZF/MMSE 单帧内核 │ ├── 【指标模块】 │ ├── compute_papr_ccdf.m # PAPR/CCDF │ └── compute_oobe_psd.m # OOBE/PSD(支持显式主带口径+去CP) │ ├── 【ISAC 模块】 │ ├── simulate_ocdm_isac_echo.m # 多目标回波生成 │ └── estimate_range_doppler_map.m # 距离-速度图估计 + 峰值提取 │ └── 【示例脚本】 ├── example_ocdm_modem.m ├── example_ocdm_awgn_performance.m ├── example_ocdm_multipath_transmission.m ├── example_ocdm_cfo_estimation.m ├── example_ocdm_mimo_2x2.m ├── example_ocdm_papr_oobe.m └── example_ocdm_isac_comm_sensing.m
Num_GrdIntv/Num_Symbol/Num_Chirp/Num_Blockvalidateattributes + 维度检查 + 明确中文报错log(0) 处理example_ocdm_modem.m)| 指标 | 数值 |
|---|---|
| Eb/N0 | 10 dB |
| EVM | 14.06% |
| BER | 1.808e-03 (237/131072) |
example_ocdm_cfo_estimation.m)| Eb/N0 | BER(无补偿) | BER(补偿后) | 平均\|频偏误差\| |
| ------- | --------------- | --------------- | ------------------ |
| 0 dB | 4.515e-01 | 1.552e-01 | 0.0016 |
| 10 dB | 4.334e-01 | 4.252e-03 | 0.0006 |
| 15 dB | 4.319e-01 | 1.695e-06 | 0.0003 |
example_ocdm_mimo_2x2.m)| Eb/N0 | BER(ZF) | BER(MMSE) |
| ------- | ----------- | ------------- |
| 0 dB | 3.061e-01 | 1.488e-01 |
| 10 dB | 7.553e-02 | 1.218e-02 |
| 15 dB | 1.907e-02 | 8.861e-04 |
example_ocdm_papr_oobe.m)| 指标 | 原始 OCDM | 成形 + 加窗 OCDM |
| --------------------------------- | ----------- | ------------------ |
| PAPR 峰值 | 11.62 dB | 12.08 dB |
| CCDF=1e-3 时 PAPR | 8.50 dB | 8.75 dB |
| OOBE/Main(去 CP,\|f\|<=0.22) | 1.04 dB | -22.46 dB |
example_ocdm_isac_comm_sensing.m)| 指标 | 数值 |
|---|---|
| 感知侧 SNR | 20 dB |
| 距离分辨率 | 7.49 m |
| 速度分辨率 | 0.45 m/s |
| 最大无模糊速度 | ±57.41 m/s |
峰值检测结果(示例):
ocdm_modem_rx.m)% 去 CP r_ocdm_signal_gi = reshape(r_modem_signal, num_chirp + num_grd_intv, num_block); r_ocdm_signal = r_ocdm_signal_gi(num_grd_intv + 1:num_grd_intv + num_chirp, :); % FFT + chirp 相位补偿 phase_seq_gamma = exp(-1i * pi * (0:num_chirp - 1) .^ 2 ./ num_chirp).'; r_ocdm_symbol = sqrt(1 / num_chirp) .* fft(r_ocdm_signal, num_chirp, 1); r_ocdm_symbol = phase_seq_gamma .* r_ocdm_symbol; % 一拍均衡 if mode_ch_equ ~= 0 r_ocdm_symbol = ch_equ_tap .* r_ocdm_symbol; end
estimate_cfo_cp_correlation.m)cp_part = rx_frame(1:cp_len, :); tail_part = rx_frame(fft_len + 1:fft_len + cp_len, :); corr_value = sum(conj(cp_part(:)) .* tail_part(:)); cfo_hat = angle(corr_value) / (2 * pi); % 折叠到 [-0.5, 0.5) cfo_hat = cfo_hat - round(cfo_hat); if cfo_hat >= 0.5 cfo_hat = cfo_hat - 1; end
compute_oobe_psd.m)% 支持显式主带边界、去 CP 和分段长度配置 cfg = parse_oobe_config(mainband_cfg); signal = preprocess_signal_for_psd(tx_signal(:), cfg); mainband_edge = cfg.MainbandEdge; mainband_mask = abs(freq_axis_norm) <= mainband_edge; oobe_mask = ~mainband_mask; stat.OOBEToMain_dB = 10 * log10((oobe_power + eps) / (mainband_power + eps));
cd D:/03_代码库/04.code4sale/OCDM/OCDM-Refactored
% 基础链路
run('example_ocdm_modem.m')
% AWGN 扫频
use_fast_demo = true; run('example_ocdm_awgn_performance.m')
% NR-TDL 多径
use_fast_demo = true; run('example_ocdm_multipath_transmission.m')
% CFO
use_fast_demo = true; run('example_ocdm_cfo_estimation.m')
% 2x2 MIMO
use_fast_demo = true; run('example_ocdm_mimo_2x2.m')
% PAPR/OOBE
use_fast_demo = true; run('example_ocdm_papr_oobe.m')
% ISAC
use_fast_demo = true; run('example_ocdm_isac_comm_sensing.m')

nrTDLChannel)本文代码仅为核心片段,完整版工程已整理好。 关注公众号 【 3GPP仿真实验室】进行获取。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049237/viewspace-3111500/ ,如需转载,请注明出处,否则将追究法律责任。