第【27】期--基于OFDM的通感一体化(ISAC) 全链路实现 --matlab完整代码
摘要
通感一体化(Integrated Sensing and Communication, ISAC)是6G移动通信网络的关键使能技术,旨在通过共享频谱与硬件平台,同时实现高速数据通信和高精度雷达感知。本文基于MATLAB平台,搭建了一套完整的ISAC系统仿真框架,涵盖OFDM-ISAC波形设计、MIMO波束成形、双通道(通信+雷达)信道建模、雷达距离-多普勒处理与CA-CFAR检测、MMSE均衡与BER评估,以及基于帕累托最优的多目标参数优化等全链路模块,可作为 ISAC技术原理学习、算法验证及系统级仿真的参考案例
1 背景意义
回顾无线通信的发展史,1G到5G解决的核心问题是“如何把信息传得更快、更稳”。然而,随着物联网、车联网、智慧城市和元宇宙的兴起,6G网络被赋予了全新的使命——不仅要把数据传出去,还要实时“感知”物理世界。
在目前的5G网络中,通信基站(负责数据传输)和雷达系统(负责目标探测)是两套独立的基础设施。它们占用各自独立的频段,使用各自独立的硬件。但这种方法在6G时代难以为继:
-
频谱资源极度紧缺:低频段已被各种无线电业务瓜分殆尽,毫米波和太赫兹频段虽然带宽充裕,但无法同时满足两套系统的独占需求。
-
硬件成本高昂:在基站上同时部署通信模组和雷达模组,不仅增加设备体积,还大幅提升功耗和成本。
-
信息割裂:通信系统获取的数据和雷达系统获取的感知数据无法在底层深度融合,限制了诸如“通感算智”一体化等高级应用。
因此,通感一体化(Integrated Sensing and Communication, ISAC) 应运而生。它的核心理念是:用同一段频谱、同一套硬件、同一个波形,同时完成通信与感知两项任务。这不仅是技术演进的需求,更是6G网络走向“万物智联、万物智感”的必由之路。
2 项目介绍
本项目模拟了一个工作在28GHz毫米波频段的8发4收MIMO-OFDM基站,在向一个通信用户传输数据的同时,精准探测三个移动目标的位置与速度。
关键原理:
- 本仿真采用 OFDM 帧结构 实现这一目标:部分子载波承载已知导频(用于雷达回波处理),部分子载波承载通信数据(用于信息传输),两者在频域正交、时域叠加,实现频谱的100%共享
本系统采用 ISAC 混合波束成形 策略:将通信波束(指向用户方向 0°)和雷达波束(指向三个目标方向 10°、-20°、35°)按功率分配系数 β 加权合并。

这使得同一组天线阵列在用户方向保持通信增益的同时,在多个雷达目标方向形成有效的探测波束。



- ISAC 系统存在一个根本矛盾:通信追求高速率,需要更多子载波承载数据;感知追求高精度,需要更多子载波承载导频。这个矛盾无法消除,只能寻求帕累托最优——在不损害一项指标的前提下,无法进一步提升另一项指标的状态。

通过扫描
α(导频占比)和 λ 两个维度,寻找使 U 最大化的参数组合。
3 仿真分析
| 类别 | 参数 | 数值 |
|---|---|---|
| 射频 | 载波频率 / 带宽 | 28 GHz / 100 MHz |
| OFDM | 子载波数(活跃/总) | 200 / 256 |
| OFDM 符号数(CPI) | 128 | |
| 子载波间隔 / CP长度 | 390.6 kHz / 32 采样点 | |
| 雷达 | 最大不模糊距离 / 分辨率 | 384 m / 1.50 m |
| 最大不模糊速度 / 分辨率 | 26.8 m/s / 0.21 m/s | |
| MIMO | 天线数(发射/接收) | 8 / 4 |
| 用户方向 / 目标方向 | 0° / 10°, -20°, 35° | |
| 目标 | 距离 / 速度 / RCS | [80, 150, 280] m / [+15, -20, +30] m/s / [1.0, 0.6, 0.8] |
| 通信 | 调制方式 / 导频符号数 | 16-QAM / 4 |
| 导频占比 α / 功率分配 β | 0.40 / 0.75 | |
| CFAR | 虚警概率 Pfa / 训练单元数 | 10⁻⁵ / 8 |
| 优化 | 最优导频占比 α* / 最优权重 λ* | 0.30 / 0.75 |
| 性能 | 雷达 SINR / 距离 RMSE | 20.5 dB / 0.28 m |
| 误码率 BER / 频谱效率 SE | 2.3×10⁻⁴ / 3.12 bps/Hz |

