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

来源:这里教程网 时间:2026-03-03 23:31:50 作者:

???? 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_qpsk
         | QPSK          | 100              | 3                | 2               | 0:2:20 dB | 50       ||
demo_64qam
        | 64-QAM        | 100              | 3                | 5               | 0:2:24 dB | 30       ||
demo_osdm_overview
| QPSK / 64-QAM | 50(聚类分析段) | 3                | QPSK=2, 64QAM=5 | 0:2:20 dB | 30       |

说明:

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<em>comparison.png ber</em>curve.png coefficient<em>clustering.png constellation</em>snr<em>5.png constellation</em>snr<em>15.png modulated</em>coeffs<em>spectrum.png tx</em>spectrum.png walsh<em>basis</em>functions.png walsh<em>matrix</em>heatmap.png walsh<em>orthogonality.png walsh</em>spectrum_analysis.png

????️ 运行环境

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

???? 获取方式

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

相关推荐