第【47期】--基于MIMO‑OFDM 的ISAC系统仿真与性能分析--matlab完整代码

关注我,追更更多通信仿真!

文章目录

    • 摘要
    • [1. 引言](#1. 引言)
      • [1.1 背景](#1.1 背景)
      • [1.2 研究意义](#1.2 研究意义)
      • [1.3 本文工作](#1.3 本文工作)
    • [2. 系统模型与理论基础](#2. 系统模型与理论基础)
      • [2.1 MIMO‑OFDM 信号模型](#2.1 MIMO‑OFDM 信号模型)
      • [2.2 双基地雷达几何与多普勒](#2.2 双基地雷达几何与多普勒)
      • [2.3 信道估计与预编码](#2.3 信道估计与预编码)
      • [2.4 雷达信号处理原理](#2.4 雷达信号处理原理)
    • [3. 仿真平台设计与实现](#3. 仿真平台设计与实现)
      • [3.1 系统总体架构](#3.1 系统总体架构)
      • [3.2 核心功能模块详解](#3.2 核心功能模块详解)
        • [3.2.1 系统参数配置模块](#3.2.1 系统参数配置模块)
        • [3.2.2 场景与信道建模模块](#3.2.2 场景与信道建模模块)
        • [3.2.3 OFDM 波形与帧结构设计模块](#3.2.3 OFDM 波形与帧结构设计模块)
        • [3.2.4 信道估计与预编码模块](#3.2.4 信道估计与预编码模块)
        • [3.2.5 数据收发与雷达数据积累模块](#3.2.5 数据收发与雷达数据积累模块)
        • [3.2.6 雷达信号处理与可视化模块](#3.2.6 雷达信号处理与可视化模块)
      • [3.3 参数配置选项与实验设计](#3.3 参数配置选项与实验设计)
      • [3.4 性能评价指标](#3.4 性能评价指标)
    • [4. 仿真结果与分析](#4. 仿真结果与分析)
      • [4.1 默认配置基准结果](#4.1 默认配置基准结果)
      • [4.2 天线数量影响(`config_antennas.csv`)](#4.2 天线数量影响(config_antennas.csv))
      • [4.3 数据流数量影响(`config_datastreams.csv`)](#4.3 数据流数量影响(config_datastreams.csv))
      • [4.4 子载波数量影响(`config_subcarriers.csv`)](#4.4 子载波数量影响(config_subcarriers.csv))
      • [4.6 目标数量与分布影响(`config_targets.csv`)](#4.6 目标数量与分布影响(config_targets.csv))
    • [5. 结论与展望](#5. 结论与展望)
    • 参考文献

摘要

通信感知一体化(ISAC)被视为未来无线网络的核心技术,通过共享硬件与频谱资源,实现通信与雷达感知的深度融合。本文基于 MATLAB 平台,构建了一套完整的 MIMO‑OFDM ISAC 系统仿真框架,支持双基地场景下的动态目标感知与高速数据传输。系统采用对角化预编码抑制数据流间干扰,利用 OFDM 帧结构积累雷达数据立方体,通过慢时间 FFT 提取运动目标的多普勒信息,并生成位置热力图与距离‑多普勒响应图。本文系统性地探究了天线数量、数据流数、子载波数、及目标配置对通信误码率(BER)和感知分辨率的影响。仿真结果表明,增加天线数可显著提升角度分辨率和通信质量,但会增大计算复杂度;数据流数的增加以牺牲分集增益为代价换取更高频谱效率。本平台为 ISAC 系统参数优化与算法验证提供了有力工具。


1. 引言

1.1 背景

第五代移动通信(5G)的大规模部署催生了车联网、工业物联网、智慧城市等新兴应用,这些场景不仅要求高速率、低时延的数据传输,还对环境感知、目标定位与追踪提出了迫切需求。传统方案将通信基站与雷达系统独立建设,导致频谱占用重复、硬件成本高昂、站址协调困难。通信感知一体化(Integrated Sensing and Communication, ISAC) 技术的提出,旨在利用同一波形、同一频段、同一硬件平台同时实现通信信息传递与目标环境感知,是 6G 网络的关键使能技术 1

1.2 研究意义

ISAC 系统可赋能多种典型应用:智能交通中的车辆间协同感知与避障、无人机监管中的低空目标探测、智慧工厂中的物体定位与姿态识别,以及毫米波频段的高精度手势识别等。通过在基站侧嵌入雷达处理能力,网络运营商可以低成本实现"通信即感知"的增值服务。

MIMO(多输入多输出)和 OFDM(正交频分复用)分别是现代通信系统的两大支柱。MIMO 提供空间分集与复用增益,OFDM 有效对抗频率选择性衰落并支持灵活的资源分配。将二者结合于 ISAC,既能保障高数据速率,又能利用多天线角度分辨能力和 OFDM 子载波的频率多样性提升感知精度。然而,通信与感知在波形设计、资源分配、信号处理上存在内在矛盾(如通信追求低峰均比、感知追求优良的模糊函数),因此需要通过系统级仿真全面评估不同参数配置下的联合性能。

1.3 本文工作

本文构建了双基地 MIMO‑OFDM ISAC 仿真平台,实现了完整的收发链路、动态信道、预编码、信道估计与雷达处理。通过多组对照实验,系统分析了天线规模、数据流数、子载波数目、子载波间隔以及目标场景等因素对通信误码率(BER)、星座图质量、位置热图清晰度和距离‑多普勒分辨率的影响,为后续系统设计提供参考。


2. 系统模型与理论基础

2.1 MIMO‑OFDM 信号模型

考虑一个具有 N T x N_{\mathrm{Tx}} NTx 根发射天线和 N R x N_{\mathrm{Rx}} NRx 根接收天线的 MIMO 系统,OFDM 符号包含 N s c N_{\mathrm{sc}} Nsc 个子载波,子载波间隔为 Δ f \Delta f Δf,有效符号周期 T u = 1 / Δ f T_u = 1/\Delta f Tu=1/Δf,循环前缀(CP)长度 T C P T_{\mathrm{CP}} TCP 满足 T C P ≥ τ max ⁡ T_{\mathrm{CP}} \ge \tau_{\max} TCP≥τmax(最大多径时延)。每个 OFDM 符号总长度为 T s y m = T u + T C P T_{\mathrm{sym}} = T_u + T_{\mathrm{CP}} Tsym=Tu+TCP。

对于第 k k k 个子载波( k = 0 , 1 , ... , N s c − 1 k=0,1,\ldots,N_{\mathrm{sc}}-1 k=0,1,...,Nsc−1),发送信号向量 x k ∈ C N T x × 1 \mathbf{x}k \in \mathbb{C}^{N{\mathrm{Tx}} \times 1} xk∈CNTx×1 经过预编码矩阵 W p ( k ) ∈ C N T x × N s \mathbf{W}p(k) \in \mathbb{C}^{N{\mathrm{Tx}} \times N_s} Wp(k)∈CNTx×Ns 得到:

x k = W p ( k ) s k \mathbf{x}_k = \mathbf{W}_p(k) \mathbf{s}_k xk=Wp(k)sk

其中 s k ∈ C N s × 1 \mathbf{s}_k \in \mathbb{C}^{N_s \times 1} sk∈CNs×1 为 N s N_s Ns 个数据流上的调制符号(QAM)。接收端去除 CP 和 FFT 后,第 k k k 子载波上的接收信号为:

y k = H k x k + n k \mathbf{y}_k = \mathbf{H}_k \mathbf{x}_k + \mathbf{n}_k yk=Hkxk+nk

H k ∈ C N R x × N T x \mathbf{H}k \in \mathbb{C}^{N{\mathrm{Rx}} \times N_{\mathrm{Tx}}} Hk∈CNRx×NTx 为第 k k k 个子载波的信道矩阵, n k \mathbf{n}_k nk 为加性高斯白噪声(AWGN)。采用线性合并矩阵 W c ( k ) ∈ C N R x × N s \mathbf{W}c(k) \in \mathbb{C}^{N{\mathrm{Rx}} \times N_s} Wc(k)∈CNRx×Ns 恢复数据流:

s ^ k = W c H ( k ) y k \hat{\mathbf{s}}_k = \mathbf{W}_c^H(k) \mathbf{y}_k s^k=WcH(k)yk

2.2 双基地雷达几何与多普勒

系统采用收发分置的双基地布局,发射机位置 p T x \mathbf{p}{\mathrm{Tx}} pTx,接收机位置 p R x \mathbf{p}{\mathrm{Rx}} pRx。目标位置 p t \mathbf{p}_t pt,速度 v t \mathbf{v}_t vt。定义双基地距离和:

R Σ = ∥ p t − p T x ∥ + ∥ p t − p R x ∥ R_{\Sigma} = \|\mathbf{p}t - \mathbf{p}{\mathrm{Tx}}\| + \|\mathbf{p}t - \mathbf{p}{\mathrm{Rx}}\| RΣ=∥pt−pTx∥+∥pt−pRx∥

双基地多普勒频移由目标速度在收发方向上的投影之和决定 2

f d = − f c c v x ( cos ⁡ ϕ T x + cos ⁡ ϕ R x ) + v y ( sin ⁡ ϕ T x + sin ⁡ ϕ R x ) f_d = -\frac{f_c}{c} \left v_x \\left( \\cos\\phi_{\\mathrm{Tx}} + \\cos\\phi_{\\mathrm{Rx}} \\right) + v_y \\left( \\sin\\phi_{\\mathrm{Tx}} + \\sin\\phi_{\\mathrm{Rx}} \\right) \\right fd=−cfcvx(cosϕTx+cosϕRx)+vy(sinϕTx+sinϕRx)

其中 ϕ T x = atan2 ⁡ ( p T x , y − p t , y , p T x , x − p t , x ) \phi_{\mathrm{Tx}} = \operatorname{atan2}(p_{\mathrm{Tx},y} - p_{t,y},\ p_{\mathrm{Tx},x} - p_{t,x}) ϕTx=atan2(pTx,y−pt,y, pTx,x−pt,x), ϕ R x \phi_{\mathrm{Rx}} ϕRx 同理, f c f_c fc 为载频, c c c 为光速。

2.3 信道估计与预编码

初始阶段,利用已知前导序列(preamble)进行全频带信道估计。设发送前导为 X k p i l \mathbf{X}_k^{\mathrm{pil}} Xkpil,接收为 Y k p i l \mathbf{Y}_k^{\mathrm{pil}} Ykpil,则最小二乘估计:

H ^ k = Y k p i l ( X k p i l ) † \hat{\mathbf{H}}_k = \mathbf{Y}_k^{\mathrm{pil}} (\mathbf{X}_k^{\mathrm{pil}})^\dagger H^k=Ykpil(Xkpil)†

为了消除数据流间干扰,采用对角化预编码 。对 H ^ k \hat{\mathbf{H}}_k H^k 进行奇异值分解(SVD):

H ^ k = U k Σ k V k H \hat{\mathbf{H}}_k = \mathbf{U}_k \boldsymbol{\Sigma}_k \mathbf{V}_k^H H^k=UkΣkVkH

取 V k \mathbf{V}_k Vk 的前 N s N_s Ns 列作为 W p ( k ) \mathbf{W}_p(k) Wp(k),取 U k \mathbf{U}_k Uk 的前 N s N_s Ns 列作为 W c ( k ) \mathbf{W}c(k) Wc(k),则等效信道近似为对角阵,增益由奇异值 σ k , i \sigma{k,i} σk,i 决定。

2.4 雷达信号处理原理

在连续 M M M 个 OFDM 帧内,对每个子载波和接收天线收集回波信号,形成雷达数据立方体 D ∈ C N a c t × N R x × M \mathcal{D} \in \mathbb{C}^{N_{\mathrm{act}} \times N_{\mathrm{Rx}} \times M} D∈CNact×NRx×M,其中 N a c t N_{\mathrm{act}} Nact 为有效子载波数(除去保护带)。

对于静止散射体,其多普勒频率为零;运动目标则产生非零多普勒频移。通过在慢时间(帧)维度上进行 FFT,可将目标与杂波分离:

D f f t ( : , : , q ) = ∑ m = 0 M − 1 D ( : , : , m ) e − j 2 π q m / M \mathcal{D}{\mathrm{fft}}(:, :, q) = \sum{m=0}^{M-1} \mathcal{D}(:, :, m) e^{-j2\pi q m / M} Dfft(:,:,q)=m=0∑M−1D(:,:,m)e−j2πqm/M

直流分量( q = 0 q=0 q=0)对应静态散射体,直接置零即可抑制杂波。对剩余分量进行逆 FFT,得到去除静态散射体的时域数据。

位置热图 基于距离‑角度映射生成:对每个网格点 ( x , y ) (x,y) (x,y),计算其相对于收发机的距离和 R Σ R_{\Sigma} RΣ 和角度 θ \theta θ,利用插值从距离‑角度响应图中提取相应能量,形成空间功率分布图。

距离‑多普勒响应 利用匹配滤波原理,通过对慢时间 FFT 后的数据进行非相干积分,得到 ( R , f d ) (R, f_d) (R,fd) 平面上的能量分布,可直接读取目标距离与速度信息。


3. 仿真平台设计与实现

3.1 系统总体架构

仿真平台采用模块化设计,按照基带信号处理、射频链路、信道传播、感知处理的自然流程,将系统划分为六个核心功能模块,各模块之间通过标准化的数据结构传递参数和信号。整个平台在 MATLAB 环境下运行,充分利用了其通信和相控阵工具箱中的高效算法,同时保留了良好的扩展性,便于用户修改参数或替换核心算法。

系统总体流程如下:

  1. 系统参数初始化:读取用户指定的载频、带宽、子载波数、天线阵列规模、调制阶数、数据流数目、帧数等关键参数,并据此构建发射机、接收机、均匀线性阵列(ULA)等物理层组件的数学模型。
  2. 场景生成:定义收发机在二维平面上的位置及阵列朝向,设定运动目标的初始位置、速度矢量、雷达散射截面积(RCS),并随机生成大量静态散射体以模拟环境杂波。同时建立散射多径信道模型,支持动态目标运动。
  3. OFDM 波形与帧结构设计:根据系统带宽和子载波数计算子载波间隔、有效符号长度、循环前缀长度,并设计包含数据子帧和导频子帧的帧结构,同时确定多普勒和距离采样参数。
  4. 初始信道探测与预编码计算:发送已知的前导序列,在全频带上进行信道估计,获取初始信道状态信息;基于奇异值分解(SVD)计算对角化预编码矩阵和合并矩阵,为后续数据传输做好准备。
  5. 多帧数据收发与雷达数据积累:循环发送预定数量的 OFDM 帧,每帧数据经过预编码、OFDM 调制后通过时变信道传输;接收端利用导频子载波实时更新信道估计和预编码,并同时将信道矩阵信息累积为雷达数据立方体。
  6. 雷达信号处理与结果输出:对累积的数据立方体在慢时间维度上做傅里叶变换,抑制静态散射体杂波,生成位置热力图和距离‑多普勒响应图,并输出通信误码率和星座图等评价指标。

3.2 核心功能模块详解

3.2.1 系统参数配置模块

该模块负责解析用户输入,生成统一的系统参数结构体。主要配置包括:

  • 射频参数:载波频率(可设为 6 GHz 或 12 GHz)、系统带宽(如 100 MHz)、子载波数量(512、2048 或 4096)。
  • 天线与 MIMO 参数:发射天线数、接收天线数(可非对称,如 8 发 4 收)、数据流数、天线阵列类型(默认采用半波长间距的均匀线性阵列)。
  • 通信参数:调制阶数(如 64‑QAM)、每帧包含的 OFDM 符号数、总帧数。
  • 硬件模型参数:发射机峰值功率、接收机噪声系数、参考温度等。
3.2.2 场景与信道建模模块

场景建模模块模拟双基地 ISAC 的几何环境:

  • 收发位置与朝向:默认发射机位于原点 (0,0),接收机位于 (80,60)(单位:米),阵列法线分别指向正 Y 方向和负 X 方向(可旋转)。
  • 运动目标:预设多个点目标,每个目标有三维位置坐标和速度向量。目标运动模型采用匀速直线运动,每帧更新一次位置。
  • 静态散射体:在感兴趣区域内(如 0~120 米 × -80~80 米)随机生成数百个散射点,其反射系数为复随机数,用于模拟环境中的固定杂波(如建筑物、树木等)。
  • 散射 MIMO 信道:基于发射阵列、接收阵列、收发位置和朝向,构建一个多径信道对象。该信道支持直接路径(收发机间的直射信号)以及经过静态散射体和运动目标反射的路径,每条路径的时延、幅度和相位由几何关系与散射系数决定。
3.2.3 OFDM 波形与帧结构设计模块

该模块根据系统参数计算 OFDM 波形的所有时间‑频率资源参数:

  • 子载波间隔 Δ f = B / N s c \Delta f = B / N_{\mathrm{sc}} Δf=B/Nsc,有效符号周期 T u = 1 / Δ f T_u = 1/\Delta f Tu=1/Δf。
  • 循环前缀长度:根据最大探测距离(如 300 米)对应的最大时延,向上取整到整数个采样点。
  • 帧结构 :将每个 OFDM 帧划分为两个子帧:
    • 子帧 A(数据子帧):包含多个 OFDM 符号,全部用于传输数据,不插入导频,以提高频谱效率。
    • 子帧 B(导频子帧):包含的符号数与发射天线数相同,每个符号中插入等间隔的导频子载波,用于信道跟踪。
  • 采样参数:根据最大多普勒频率计算慢时间采样间隔,确保不出现多普勒混叠。
3.2.4 信道估计与预编码模块

该模块在初始阶段和每个帧的导频子帧中执行:

  • 初始信道估计 :发射端在所有有效子载波(除去保护带)上发送已知的伪随机序列,接收端通过最小二乘(LS)准则估计出每个子载波上的完整信道矩阵 H ^ k \hat{\mathbf{H}}k H^k(维度 N R x × N T x N{\mathrm{Rx}} \times N_{\mathrm{Tx}} NRx×NTx)。
  • 预编码/合并矩阵计算 :对 H ^ k \hat{\mathbf{H}}_k H^k 进行奇异值分解,选取前 N s N_s Ns 个右奇异向量作为预编码矩阵 W p \mathbf{W}_p Wp,前 N s N_s Ns 个左奇异向量作为合并矩阵 W c \mathbf{W}_c Wc。同时计算出功率归一化因子,保证各数据流发射功率恒定。
  • 信道跟踪:在后续每个帧的导频子帧中,利用导频子载波重新估计信道矩阵,并更新预编码/合并矩阵,以应对目标运动引起的信道时变。
3.2.5 数据收发与雷达数据积累模块

这是仿真的核心循环,每帧执行以下操作:

  • 数据生成与调制:为子帧 A 和 B 生成随机二进制数据,经 QAM 调制后形成数据符号向量。
  • 预编码与 OFDM 调制:数据符号乘以预编码矩阵,映射到各发射天线的子载波上,然后进行 IFFT 并添加循环前缀,生成时域 OFDM 信号。
  • 信道传播:时域信号经发射机放大后,送入散射 MIMO 信道,同时更新目标位置,得到接收端射频信号。
  • 接收处理:接收信号经低噪声放大、下变频、去 CP 和 FFT 后,利用合并矩阵恢复各数据流上的 QAM 符号,并计算该帧的 BER。
  • 信道更新:提取子帧 B 中的导频符号,执行信道估计和预编码更新,为下一帧做准备。
  • 雷达数据存储:将当前帧的等效信道矩阵(子载波 × 接收天线)累积到数据立方体中。
3.2.6 雷达信号处理与可视化模块

处理完毕后,对数据立方体进行如下操作:

  • 杂波抑制:在慢时间(帧)维上做 FFT,将零多普勒分量(对应静止散射体)置零,再反变换回时域,从而滤除静态杂波。
  • 位置热图生成:利用距离‑角度响应映射,将经过杂波抑制的数据投影到二维地理网格上,生成空间功率分布图,该图可直观显示运动目标的位置。
  • 距离‑多普勒响应生成:对杂波抑制后的数据做二维 FFT(快时间×慢时间),得到距离‑多普勒平面上的能量分布,可直接读取目标的距离和速度信息。
  • 结果输出:根据用户设置,显示或保存上述图形(场景布局、热图、距离‑多普勒图、星座图),并将每帧 BER 和平均 BER 写入文本文件。

3.3 参数配置选项与实验设计

为便于批量探究不同系统参数对性能的影响,平台支持通过 CSV 文件一次性指定多组参数,自动依次运行并分别保存结果。主要可调参数组包括:

配置组 可调参数 典型取值
天线配置 发射天线数、接收天线数 4×4, 8×4, 8×8, 16×16, 20×20
数据流配置 并行数据流数 N s N_s Ns 2, 4, 8(固定 16×16 天线)
子载波配置 总子载波数 512, 2048, 4096
波形参数配置 子载波间隔(隐含带宽变化)及载频 60/120/480 kHz,载频 6/12 GHz
目标场景配置 目标数量、位置、速度 默认 3 个,可扩展至 6 个或更多

通过组合上述配置,可以全面评估天线增益、空间复用阶数、频率分辨率、多普勒容限以及目标密度对通信和感知性能的综合影响。

3.4 性能评价指标

本平台从通信与感知两个维度设定评价指标:

  • 通信性能指标

    • 每帧误码率(BER)及全部帧的平均 BER。
    • 接收星座图:直观反映均衡后的信号质量,散点聚散程度可间接指示有效信噪比。
  • 感知性能指标

    • 位置热图:空间能量分布的峰值位置与真实目标位置的偏差,反映定位精度;峰值宽度反映角度分辨率。
    • 距离‑多普勒响应图:亮点的坐标对应目标的双基地距离和与多普勒频移,其与理论值的吻合程度衡量测距测速精度;旁瓣水平反映杂波抑制效果。

这些指标为后续的参数优化和算法改进提供了定量依据。

4. 仿真结果与分析

本节基于多组配置仿真结果,分析各参数对系统性能的影响。

4.1 默认配置基准结果

默认参数(config_default.csv)下,系统运行 24 帧。典型结果如下:

  • 场景图scenario.png)清晰显示发射机(0,0)、接收机(80,60)及三个目标:

    目标 1:(60,-25) m,速度(-15, 12) m/s;

    目标 2:(70,15) m,速度(20, -10) m/s;

    目标 3:(90,30) m,速度(0, 25) m/s。静态散射体随机散布于整个区域。

  • 位置热图heatmap.png)上,三个高亮区域与目标真实位置吻合良好,峰值位置偏差 < 2 m。由于 16×16 天线阵列提供较高的角度分辨力,各目标能清晰区分。

  • 距离‑多普勒图range_doppler.png)中,三个亮点分别位于理论双基地距离和(约 125 m、140 m、170 m)及其对应的多普勒频率(约 -820 Hz、+350 Hz、+580 Hz)处,验证了测距测速的准确性。

  • 星座图constellation.png)显示 64‑QAM 符号聚集成标准网格,平均 BER 约0.009,表明通信链路质量优良。

4.2 天线数量影响(config_antennas.csv

本组实验对比 4×4、8×4、8×8、16×16、20×20 五种天线配置,其余参数保持一致。(图很多,这里不方便展示所有)

通信性能:随着天线数增加,分集增益和波束成形增益提高,BER 会显著下降。

感知性能:热力图表明,4×4 的角度分辨率不足以分离相距较近的目标(如目标 1 和 2 在角度上重叠),导致热图峰值融合;而 16×16 和 20×20 可清晰分辨三个独立峰值,定位误差随天线数增加而减小。距离‑多普勒图中的亮点旁瓣也在大天线阵列下有所抑制,提升了动态范围。


4.3 数据流数量影响(config_datastreams.csv

固定 16×16 天线,改变数据流数 N s = 2 , 4 , 8 N_s = 2, 4, 8 Ns=2,4,8。

N_s BER
2 0.023023
4 0.032866
8 0.070068
  • BER:因为数据流增多,预编码对信道条件要求更高,且各流之间的残余干扰和功率分配不均导致部分流信噪比过低。

4.4 子载波数量影响(config_subcarriers.csv

比较 512、4096 子载波,带宽固定 100 MHz(子载波间隔相应变化)。

  • 子载波数减少(512)时,子载波间隔增大(约 195 kHz),可容忍更大多普勒频移(抗速度模糊),但距离分辨率受限于总带宽(不变),因此距离分辨率保持不变。然而,子载波数少导致有效子载波数减少,雷达数据立方体频率维度降低,影响距离‑多普勒图的精细度。
  • 4096 子载波时,子载波间隔变小(约 24 kHz),多普勒容限降低,易发生速度模糊,但频率采样更密,可改善距离旁瓣。

4.6 目标数量与分布影响(config_targets.csv

将目标从 3 个增至 6 个,分布更复杂(包括靠近区域边缘和相对静止的目标)。

  • 感知挑战:目标增加导致热图中能量分布更复杂,可能出现虚假峰值或目标遮挡。
  • 通信影响:多目标散射会造成更严重的多径干扰,信道频率选择性增强,BER 略有上升。预编码的跟踪能力在强多径场景下受到考验,帧间 BER 波动增大。
  • 该配置检验了系统在密集目标场景下的鲁棒性。

部分代码:

c 复制代码
%% 子函数:雷达数据处理与感知指标计算
function processRadarData(config, radarDataCube)
    % 该函数处理雷达数据并计算各种感知指标

    % 从配置结构体中提取所需字段
    systemParams = config.systemParams;
    scenario     = config.scenario;
    arrays       = config.elements.arrays;
    ofdm         = config.ofdm;
    options      = config.options;

    % 在慢时间(帧)维度上执行FFT,并将直流分量置零以去除静态散射体
    Y = fft(radarDataCube, [], 3);     % 沿第三维(帧)做FFT
    Y(:, :, 1) = 0;                    % 直流分量(零多普勒)对应静态散射体
    y = ifft(Y, systemParams.Nframe, 3); % 反变换回时域(已滤除静态杂波)

    % 创建位置热图绘制对象
    phm = helperPositionHeatmap( ...
        'ReceiveArray', arrays.rx, ...
        'ReceiveArrayOrientationAxis', scenario.rxAxis, ...
        'ReceiveArrayPosition', scenario.rxPos, ...
        'SampleRate', systemParams.sampleRate, ...
        'CarrierFrequency', systemParams.carrierFrequency, ...
        'Bandwidth', systemParams.bandwidth, ...
        'OFDMSymbolDuration', ofdm.ofdmSymbolDuration, ...
        'TransmitArrayOrientationAxis', scenario.txAxis, ...
        'TransmitArrayPosition', scenario.txPos, ...
        'TargetPositions', scenario.targetPositions, ...
        'ROI', scenario.regionOfInterest);

    % 如果启用显示,则绘制位置热图
    if options.SHOW_IMAGES
        figure;
        % 设置中文字体,防止中文乱码
        set(0, 'DefaultAxesFontName', 'SimHei');
        set(0, 'DefaultTextFontName', 'SimHei');
        phm.plot(y);
        title('运动目标热力图');

        % 如果启用保存,则保存热图
        if options.SAVE_IMAGES
            filename = fullfile(options.figSaveFolder, [options.figPrefix, 'heatmap.png']);
            saveas(gcf, filename);
        end
    end

    % 配置距离-多普勒响应处理器
    rangeDopplerResponse = phased.RangeDopplerResponse( ...
        'RangeMethod', 'FFT', ...                % 使用FFT计算距离
        'SampleRate', systemParams.sampleRate, ...
        'SweepSlope', systemParams.bandwidth / ofdm.ofdmSymbolDuration, ... % 扫频斜率(对应于OFDM)
        'PRFSource', 'Property', ...             % 手动指定脉冲重复频率
        'PRF', 1 / (ofdm.Tofdm * ofdm.frameLength), ... % 帧重复频率
        'ReferenceRangeCentered', false);        % 不将参考距离居中

    % 计算距离-多普勒响应(对y取共轭是因为内部处理要求)
    [rdr, r, doppler] = rangeDopplerResponse(conj(y));
    doppler = doppler * (-1);   % 取反以修正共轭引入的符号

    % 对所有接收天线进行非相干积分(求模平方和)
    rdr_integ = squeeze(sum(abs(rdr), 2));

    % 如果启用显示,则绘制距离-多普勒响应图
    if options.SHOW_IMAGES
        figure;
        % 设置中文字体
        set(0, 'DefaultAxesFontName', 'SimHei');
        set(0, 'DefaultTextFontName', 'SimHei');
        
        imagesc(doppler, r * 2, rdr_integ);   % 距离乘以2因为双基地距离和
        ax = gca;
        set(ax, 'YDir', 'normal');
        colorbar;
        xlabel('多普勒频率 (Hz)');
        ylabel('双基地距离和 (米)');
        title('距离-多普勒响应图');
        grid on;
        ylim([0 scenario.maxRange]);          % 限制纵轴范围
        hold on;

        % 计算理论上的双基地多普勒频率和距离和,用于在图上标记目标
        bistaticDoppler = helperBistaticDopplerShift( ...
            scenario.txPos, scenario.rxPos, ...
            scenario.targetPositions, scenario.targetVelocities, ...
            systemParams.carrierFrequency);

        % 计算双基地距离和(发射到目标再到接收的总距离)
        sumRange = vecnorm(scenario.targetPositions - scenario.rxPos) + ...
                   vecnorm(scenario.targetPositions - scenario.txPos);

        % 在距离-多普勒图上用大圆圈标出真实目标的理论位置
        plot(bistaticDoppler, sumRange, 'o', ...
            'LineWidth', 1, ...
            'MarkerSize', 28, ...
            'Color', '#D95319', ...
            'MarkerFaceColor', 'none', ...
            'DisplayName', '感兴趣目标');
        legend;

        % 如果启用保存,则保存距离-多普勒图
        if options.SAVE_IMAGES
            filename = fullfile(options.figSaveFolder, [options.figPrefix, 'range_doppler.png']);
            saveas(gcf, filename);
        end
    end
end
c 复制代码
%% 子函数:OFDM帧传输与雷达数据采集
function radarDataCube = transmitDataFrames(config)
    % 该函数传输OFDM帧并评估误码率(BER),同时累积雷达数据立方体

    % 从配置结构体中提取所需字段
    systemParams = config.systemParams;
    scenario     = config.scenario;
    ofdm         = config.ofdm;
    precoding    = config.precoding;
    transmitter  = config.elements.transmitter;
    channel      = config.elements.channel;
    receiver     = config.elements.receiver;
    options      = config.options;

    % 创建子帧A的调制/解调器(纯数据,无导频)
    [subframeAMod, subframeADemod, subframeAInfo] = createModDemod(true, ofdm, systemParams);

    % 创建子帧B的调制/解调器(含导频)
    % 首先定义子帧B的导频子载波索引和导频符号
    [ofdm.pilotIdxs, ofdm.pilots] = generatePilots(ofdm, systemParams.Ntx);
    [subframeBMod, subframeBDemod, subframeBInfo] = createModDemod(false, ofdm, systemParams);

    % 计算子帧B中数据子载波的索引(排除导频和保护带)
    ofdm.subframeBdataSubcarrierIdxs = setdiff( ...
        ofdm.numGuardBandCarriers(1)+1 : (ofdm.Nsub - ofdm.numGuardBandCarriers(2)), ...
        ofdm.pilotIdxs);

    % 计算速度分辨率并打印
    velocityResolution = dop2speed(1 / (ofdm.Nframe * ofdm.Tofdm * ofdm.Mt), systemParams.waveLength);
    fprintf("Velocity resolution: %.2f (m/s).\n", velocityResolution);

    % 子帧A和B的输入数据大小(OFDM符号数 × 子载波数 × 数据流数)
    subAInputSize = [subframeAInfo.DataInputSize(1), subframeAInfo.DataInputSize(2), ofdm.numDataStreams];
    subBInputSize = [subframeBInfo.DataInputSize(1), subframeBInfo.DataInputSize(2), ofdm.numDataStreams];

    % 初始化雷达数据立方体(有效子载波 × 接收天线 × 帧数)
    radarDataCube = zeros(ofdm.numActiveSubcarriers, systemParams.Nrx, ofdm.Nframe);

    % 初始化BER记录数组
    berRatios = zeros(ofdm.Nframe, 1);

    % 逐帧仿真OFDM帧的生成、发送和接收
    for i = 1:ofdm.Nframe
        % 生成子帧A和B的二进制有效载荷,并调制为QAM符号
        [subframeABin, subA] = generateSubframe(true, subframeAMod, subAInputSize, systemParams, ofdm, precoding, systemParams);
        [subframeBBin, subB] = generateSubframe(false, subframeBMod, subBInputSize, systemParams, ofdm, precoding, systemParams);

        % 将两子帧的二进制数据合并,作为第i帧的发送数据
        txDataBin = cat(1, subframeABin(:), subframeBBin(:));

        % 重排子帧数据并合并为完整的OFDM帧(每个符号一列)
        subA = reshape(subA, ofdm.ofdmSymbolLengthWithCP, ofdm.subframeALength, []);
        subB = reshape(subB, ofdm.ofdmSymbolLengthWithCP, systemParams.Ntx, []);
        ofdmSignal = [subA subB];

        % 预分配接收信号数组
        rxSignal = zeros(size(ofdmSignal,1), size(ofdmSignal,2), systemParams.Nrx);

        % 逐符号发送(每个符号对应一个OFDM符号周期)
        for s = 1:size(ofdmSignal,2)
            % 更新目标位置(根据速度移动)
            [scenario.targetPositions, scenario.targetVelocities] = scenario.targetMotion(ofdm.Tofdm);

            % 发射当前OFDM符号(经过功放)
            tx = transmitter(squeeze(ofdmSignal(:,s,:)));

            % 通过散射MIMO信道传播(包含静态散射体和运动目标)
            chanOut = channel(tx,...
                [scenario.scatterPos scenario.targetPositions], ...
                [zeros(size(scenario.scatterPos)) scenario.targetVelocities], ...
                [scenario.scatterRC scenario.targetRC]);

            % 接收端添加热噪声
            rxSignal(:,s,:) = receiver(chanOut);
        end

        % 分离接收信号为子帧A和B
        rxSubframeA = rxSignal(:, 1:ofdm.subframeALength, :);
        rxSubframeA = reshape(rxSubframeA, [], systemParams.Nrx);

        rxSubframeB = rxSignal(:, ofdm.subframeALength+1:end, :);
        rxSubframeB = reshape(rxSubframeB, [], systemParams.Nrx);

        % 解调子帧A和B,并应用合并权重
        [rxSubframeAQamComb, ~] = demodulateAndApplyWeights(true, subframeADemod, rxSubframeA, ofdm, precoding, systemParams);
        [rxSubframeBQamComb, rxPilots] = demodulateAndApplyWeights(false, subframeBDemod, rxSubframeB, ofdm, precoding, systemParams);

        % 合并解调后的QAM数据,并计算误码率
        rxDataQam = cat(1, rxSubframeAQamComb(:), rxSubframeBQamComb(:));
        rxDataBin = qamdemod(rxDataQam, ofdm.modOrder, 'OutputType', 'bit', 'UnitAveragePower', true);
        [~, ratio] = biterr(txDataBin, rxDataBin);
        fprintf("Frame %d bit error rate: %.4f\n", i, ratio);
        berRatios(i) = ratio;   % 存储当前帧BER

        % 利用子帧B的导频进行信道估计,并更新预编码/合并权重
        channelMatrix = helperInterpolateChannelMatrix(ofdm.Nsub, ofdm.numGuardBandCarriers, ofdm.pilots, rxPilots, ofdm.pilotIdxs);
        [Wp, Wc, ~, G] = diagbfweights(channelMatrix);
        precoding.Wp = Wp;
        precoding.Wc = Wc;
        precoding.G = G;

        % 将当前帧的信道矩阵(对所有发射天线求和)存入雷达数据立方体
        radarDataCube(:,:,i) = squeeze(sum(channelMatrix, 2));
    end

    % 计算并保存平均BER
    meanBER = mean(berRatios);
    fprintf("Mean BER across all frames: %.6f\n", meanBER);
    
    % 生成BER结果文件名(带时间戳和配置前缀)
    filename = fullfile(options.figSaveFolder, [options.figPrefix, 'BER_results.txt']);

    % 将BER结果写入文本文件
    fileID = fopen(filename, 'w');
    fprintf(fileID, 'ISAC Simulation BER Results\n');
    fprintf(fileID, '===========================\n');
    fprintf(fileID, 'Per-frame BER:\n');
    for i = 1:ofdm.Nframe
        fprintf(fileID, 'Frame %2d: %.6f\n', i, berRatios(i));
    end
    fprintf(fileID, '\nMean BER: %.6f\n', meanBER);
    fclose(fileID);
    
    fprintf("BER results saved to: %s\n", filename);

    % 如果启用图像显示,绘制接收QAM星座图
    if config.options.SHOW_IMAGES
        figure;
        % 设置中文字体,防止乱码
        set(0, 'DefaultAxesFontName', 'SimHei');
        set(0, 'DefaultTextFontName', 'SimHei');
        scatterplot(rxDataQam);
        title('接收 QAM 星座图');
        grid on;
    
        % 如果启用保存,保存星座图
        if config.options.SAVE_IMAGES
            filename = fullfile(options.figSaveFolder, [options.figPrefix, 'constellation.png']);
            saveas(gcf, filename);
        end
    end
end

5. 结论与展望

本文基于 MATLAB 平台,实现了一套完整的 MIMO‑OFDM ISAC 系统仿真,覆盖了从系统参数配置、动态信道建模、预编码传输到雷达数据处理的完整流程。未来工作可进一步引入更精确的射线追踪信道、波形优化(如 OFDM 雷达专用序列)、多目标跟踪滤波器以及多基站协同感知架构,使仿真平台更贴近实际部署。


仿真代码可见文末VX公众号,所见即所得

参考文献

1 Liu F, Cui Y, Masouros C, et al. Integrated sensing and communications: Toward dual-functional wireless networks for 6G and beyondJ. IEEE Journal on Selected Areas in Communications, 2022, 40(6): 1728-1767.

2 Skolnik M I. Introduction to radar systemsM. 3rd ed. New York: McGraw-Hill, 2001.