【MATLAB源码】OSDM:教科书级链路仿真平台

5 阅读5分钟

📡 OSDM 教科书级链路仿真平台

Walsh 序域调制全流程复现 · QPSK/64QAM 双链路 · 频谱合规 + BER 闭环验证 支持系数聚类与低相关贪心选取 · Walsh 域 Hilbert 正交恢复 · 完整可视化结果导出

📌 为什么选择本仿真平台?

做 Walsh/OSDM 类系统时,常见问题是“理论看懂了,但代码链路不闭环”: 调制、载波、合规掩模、接收判决、BER 统计通常散落在不同脚本中,难以形成可复现工程。

本平台提供一套 可直接运行、结构清晰、便于扩展 的 OSDM 仿真代码,覆盖从参数生成到性能评估的完整路径。

痛点(常见问题)本平台解决方案
🔴 只给局部算法,没有完整收发链路✅ 提供 osdm_transmit+osdm_receive+ AWGN + BER 统计全流程
🔴 Walsh 系数如何选不清楚✅ 提供载波统计聚类 gen_walsh_carrier+ 低相关贪心选取 select_mod_coeffs
🔴 高阶调制映射规则不透明✅ 64-QAM 映射/解映射独立模块化:gen_qam64_maps/qam64_mod/qam64_demod
🔴 频谱合规无法量化判断BW_visible 掩模 +is_conform 逐点判定,支持衰减因子对比
🔴 结果展示零散且不可复用✅ 统一 utils/ 绘图与 save_figure 持久化输出到 results/

🎯 核心价值

🔬 学术研究价值

  • 算法闭环:覆盖 Walsh 正逆变换、Hilbert 正交恢复、QPSK/64QAM 判决、BER 评估。
  • 对比实验友好:同一框架下可直接比较不同调制、衰减因子、SNR 区间。
  • 可解释性强:收发端流程注释完整,关键步骤(系数注入、I/Q 提取)清晰可追踪。
  • 文档齐全:已包含 算法文档.md代码文档.md项目文档.md 三层文档。

💼 工程应用价值

  • 分层架构清晰core/modem/osdm/utils/demos 五层职责明确。
  • 模块可替换:量化器、调制器、系数选择策略均可独立替换。
  • 结果自动化产出:图像统一保存,便于报告写作与迭代对比。
  • 扩展门槛低:新增调制方式、掩模策略、信道模型时改动面可控。

⚡ 技术亮点

🏗️ 完整模块架构

OSDM_Platform/
├── 【核心算子 core/】
│   ├── gen_walsh.m              # 生成按序排序的归一化 Walsh 矩阵
│   ├── walsh_inverse.m          # 分窗 DWT:时域 -> Walsh 系数
│   ├── walsh_transform.m        # Walsh 正变换 + 可选频谱分析
│   ├── walsh_signal_extract.m   # WSE:降采样/量化/重构(DAC等效)
│   ├── hilbert_walsh.m          # Walsh 域 Hilbert 正交分量恢复
│   ├── quantize_coeffs.m        # 系数量化接口(当前默认直通)
│   ├── upsample_signal.m        # 符号保持上采样
│   └── oversample_signal.m      # 零阶保持过采样
│
├── 【调制层 modem/】
│   ├── gray_code.m              # Gray 码序列生成
│   ├── gen_qam64_maps.m         # 64-QAM 双向映射表与参考缓存
│   ├── qam64_mod.m              # 64-QAM 映射
│   ├── qam64_demod.m            # 64-QAM 最近邻硬判决
│   └── is_conform.m             # 频谱掩模合规判定
│
├── 【系统层 osdm/】
│   ├── osdm_params.m            # 全局参数构建(n53 + Walsh + 掩模)
│   ├── gen_conform_signal.m     # 随机合规信号生成(统计用途)
│   ├── gen_walsh_carrier.m      # 统计聚类 + 载波构建
│   ├── select_mod_coeffs.m      # 低相关贪心选系数
│   ├── osdm_transmit.m          # 发射端总入口
│   └── osdm_receive.m           # 接收端总入口
│
├── 【可视化 utils/】
│   ├── plot_walsh_basis.m       # Walsh 基函数展示
│   ├── plot_time_domain.m       # 时域图
│   ├── plot_spectrum.m          # 频谱与掩模图
│   ├── plot_constellation.m     # 星座图
│   ├── plot_ber_curve.m         # BER 曲线
│   └── save_figure.m            # 统一图片导出(300 DPI)
│
└── 【实验入口 demos/】
    ├── demo_qpsk.m              # OSDM-QPSK 全链路
    ├── demo_64qam.m             # OSDM-64QAM 全链路
    └── demo_osdm_overview.m     # 综合总览与对比