可以看到:
- 纯通信波束(蓝线)。即假设基站只给用户传数据,不做雷达探测时,天线能量在空间中的分布–在 0°(通信用户方向) 形成一个非常尖锐、极高的主瓣(接近0 dB),但其他角度(感知目标10°、-20°、35°)的能量非常低(低于-10 dB)
- ISAC联合波束(红线)。即通过波束成形算法,将“通信波束”和“雷达探测波束”加权合并后的最终发射方向图。相比蓝线,它在 感知目10°、-20°、35° 三个方向上,能量被抬高了,且通信用户方向波束损失较少。
- 可以图2看到在坐标 (80m, +15m/s)、(150m, -20m/s) 和 (280m, +30m/s) 附近,出现了三个极其明亮且清晰的黄色光斑。说明系统准确无误地发现了全部 3 个预设目标,没有漏检。
- 图3看出了在 20 dB 信噪比下,测距误差约为 1.5米, CRB(虚线)和 RMSE(实线)在 20 dB 竖线处的数值几乎重合,表明了在当前工作点上,算法的实测精度确实触碰到了CRB极限。
- 图4 三条曲线都呈 S 型上升。在低信噪比区域(如 -5 ~ 5 dB),曲线紧贴底部,说明雷达完全被噪声淹没,根本看不见目标。在高信噪比区域(如 15 ~ 25 dB),曲线快速攀升至顶部,说明目标回波远强于噪声,雷达一眼就能看见。此外,不同目标的“被发现门槛”不同:在高信噪比下,Swerling 0 型永远比 其他两种高。随着信噪比增加,所有模型都达到完美检测,但收敛速度差异巨大,凸显了目标RCS起伏特性对可靠感知的巨大影响。
Swerling 0型:雷达截面积(RCS)恒定不变:假设目标的反射面积在观测期间完全不变,回波信号不存在任何随机抖动。只要雷达发射功率不变,目标回波的强度就是恒定的。
Swerling I 型(慢起伏瑞利分布):目标的 RCS 服从2个自由度的卡方分布(即瑞利分布)。这意味着目标有很高的概率出现“极弱回波”(深衰落非常严重)。雷达在观测期间,有可能正好撞上目标反射面“转向”的时刻,导致回波几乎消失,所以容易漏检。
Swerling III 型(慢起伏 4 自由度卡方分布):目标的 RCS 服从4个自由度的卡方分布。它的概率密度函数在“0”附近的值比瑞利分布小得多。换句话说,目标回波的能量更集中,极少出现极端微弱的深衰落,能量相对稳定,所以雷达更容易把它从噪声中“捞”出来。
部分代码:
% =========================================================================
% 设计通信波束和雷达波束,生成 ISAC 混合波束
% =========================================================================
clc; close all;
load('workspace_S1.mat');
fprintf('============================================================\n');
fprintf(' S2 - MIMO 波束成形\n');
fprintf('============================================================\n\n');
% -------------------------------------------------------------------------
% 导向矢量函数:@(theta_deg, N) exp(1j * pi * (0:N-1)' * sind(theta_deg))
% -------------------------------------------------------------------------
steer = @(theta_deg, N) exp(1j * pi * (0:N-1)' * sind(theta_deg));
% -------------------------------------------------------------------------
% 通信波束:指向用户方向
% -------------------------------------------------------------------------
theta_user = 0; % 用户方向 (deg)
w_comm = steer(theta_user, Nt) / sqrt(Nt); % 归一化波束权重
fprintf(' 用户方向 : %d 度\n', theta_user);
% -------------------------------------------------------------------------
% 雷达波束:分别指向每个目标
% -------------------------------------------------------------------------
W_sense = zeros(Nt, Ntargets);
for t = 1:Ntargets
W_sense(:, t) = steer(target_angle(t), Nt) / sqrt(Nt);
fprintf(' 目标 %d 波束 : %+d 度\n', t, target_angle(t));
end
% -------------------------------------------------------------------------
% 多波束 ISAC 策略:为每个目标独立形成波束
% -------------------------------------------------------------------------
W_isac = sqrt(beta) * (w_comm * ones(1, Ntargets)) + sqrt(1-beta) * W_sense;
W_isac = W_isac ./ max(vecnorm(W_isac), 1e-10);
% -------------------------------------------------------------------------
% 单波束 ISAC 策略:将所有目标合并为一个综合波束
% -------------------------------------------------------------------------
w_sense_combined = sum(W_sense, 2);
w_sense_combined = w_sense_combined / max(norm(w_sense_combined), 1e-10);
w_isac_single = sqrt(beta) * w_comm + sqrt(1-beta) * w_sense_combined;
w_isac_single = w_isac_single / max(norm(w_isac_single), 1e-10);
w_tx = w_isac_single; % 最终选用的发射波束
% -------------------------------------------------------------------------
% 计算波束方向图
% -------------------------------------------------------------------------
theta_scan = -90:0.5:90; % 扫描角度范围
BP_comm = zeros(size(theta_scan));
BP_isac = zeros(size(theta_scan));
BP_isac_single = zeros(size(theta_scan));
for ii = 1:numel(theta_scan)
sv = steer(theta_scan(ii), Nt);
BP_comm(ii) = abs(sv' * w_comm)^2;
BP_isac(ii) = sum(abs(sv' * W_isac).^2);
BP_isac_single(ii) = abs(sv' * w_isac_single)^2;
end
% 归一化到 dB
BP_comm_dB = 10*log10(BP_comm / max(BP_comm) + 1e-10);
BP_isac_dB = 10*log10(BP_isac / max(BP_isac) + 1e-10);
BP_isac_single_dB = 10*log10(BP_isac_single / max(BP_isac_single) + 1e-10);
% -------------------------------------------------------------------------
% 计算目标方向的波束增益
% -------------------------------------------------------------------------
BF_gain_dB = zeros(1, Ntargets);
BF_gain_single_dB = zeros(1, Ntargets);
for t = 1:Ntargets
sv_t = steer(target_angle(t), Nt);
BF_gain_dB(t) = 20*log10(abs(sv_t' * W_isac(:, t)) + 1e-10);
BF_gain_single_dB(t) = 20*log10(abs(sv_t' * w_isac_single) + 1e-10);
end
BF_gain_mean_lin = mean(10.^(BF_gain_single_dB/10));
fprintf('\n 多波束增益 : %s dB\n', num2str(round(BF_gain_dB, 2)));
fprintf(' 单波束增益 : %s dB\n', num2str(round(BF_gain_single_dB, 2)));
fprintf(' 平均波束功率增益 : %.3f dB\n', 10*log10(BF_gain_mean_lin));
% =========================================================================
% 绘制波束方向图
% =========================================================================
figure('Name', 'S2 - ISAC 波束方向图', 'Color', [0.12 0.12 0.15], ...
'Position', [100 100 800 450]);
ax = axes;
set(ax, 'Color', [0.14 0.14 0.18], 'XColor', [0.7 0.7 0.8], ...
'YColor', [0.7 0.7 0.8], 'GridColor', [0.35 0.35 0.45], 'GridAlpha', 0.5);
hold on; grid on; box on;
plot(theta_scan, BP_comm_dB, '--', 'Color', [1.0 0.6 0.2], 'LineWidth', 2, ...
'DisplayName', '纯通信波束');
plot(theta_scan, BP_isac_dB, '-', 'Color', [0.3 0.8 1.0], 'LineWidth', 2, ...
'DisplayName', 'ISAC 多波束');
plot(theta_scan, BP_isac_single_dB, '-', 'Color', [0.9 0.4 1.0], 'LineWidth', 1.8, ...
'DisplayName', 'ISAC 单波束');
% 标注目标方向
for t = 1:Ntargets
xline(target_angle(t), '--', 'Color', [0.4 1.0 0.5], 'LineWidth', 1, ...
'HandleVisibility', 'off');
end
xline(theta_user, ':', 'Color', [1.0 0.6 0.2], 'LineWidth', 1.5, 'HandleVisibility', 'off');
ylim([-50 3]); xlim([-90 90]);
title('ISAC 均匀线阵波束方向图', 'Color', [0.9 0.9 1.0], 'FontSize', 12, 'FontWeight', 'bold');
xlabel('角度 (度)', 'Color', 'white');
ylabel('归一化阵列增益 (dB)', 'Color', 'white');
legend('Location', 'best', 'FontSize', 9);
% =========================================================================
% 保存
% =========================================================================
save('workspace_S2.mat');
fprintf('\n [已保存] workspace_S2.mat\n');
fprintf(' 下一步 -> 运行 ISAC_3.m\n');
fprintf('============================================================\n');
4总结
本文可作为 ISAC技术原理学习、算法验证及系统级仿真的参考案例。
- 源代码 出图所见即所得,代码获取方式见VX公众号
更多推荐


所有评论(0)