ITPub博客

首页 > 数据库 > Oracle > 【MATLAB源码】OCDM:通感一体化链路级仿真平台

【MATLAB源码】OCDM:通感一体化链路级仿真平台

原创 Oracle 作者:3GPP仿真实验室 时间:2026-03-03 20:48:02 0 删除 编辑

🌊 OCDM 通感一体化链路级仿真平台

从 OCDM 基础链路到多径均衡、CFO、MIMO、PAPR/OOBE、ISAC 的完整闭环实现   扁平工程结构 · 全中文注释 · 固定文件名自动存图 · 结果可复现

MATLAB Waveform Channel Advanced

📌 为什么选择本项目?

做 OCDM 研究/教学时,常见问题是“有算法没工程、能跑通但不可维护、结果图不稳定难复现”。  本项目的目标是:在一个统一代码框架里,把 基础通信链路 + 关键增强模块 全部打通。

常见痛点(零散代码) 本项目解决方案
🔴 只有单一 AWGN 示例,缺少工程扩展链路 ✅ 一套代码覆盖 AWGN、多径均衡、CFO、2x2 MIMO、PAPR/OOBE、ISAC
🔴 输入输出维度混乱,函数耦合严重 ✅ 统一参数协议 ocdm_param+ 明确的列向量/块矩阵约定
🔴 随机性强、图像文件名漂移,难以复现实验 ✅ rng_seed+ 固定文件名 + 自动覆盖落盘
🔴 多径与均衡实现不稳,低 SNR 容易数值炸裂 ✅ ZF 近零频点保护 + MMSE 正则项 + 参数合法性校验
🔴 论文图能画但工程文档缺失 ✅ 提供算法文档 + 代码文档 + 项目文档三层文档体系

🎯 核心价值

🔬 研究与教学价值

  • 从 DFnT/IDFnT 到完整收发、再到多场景扩展,链路完整可讲解
  • 关键模块均可独立复用,便于做算法对比实验
  • 支持 “通信 + 感知” 一体化展示,适合 ISAC 入门与课程演示
  • 指标体系齐全:BER、EVM、PAPR、OOBE、Range-Doppler

💼 工程与复现价值

  • 扁平目录结构,部署简单,迁移成本低
  • 所有示例统一初始化,避免路径/环境差异问题
  • 输出图片路径稳定,便于自动化报告与版本对比
  • 模块化边界清晰,新增算法时可低风险接入

⚡ 技术亮点

🏗️ 模块化架构(扁平结构,逻辑分层)

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_Block
  • 防御式编程: validateattributes + 维度检查 + 明确中文报错
  • 数值稳定:ZF 近零频点保护、MMSE 正则、谱估计防 log(0) 处理
  • 统计稳定:固定随机种子 + 自适应停机 + 零误码下限修正

📊 快速模式实测结果(本机回归)

1) 基础链路( example_ocdm_modem.m)

指标 数值
Eb/N0 10 dB
EVM 14.06%
BER 1.808e-03 (237/131072)

2) CFO 补偿( 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           |

3) 2x2 MIMO( 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   |

4) PAPR/OOBE( 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        |

5) ISAC( example_ocdm_isac_comm_sensing.m)

指标 数值
感知侧 SNR 20 dB
距离分辨率 7.49 m
速度分辨率 0.45 m/s
最大无模糊速度 ±57.41 m/s

峰值检测结果(示例):

  • 峰值 1:Range=82.44 m,Velocity=17.94 m/s,Value=0.00 dB
  • 峰值 2:Range=149.90 m,Velocity=-12.11 m/s,Value=-3.07 dB
  • 峰值 3:Range=232.34 m,Velocity=4.93 m/s,Value=-4.45 dB

💻 核心代码片段

🔥 接收端频域均衡( 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

🚀 CFO 估计( 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

📉 OOBE 统计( 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')

🧾 输出文件清单(固定命名)

example<em>ocdm</em>awgn<em>ber.png example</em>ocdm<em>awgn</em>evm.png example<em>ocdm</em>cfo<em>ber.png example</em>ocdm<em>cfo</em>estimation<em>error.png example</em>ocdm<em>isac</em>comm<em>ber.png example</em>ocdm<em>isac</em>comm<em>evm.png example</em>ocdm<em>isac</em>range<em>doppler.png example</em>ocdm<em>mimo</em>ber.png example<em>ocdm</em>modem<em>constellation.png example</em>ocdm<em>multipath</em>ber.png example<em>ocdm</em>multipath<em>channel.png example</em>ocdm<em>oobe</em>psd.png example<em>ocdm</em>papr_ccdf.png

🖥️ 运行环境

  • MATLAB:R2020a 或更高版本(建议 R2023a+)
  • 必需工具箱:Communications Toolbox
  • 可选工具箱:5G Toolbox(用于 nrTDLChannel)

🛒 获取方式

本文代码仅为核心片段,完整版工程已整理好。 关注公众号 【 3GPP仿真实验室】进行获取。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049237/viewspace-3111500/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-01-08

  • 博文量
    55
  • 访问量
    48642