📊 典型仿真配置(来自代码默认设置)

场景调制每帧 OSDM 符号数每符号调制系数数衰减因子SNR 区间每点帧数
demo_qpskQPSK100320:2:20 dB50
demo_64qam64-QAM100350:2:24 dB30
demo_osdm_overviewQPSK / 64-QAM50(聚类分析段)3QPSK=2, 64QAM=50:2:20 dB30

说明:demo_osdm_overview 还包含衰减因子 2/4/6/8 的频谱合规性对比。

💻 核心代码展示

🔥 发射端系数注入与重构(osdm_transmit.m

% 第3步:将调制符号注入Walsh系数矩阵
coeffs = real(carrier.walsh.Xw_b);
coeffs(modulatedCoeffs, :) = real(upsampledSymbs .* coeffCarrier) / attenuationFactor;
​
% 第4步:Walsh正变换生成时域信号
slStruct = walsh_transform(coeffs, params.W, params.Nfft, params.osr, false);
s = real(slStruct.temporel);
​
% 第6步:WSE提取与重构(模拟DAC行为)
[sWalsh, Xw_b_raw] = walsh_signal_extract(s, params, length(s));

🚀 接收端 Walsh 域 Hilbert + I/Q 恢复(osdm_receive.m

% 第4步:Walsh域Hilbert变换恢复正交分量
Xw_TxImag = hilbert_walsh(coeffsRx, params.W);
​
% 第5步:I/Q解调
Xw_TxCI = coeffsRx(modulatedCoeffs, :) .* Wcosine + ...
          Xw_TxImag(modulatedCoeffs, :) .* Wsine;
Xw_TxCQ = Xw_TxImag(modulatedCoeffs, :) .* Wcosine - ...
          coeffsRx(modulatedCoeffs, :) .* Wsine;
​
% 第7步:分窗平均与符号判决
separatedSymbols = reshape(extractedI.', nRefreshPerSymbol/2, []) + ...
                   1j * reshape(extractedQ.', nRefreshPerSymbol/2, []);
meanSymbols  = mean(separatedSymbols, 1);
finalSymbols = reshape(meanSymbols, [], nModCoeffs).';

⚙️ 低相关系数贪心选取(select_mod_coeffs.m

for iCoeff = 2:nCoeffsToSelect
    correlation = zeros(length(cluster), 1);
    for iSub = 1:iCoeff - 1
        refSpectrum = fftWalsh(cluster == coefficients(iSub), :);
        correlation = correlation + sum(refSpectrum .* fftWalsh, 2);
    end
    [~, newCoeffIdx] = min(correlation);
    coefficients(iCoeff) = cluster(newCoeffIdx);
end

🎬 一键运行

>> cd D:\03_代码库\04.code4sale\OSDM\OSDM_Platform\demos
​
% OSDM-QPSK 全链路
>> demo_qpsk
​
% OSDM-64QAM 全链路
>> demo_64qam
​
% 综合总览(Walsh特性 + 合规性 + BER对比)
>> demo_osdm_overview

输出预览

=== OSDM-QPSK 链路仿真演示 ===
[1/6] 配置系统参数...
[2/6] 生成Walsh载波与选择调制系数...
[4/6] 执行单次OSDM-QPSK发射与接收...
  频谱合规: true
  SNR = 15 dB: 比特错误 xx / xxxx(BER = x.xxxxxx)
[5/6] 仿真BER曲线(多SNR点)...
...
=== OSDM-QPSK 演示完成 ===
============================================
   OSDM 链路仿真平台 — 综合演示
============================================
[1/8] Walsh矩阵特性...
[4/8] OSDM系数聚类分布...
[5/8] 不同衰减因子的频谱合规性...
[6/8] QPSK vs 64-QAM BER对比仿真...

ber_comparison.pngber_curve.pngcoefficient_clustering.pngconstellation_snr_5.pngconstellation_snr_15.pngmodulated_coeffs_spectrum.pngtx_spectrum.pngwalsh_basis_functions.pngwalsh_matrix_heatmap.pngwalsh_orthogonality.pngwalsh_spectrum_analysis.png

🖥️ 运行环境

  • MATLAB 版本:建议 R2020a 或更高版本
  • 依赖工具箱
    • Communications Toolbox(pskmod/pskdemod/int2bit

🛒 获取方式

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