
做通感一体化ISAC项目的时候我第一次接触“双功能雷达与通信系统”这个名词也有点懵。雷达要的是大带宽、低峰均比、高动态范围通信要的是高数据率、低误码率、多用户调度两套系统硬塞进同一套硬件里干扰怎么解决后来我意识到空间维度的自由度才是突破口也就是标题里写的波束成形。这篇博文把我用Matlab从零搭一套DFRC仿真链路的完整过程讲一遍包括信号建模、波束成形权重求解、雷达测距测速、通信解调验证以及几个我踩过的坑。无论你是做毕业设计、竞赛答辩还是刚入职接触通信感知一体化这套链路都能直接当模板用。我会尽量把每一步的“为什么”也讲清楚而不是只丢给你一段能跑的代码。1. 双功能雷达通信系统到底是什么为什么波束成形绕不开1.1 雷达和通信共用一套硬件的现实原因车载毫米波雷达、无人机探测、WiFi感知这类场景里如果雷达和通信各装一套天线体积、功耗、成本都会翻倍。更重要的是频谱资源越来越紧张过去那种“雷达占一段、通信占一段”的做法在很多频段已经走不通了。于是“双功能雷达与通信系统DFRC”这个概念火了让同一个发射阵列、同一段频谱、同一种波形既完成目标探测又把数据传出去。我理解它本质上是给硬件做一次乘法把原本两份硬件的工作压缩成一份。这套系统的核心难点不在硬件而在信号设计。雷达信号要求自相关旁瓣低这样微弱目标不会被强目标的旁瓣淹没通信信号则要求解调简单、频谱效率高。两种需求天然冲突。现实中又没有一套波形能同时完美满足所有条件所以需要工程折中。1.2 主流DFRC架构时分、频分与波形融合做仿真之前先得选架构。我给自己列过一张对比表架构思路优点明显短板时分共享雷达和通信分时隙工作实现最简单雷达/通信性能各自保留时间利用率低刷新率受影响频分共享雷达和通信占不同子载波可同时工作互干扰小频谱效率低违背“省频谱”初衷波形融合同一波形同时携带雷达探测信息和通信数据频谱效率最高信号设计和接收处理复杂度高波束成形辅助空间上把雷达波束和通信波束分向不同用户/目标可不牺牲时间/频率资源依赖阵列自由度要做联合优化我在仿真里选的是“波形融合波束成形辅助”的组合。严格说这是一个很常见的DFRC发射方案雷达探测方向用固定的探测波形通信方向通过调整权重把信息“嵌”进去。这比单独的时分或频分更有研究价值也更能体现波束成形的意义。1.3 波束成形在这里扮演什么角色波束成形不只是“把信号集中到一个方向”这么简单。它实际上是给每个阵元乘上一个复数权重让发射信号在某些空间角度同相叠加形成主瓣在另一些角度反相抵消形成零陷。DFRC系统里天线阵列通过波束成形把雷达需要的探测能量和通信需要的数据流分到不同的空间区域相当于在同一个空间里用方向维度做隔离。空间隔离有个非常直接的好处它不消耗时间也不额外占用频谱。也就是说雷达波束和通信波束可以同时发射、同时工作。后续所有仿真优化本质上都是在调整这些复数权重让雷达方向的波形质量尽可能好同时通信方向的误码率还能压下来。所以理解了“权重向量就是系统的核心变量”整篇博客后面的仿真链路就顺了。2. 仿真前必须想清楚的信号模型与性能指标2.1 均匀线阵与发射信号模型Matlab仿真里我用的发射阵列是均匀线阵ULA阵元数设成16阵元间距取半波长。为什么是半波长因为阵元间距超过半波长会出现栅瓣方向图会在其他方向重复出现高增益雷达容易把非目标方向的强反射当真目标。间距小于半波长虽然不会栅瓣但孔径变小、波束变宽角度分辨率下降。所以半波长是工程默认值也是大多数仿真教程直接给结论但不解释原因的地方。第 m 个阵元在时刻 t 的发射信号可以写成s_m(t) w_m * x_radar(t) * exp(j2pif_ct)其中 x_radar(t) 是基带探测信号。通信信息通过修改每个阵元的权值 w_m 来承载。雷达基带信号我用的是线性调频信号LFM扫频带宽 B100MHz脉冲宽度 T_p10us。LFM的好处是匹配滤波后能得到很尖锐的峰值测距精度高而且工程上成千上万的雷达都在用参数好解释。2.2 雷达侧关心的性能指标雷达接收端最关心的第一件事是“目标能不能从噪声和杂波里被看到”。我常用峰值旁瓣比PSLR和积分旁瓣比ISLR来量化。PSLR是主瓣峰值和最大旁瓣的比值单位是dBISLR是所有旁瓣能量和主瓣能量的比值。对LFM信号来说加不加窗函数会直接影响这两个值。不加窗时PSLR大约-13dB加汉明窗可以压到-40dB以下但主瓣会变宽距离分辨率变差。这就是雷达里经典的“旁瓣抑制和分辨率”取舍。另一个指标是测速模糊。雷达要测速度需要在一个相干处理间隔内发射多个脉冲然后对慢时间维做FFT。脉冲数越少多普勒分辨率越差。仿真里我发64个脉冲这样在10GHz载频、1000m/s目标速度范围内可以分得比较开。2.3 通信侧关心的性能指标通信侧最重要的指标是误码率BER和误差矢量幅度EVM。我在这里把通信数据用BPSK调制到波束权重的相位上理论误码率公式是 Q(sqrt(2*SINR))。仿真里只要接收端解调后算出的BER和理论值差不太多就能说明波束成形和信道建模是合理的。很多人做DFRC仿真时会忽略EVM只看BER。但EVM能更细致地反映星座点偏移情况。如果通信方向存在雷达回波干扰星座图上的点会扩散成椭圆EVM直接上升。我一般定一个25%的EVM门槛超过这个门槛就认为通信质量不可接受。两个指标配合用能更快定位问题。2.4 联合优化问题怎么定义把指标定清楚后整个仿真核心就变成一个联合优化问题。我的目标是给定雷达方向 theta_rad 和通信方向 theta_com找一个权重向量 w使得雷达方向的主瓣增益尽量接近理想值同时通信方向的天线增益要高于预设阈值还要保证波束旁瓣不太高。用公式写就是min || a(theta_rad)^H * w - G_target ||^2s.t. |a(theta_com)^H * w| G_min|a(theta_k)^H * w| P_side, 对任意旁瓣方向theta_k其中 a(theta) 是阵列导向矢量G_target 是雷达方向期望增益G_min是通信方向最低增益P_side是旁瓣约束。这个凸优化问题可以用Matlab的CVX工具箱求解也可以自己写投影梯度下降。我第一次是用CVX后来为了不依赖外部工具箱自己实现了交替投影算法效果类似。3. Matlab仿真链路搭建从阵列初始化到方向图3.1 仿真参数表与初始化代码我先把所有关键参数都放在一段脚本里方便后面反复改。这里给出一个可以直接跑的初始化段落% 基础参数 fc 10e9; % 载频 10GHz c 3e8; % 光速 lambda c / fc; % 波长 N 16; % 阵元数 d lambda / 2; % 阵元间距 % LFM信号参数 B 100e6; % 带宽 100MHz Tp 10e-6; % 脉宽 10us fs 200e6; % 采样率 200MHz prf 1000e3; % 脉冲重复频率实际10kHz量级仿真可放宽 snapshots 64; % 相干脉冲数 % 阵列导向矢量函数 theta linspace(-90, 90, 361); a (th) exp(1j*2*pi*d/lambda * (0:N-1) * sind(th)); % 目标方向 theta_rad 0; % 雷达探测方向 theta_com 30; % 通信用户方向这里采样率 fs 取 200MHz是为了在仿真的数字域里满足奈奎斯特条件。实际雷达中频采样可能更高但仿真只关注基带复信号处理过采样倍数取2就够了。3.2 生成LFM基带信号并“塞”入通信数据生成LFM基带信号的代码非常简单t (0:round(Tp*fs)-1) / fs; x_radar exp(1j*pi * B/Tp * t.^2); % 上扫频LFM接着要做的是把BPSK通信数据嵌入到雷达波形里。我采用的方式是先计算雷达方向所需的匹配权重再在通信方向叠加一个小的相位扰动。更常见的方法是构造期望方向图把通信数据调制到一部分阵元上但这样做会破坏雷达波束的相位一致性。所以我的做法是先求出雷达、通信两个方向的导向矢量再用优化权重 w 来生成每个阵元的实际发射信号[ s w * x_radar ]其中 w 是复数权重向量。BPSK通信数据表现为 w 中某几组相邻天线的相对相位翻转。实际实现时我用一个随机比特序列 b 去控制一个修正权重向量bits randi([0 1], 1, 64); b_phase (2*bits - 1) * pi/8; % 相位扰动幅度可控 w w_opt .* exp(1j * kron(b_phase, ones(N,1)) / N);注意这里相位扰动幅度不要太大否则雷达波束方向图会变形。我通常把扰动相位控制在±pi/8以内这样主瓣增益损失不超过0.5dB。3.3 计算波束成形权重匹配滤波与MVDR权重计算我用两种方法做对照。第一种是经典的匹配滤波最大比发射直接取雷达方向的导向矢量作为权重w_mf conj(a(theta_rad)) / N;这个权重的方向图主瓣对准0°实现最简单但通信方向的增益完全不受控。第二种是MVDR最小方差无失真响应思想的扩展让雷达方向增益固定为1同时压低通信方向的干扰A [a(theta_rad), a(theta_com)]; target [1, 0.5]; % 雷达方向期望增益1通信方向期望0.5 w_mvdr A \ target; % 解线性方程严格MVDR还要加一个对角加载项防止矩阵奇异。仿真里我在构造协方差矩阵时加了一个小单位阵效果更稳定。这两组权重我都保留下来最后对比波束方向图。3.4 绘制方向图主瓣、零陷和旁瓣直接可视化绘制方向图是检验权重最直观的方式。用下面的代码可以一次画出匹配滤波和MVDR的对比pattern_mf abs(w_mf * a(theta)).^2; pattern_mvdr abs(w_mvdr * a(theta)).^2; figure; plot(theta, 10*log10(pattern_mf/max(pattern_mf)), LineWidth, 1.2); hold on; plot(theta, 10*log10(pattern_mvdr/max(pattern_mvdr)), LineWidth, 1.2); grid on; xlabel(角度/°); ylabel(归一化方向图增益/dB); legend(匹配滤波, MVDR); xlim([-90 90]); ylim([-40 0]);画完这张图能立刻看到匹配滤波在30°方向增益仍然很高而MVDR会在30°附近形成一个凹陷甚至零陷。这个零陷意味着通信数据不会严重干扰雷达方向的探测。雷达方向0°的主瓣增益两者几乎一样。这就是波束成形在DFRC里最直观的价值——它把一个空间复用问题变成了几个方向的增益控制问题。4. 通信接收端与雷达接收端的镜像处理4.1 通信接收解调、星座图与EVM发射信号经过波束成形之后通信用户方向接收到的信号可以近似为r_com a(theta_com)^H * w * x_radar n由于我们已经在权重中把通信方向的增益设定为指定值接收端只需要做相关解调。BPSK调制的信息体现在权重的相位扰动里所以解调时先估计出等效信道相位再对接收信号做共轭相乘% 假设已知通信方向导向矢量 h_eff a(theta_com) * w; % 等效信道 r_com h_eff * x_radar 1e-3 * randn(size(x_radar)); % 用导频序列估计相位 phase_est angle(r_com(1:64)); % 64个导频符号 % 解调得到比特 rx_bits real(r_com .* exp(-1j*phase_est)) 0;实际仿真中我会加入一个前导序列先把信道估计出来再做数据段解调。星座图画出来可以看到两组点理想情况下集中在I轴正负两侧EVM越小点越聚拢。BPSK对相位噪声比较容忍但我还是建议在通感一体化场景中用BPSK起步因为它能把“通信是否工作”这个问题和“复杂调制能否解调”分开排查。4.2 雷达接收匹配滤波与二维FFT测距测速雷达接收端要模拟的是目标回波。我把目标放在距离50m、速度20m/s的位置。发射波形经过波束成形后到达目标再乘上目标反射系数、加上双程延迟和多普勒频移。接收阵列可以认为是一个单天线接收也可以用阵列接收但为了简化我先按单通道处理重点看波形质量。距离维处理的核心是匹配滤波x_mf ifft(fft(r_radar) .* conj(fft(x_radar))); [~, idx] max(abs(x_mf)); range_est idx * c / (2 * fs);多普勒维则通过对64个脉冲的峰值相位做FFT来估计速度velocity_axis (-snapshots/2 : snapshots/2-1) * lambda / (2 * Tp * prf); doppler_spectrum fftshift(fft(phase_history));这步做完你会发现即使通信数据的相位扰动叠加在了雷达波形上匹配滤波仍能给出清晰峰值只是旁瓣会比理想LFM略高。这正好验证了“波束成形做空间隔离之后波形自身还有一定的容忍度”。4.3 双功能系统的联合验证流程仿真跑通后我建议把验证流程固定成三步避免调试时反复改代码。第一步先关闭通信数据只跑雷达接收确认测距测速结果准确第二步把通信数据打开调整相位扰动幅度再看雷达方向图有没有明显变形第三步固定雷达和通信参数扫不同信噪比画出通信BER曲线和雷达检测概率曲线。三步走完才算把一套DFRC仿真链路彻底验收。我自己第一次做的时候直接跳到了第三步结果误码率奇高、雷达峰值也找不到排查了一整天才发现是权重初始化写错了。所以顺序很重要先用单功能校验环境再做融合。5. 仿真结果判读四类图的隐藏信息5.1 波束方向图除了主瓣还要看零陷深度方向图是首张必看的图。匹配滤波在通信方向的增益约0.8MVDR把它压到0.1以下这就是零陷深度。零陷越深通信数据对雷达的干扰越小但代价是其他方向可能出现较高的旁瓣。我见过不少初学者只看主瓣完全忽略旁瓣结果被人一问就露馅。正确做法是记录三个指标主瓣增益、通信方向零陷深度、最大旁瓣高度。这三个数一起写进仿真报告的结论里。5.2 模糊函数或自相关旁瓣对于雷达功能不要只看测距峰值要画出模糊函数或者至少画自相关函数。LFM的自相关主瓣很窄但旁瓣会呈现辛格函数形状第一旁瓣约-13dB。加了窗函数后旁瓣降低但主瓣展宽。DFRC里通信数据的随机相位扰动会抬高旁瓣所以自相关图能直观反映通信对雷达性能的“污染程度”。我常用一个指标在主瓣3dB宽度的两倍之外统计旁瓣平均值有没有比单纯LFM高3dB以上。5.3 通信误码率曲线与理论对比在一根坐标轴上画仿真BER和理论BPSK的BER曲线如果两者接近说明通信链路模型正确如果仿真BER明显高于理论就去检查是不是通信方向的波束增益不够或者雷达回波混入了通信接收端。这一步很关键因为很多时候波束成形权重看起来没问题但实际接收信噪比因为量化误差或相位扰动而下降只有BER曲线能暴露问题。5.4 Pareto权衡曲线雷达与通信的折中最后一张图我建议画“通信方向可达速率 vs 雷达峰值旁瓣比”的Pareto曲线。做法是让相位扰动幅度从0扫到pi/4每取一个值就重新计算权重、得到一组雷达旁瓣和通信信噪比。画出来就是一条向左下凹的曲线。它直观地告诉别人DFRC没有免费午餐通信数据加得越多雷达旁瓣越高。这张图是答辩和汇报时最有说服力的结果之一。6. 我踩过的坑与Matlab调参建议6.1 阵元间距不要拍脑袋有一阵我把阵元间距改成0.6波长理由是想让波束更窄。结果方向图在±40°附近出现两个和主瓣一样高的大旁瓣差点以为代码写错了。后来回忆起来是栅瓣问题间距大于半波长导向矢量在不同角度产生相同的响应。如果你要增大孔径提升角度分辨率正确做法是增加阵元数而不是拉大间距。否则你就得接受方向图出现模糊。6.2 仿真发散时先查矩阵条件数MVDR权重有时候会输出非常离谱的值方向图像噪声。这通常是矩阵接近奇异。我遇到的情况是通信方向和雷达方向只差3°两个导向矢量高度相关导致矩阵条件数达到10^16。解决办法非常简单在协方差矩阵上加一个0.1I的对角加载条件数马上降到10^4量级。这个经验在做自适应波束成形时尤其重要不要一看到奇异矩阵就怀疑算法。6.3 并行池与大数据内存问题仿真如果扫很多信噪比点很多人会开parfor。但波束成形仿真里有个隐蔽问题如果每个worker都要重新计算导向矢量内存占用会成倍增加。我建议先在parfor外把导向矢量矩阵、权重矩阵预计算好用基类数组广播进去否则内存溢出是家常便饭。另外绘图函数figure不能出现在parfor里否则每个worker都会弹一个窗口又慢又乱。6.4 Matlab版本、工具箱与中文注释乱码做这个仿真建议用R2020b以上的Matlab因为phased.LinearArray、phased.LFMWaveform这些对象式接口更流畅。老版本用函数式接口也能跑但代码可读性差很多。中文注释乱码是老问题我在R2023a里遇到过一次解决方案是统一把脚本用UTF-8编码保存并在Matlab预设里把语言和区域改成UTF-8。别用Windows记事本默认的ANSI编码去编辑.m文件这是乱码的头号来源。还有导出方向图图片用exportgraphics(fig, pattern.png, Resolution, 300)比print函数更不容易出现字体错位。最后补一个小技巧权重向量算完之后检查一下各阵元功率是否接近恒模。实际射频功放要求恒模发射如果某些阵元权重幅值偏差过大硬件很难实现。仿真里可以先做一步功率归一化也可以加恒模约束重新优化。这个小细节在论文评审和工程评审里经常被问到提前处理会显得你考虑得很完整。