☰
基于Matlab的双功能雷达通信系统波束成形仿真实现
2026/10/19 5:09:18 网站建设 项目流程

1. 项目概述与整体技术架构

先说说这个项目到底在做什么。波束成形、双功能雷达与通信系统,这两个词放在一起,说白了就是让同一套天线阵列,同一套发射波形,同一套硬件平台,同时干两件事:一是像传统雷达那样探测目标,测距、测速、测角;二是像通信基站那样向下行用户传数据。这种被称为DFRC(Dual-Functional Radar-Communication)的系统,这几年在车载感知、无人机集群、频谱受限场景里特别受关注。我做了一个基于Matlab的完整仿真,从发射波形生成、阵列加权、目标回波建模,到通信接收机解调和性能评估,把整条链路都跑通了一遍。

这个仿真适合谁?如果你是做雷达信号处理或者通信基带算法的同学,想搞明白波束成形如何同时服务两个任务;如果你是刚入门阵列信号处理的工程师,想找一个能直接复现、能调参、能出图的Matlab工程;或者你只是在准备课题答辩,需要一套完整的仿真框架作为平台基础,那么这个项目的思路和关键代码都值得看一遍。下面我把整个设计和实现过程拆开讲,包括为什么选这套系统模型、两类波束成形方案怎么取舍、发射信号怎么同时兼顾雷达探测和通信调制,以及我在实际调试中踩过的那些坑。

先给一个整体框架图景。发射端产生一串复合波形,既包含雷达需要的线性调频成分,又包含通信需要的调制符号序列,然后经过波束成形加权映射到各阵元;信号在空间传播,一路打到目标上产生反射回波,由雷达接收机做匹配滤波和参数估计;另一路直接被通信接收端接收,做同步、解调、误码率统计。整个物理层链路在Matlab里用阵列响应矩阵、信道矩阵和收发端处理函数串联起来,所有模块都可以单独替换参数,方便做各种对比实验。

2. 波束成形核心原理与方案选型

2.1 阵列为什么能“指哪打哪”

这里得把波束成形的基本原理交代清楚。一个均匀线阵,阵元间距为d,载频对应的波长为λ,如果目标或者通信用户位于偏离阵面法线θ的方向,那么相邻两个阵元接收到的信号会因为波程差产生一个固定的相位差,这个相位差就是2πd·sin(θ)/λ。阵列处理的核心思想,就是通过给每个阵元施加合适的复加权系数(幅值和相位),让阵列在某些方向形成同相叠加、输出能量最大,而在其他方向互相抵消、输出被抑制。

生活化类比一下:这就像一队人站成一排,大家一起喊口号。如果所有人同时张嘴,声音只往正前方加强;如果每个人根据自己想对准的方向,人为错开一丁点发声时间,那么远处某个方位的人听到的声音会因为“同时到达”而特别响亮,其他方位则可能因为到达时间参差不齐而听不太清楚。阵列里的相位加权,就是给每个阵元人为制造“发声时间差”。

在Matlab里,先建好一个方向矢量(steering vector),它的第m个元素是exp(j·2π·(m-1)·d·sin(θ)/λ),m从1到M,M是阵元数。这一步是整个波束成形仿真的地基,后面所有加权、方向图、赋形全都建立在它之上。

function a = steering_vector(M, theta, d_lambda) % M: 阵元数 % theta: 目标方向,单位弧度 % d_lambda: 阵元间距相对于波长的倍数,通常0.5 m = (0:M-1).'; a = exp(1j * 2 * pi * d_lambda * m * sin(theta)); end

我实际开发中经常用theta = 0时得到的均匀权来做基准波束,然后用自适应加权做对比。两种结果摆在一起,方向图的差异非常直观。

2.2 CBF与MVDR风格的加权方案怎么选

仿真里我做了两套波束成形方案,一套是经典波束形成器(Conventional Beamforming,CBF),另一套是基于最小方差无失真响应思想的MVDR风格自适应波束形成(Minimum Variance Distortionless Response,CBF方案就是直接把所有阵元幅相置为相等,主瓣指向需要角度的方向;MVDR方案则在约束期望方向增益为1的前提下,最小化阵列输出总功率,相当于在干扰方向自动形成零陷。

为什么两套都要做?因为双功能场景下这两类方案各有不可替代的作用。CBF实现简单、性能稳健,在天线增益和主瓣宽度上都有解析表达式可以验证,适合做理论基准。MVDR在存在干扰或者通信用户方向与雷达目标分离时,能明显改善信干噪比,但它的代价是:协方差矩阵估计不准时会发疯,出现主瓣畸变、零陷偏移这些毛病。仿真里我人为加入了一个强干扰源,对比两种方案的输出SINR和方向图,差距非常明显。

MVDR的核心权重计算只有三行:

Rxx = X * X' / L; % 样本协方差矩阵,L是快拍数 a = steering_vector(M, theta_d, 0.5); w_mvdr = (Rxx \ a) / (a' * (Rxx \ a));

注意里面用了矩阵左除而不是直接求逆,这是数值稳定性上的一个细节,在后面排查章节会具体展开。

2.3 雷达探测与通信传输如何共享同一个发射链路

这是整个项目里最具挑战性的部分。雷达想要的目标特性(高距离分辨力,波形能量集中于探测方向)和通信想要的信息吞吐(携带调制信息,方向图匹配用户位置)在物理层面是对同一份发射功率的竞争。

我采用的方案是将发射波形在时域上分成两类信号源的加权叠加。发射信号模型可以写成:

s(t) = α·s_radar(t) + β·s_comm(t)

其中s_radar(t)采用雷达常用的线性调频信号,s_comm(t)采用经过调制的通信符号序列,α和β是功率分配系数,满足α²+β²=1。这样的好处是结构清晰、实现简单,雷达接收机可以用匹配滤波器直接处理LFM成分,通信接收机则只关心调制符号序列。

当然还有其他共存方式,比如子载波分配、OFDM一体化波形、慢时间编码等,但作为仿真平台的起步版本,时域叠加方案最容易调通、最方便加注释、也最方便做参数扫描。后续如果要扩展,完全可以在同一个框架里换发射波形生成函数。

3. 发射端信号生成与阵列加权实现

3.1 发射波形怎么生成和拼接

发射端的Matlab实现我分三步写。第一步生成雷达分量,也就是一组线性调频脉冲,中心频率fc,调频斜率K,脉宽Tp,带宽B = K·Tp。第二步生成通信分量,把随机的BPSK或者QPSK符号序列脉冲成形后,调制到载频上。第三步是功率合成,按照α和β的权重把两路信号叠加成一个复合基带波形,再通过上变频到射频。

线性调频信号在Matlab里生成相当直接:

fs = 20e6; % 采样率 Tp = 10e-6; % 脉宽 B = 4e6; % 带宽 t = (0:round(Tp*fs)-1) / fs; K = B / Tp; s_radar = exp(1j * pi * K * t.^2);

通信符号序列的生成需要注意符号速率和采样率的匹配。假如符号速率Rs = 1 MHz,每个符号对应的采样点数就是fs/Rs = 20。把随机比特映射到星座点之后,用sinc成形或者矩形脉冲成形做一个速率匹配插值,再与雷达分量对齐长度。

信号拼接的时候有个容易被忽略的点:雷达脉冲是周期重复的,通信符号是连续流的,两者在时间上逐点相加之后,总长度以较长的那个为准。我用一个公共时间轴来生成两路信号,再把不足的部分补零,保证最终发射矩阵的尺寸一致。

3.2 阵列加权与发射方向图计算

有了复合基带信号之后,下一步就是波束成形加权。假设一共有M个阵元,期望波束指向theta_t,那么第m个阵元的发射信号就是s(t)乘以第m个加权系数w_m。CBF下w_m就是exp(j·2π·(m-1)·d·sin(theta_t)/λ),MVDR下w_m由前面算出的w_mvdr给出。

发射方向图的计算方法是:对一系列观察角度theta_obs,计算每个角度的导向矢量a(theta_obs),然后做a(theta_obs)'·w的模平方,归一化到最大值后用dB画出来。这里比较关键的是观察角度的范围,通常从-90度到90度,步进0.5度或者1度,太小会拖慢仿真,太大则方向图曲线不够平滑。

功率分配因子对方向图本身没有影响,因为方向图是归一化后的相对增益,但功率分配会直接决定探测信噪比和通信信噪比。我测试下来,α从0.6到0.8之间,雷达回波的信噪比足够做匹配滤波峰值检测,通信的误码率也还能保持在可接受范围。如果α超过0.9,通信链路基本就废了,星座图糊成一团。

3.3 目标回波与通信信道的建模方式

雷达回波的建模相对朴素,但很管用。给定目标距离R和径向速度v,双程时延τ = 2R/c,多普勒频移fd = 2v·fc/c。接收回波就是发射信号经过时延和多普勒调制后的版本,再叠加一个复高斯白噪声。对于只有一个点目标的场景,Matlab实现就是在发射信号的时间轴上做插值平移,再乘一个exp(j·2π·fd·t)的相位因子,最后加到接收端。

通信信道则复杂一点。除了自由空间路径损耗,我加了一个莱斯衰落信道,以模拟存在直射径和若干散射径的移动环境。信道矩阵H的维度是接收天线数乘以发射阵元数,在仿真里直接调用通信工具箱的函数生成,或者手写一个多径抽头模型也可以。为了和雷达回波共用同一套阵列发射信号,通信信道输入是各阵元发射信号经加权后的完整阵列信号,输出是接收端天线上的叠加信号。

通信接收机这边,我先做相干解调前的同步:用已知的前导序列做相关峰值检测确定符号起点,然后去载波、匹配滤波、抽样判决。这一套流程单独跑的时候很顺利,但和雷达回波在同一个仿真里并行跑时会遇到时间基准不一致的问题,后面会说到。

4. 接收端信号处理与性能评估体系

4.1 雷达通道的匹配滤波与距离估计

雷达接收端处理的第一件事是距离压缩,也就是匹配滤波。匹配滤波器本质上是发射信号的时间反演共轭,当接收回波中包含发射波形的延时副本时,滤波器输出会在延时处出现峰值,峰值位置对应目标距离。脉冲压缩后的输出可以用一条命令完成:

y_mf = xcorr(rx_radar, conj(flipud(s_radar)));

然后对匹配滤波输出的模值做峰值搜索,取最大峰对应的索引换算成时延,再乘上c/2得到距离估计值。在只有单目标、信噪比大于0dB的条件下,测距误差通常可以控制在距离分辨力单元格以内。

值得注意的是,匹配滤波前需要先做下变频。仿真里我在中频或者基带处理,所以发射信号和回波都表示为复基带信号,最后的匹配滤波也是复基带的卷积。如果在射频域直接处理,采样率要求会高得离谱,Matlab仿真根本扛不住。这是做系统级仿真时特别需要注意的折算关系。

4.2 通信通道的解调与误码率统计

通信接收链路的核心指标是误码率。实现路径是:接收信号经过同步和信道均衡后,先做匹配滤波得到符号估计,再映射回比特流,与原始发射比特比对,统计错误比特占比。BPSK调制下,符号判决就是看实部符号:

rx_symbols = rx_filtered ./ channel_est; % 简单单抽头均衡 bits_est = real(rx_symbols) > 0; ber = sum(bits_est ~= bits_tx) / length(bits_tx);

这里channel_est是从前导序列估计出来的复合信道增益,包含幅度和相位。如果信道是时变的,还要一个自适应均衡器,但第一版仿真我直接用块内的平均信道估计,在低速运动场景下误差不大。

误码率统计要注意,发射比特和接收比特必须做精确的比特对齐。我在发射端就把已知的帧结构定义好,接收端先用帧同步序列定位帧头,再抽取数据位,否则误码率会算出一个没有意义的数字。

4.3 性能指标如何构建和呈现

一套仿真不能只出一个图就完事,需要多维度评估。我构建了四类指标:

  • 发射方向图:衡量波束指向精度、主瓣宽度、旁瓣电平,这是波束成形方案最直观的检验。
  • 雷达探测性能:匹配滤波输出峰值与噪声底之比,以及距离估计误差随信噪比的变化曲线。
  • 通信链路性能:不同信噪比下的误码率曲线,和理论BPSK曲线做对照。
  • 系统级折中:同样一组发射参数下,雷达可探测距离和通信数据速率之间的此消彼长关系。

这些指标在实际仿真中以图和数值统计两种形式输出。图用来直观比较,数值统计用来写结论。我做参数扫描时会自动跑多组信噪比,把BER曲线集中画在一张图上,看起来非常清晰。

5. 关键仿真参数设置与实验结果

5.1 仿真的初始参数从哪里定

初始参数的选择是整个仿真能否快速收敛到有意义结果的关键。载频我选了常用的C波段,取fc=5.6GHz,这个频段雷达和通信都有大量应用参考。阵元数选8,因为8个阵元对应的主瓣宽度(约2/(M·d/λ)弧度)足够窄,能在方向和位置上都体现出波束成形的效果,同时计算负担不大。阵元间距取半波长,既能避免栅瓣又能在-90度到90度的扫描范围内保持方向图唯一性。

雷达分量设置带宽4MHz、脉宽10μs,对应的距离分辨力约37.5米,对单目标场景来说绰绰有余。通信分量设置码速率1MHz,BPSK调制。功率分配因子α取0.7,通信功率占三成,这样雷达主功能不退化,通信误码率也还能跑出曲线。

这些参数不是拍脑袋定的,我算过一组:8阵元线阵半波长间距,主瓣宽度约12.7度;4MHz带宽的LFM信号,脉压增益约为时间带宽积40,也就是16dB的处理增益。有了这些底数,下面的仿真结果才有解读依据。

5.2 两类波束成形方案的对比结果

CBF和MVDR的对比我是这样做的:目标方向设为0度,通信用户位于20度,另外人为设置一个30度方向的强干扰。CBF方向图只在0度有一个主瓣,30度方向没有明显零陷,干扰信号会被正常接收,输出信干噪比明显下降。MVDR则在30度方向形成了深度超过40dB的零陷,同时保持0度增益为1,输出信干噪比大幅提升。

方向图对比图出来之后,两条曲线的差异一目了然。不过MVDR有一个副作用需要注意:零陷的引入会略微展宽主瓣、抬高部分角度区间的旁瓣,特别是在协方差矩阵估计误差较大时,方向图会出现不规则的起伏。这个现象在仿真结果里很明显,也提醒了我在实际工程里使用自适应波束时,一定要加对角加载来增加稳健性。

对角加载就是在协方差矩阵的对角线加一个小量,等效于给噪声基底一个下限,能有效抑制由于有限快拍和数值误差导致的权值爆动。对角加载因子我取噪声功率的0.1倍,方向图畸变基本消失,零陷深度还有30dB以上,这个经验值可以直接给其他人复用。

5.3 雷达与通信双任务的联合性能权衡

把雷达通道和通信通道放在同一张图上评估,看到的趋势很有信息量。当α从0.5增加到0.9时,雷达回波信噪比稳步上升,距离估计误差显著下降;但通信星座图的EVM(误差矢量幅度)持续恶化,误码率从10⁻⁴量级飙升至10⁻²量级。在α=0.7附近,两者相对均衡。

另一个有意思的现象是空间维度的折中。如果把波束指向放在目标和通信用户之间的某个折中角度,两边都能获得一定增益但都不高。反过来,用双波束设计把功率分成两路,分别指向两个方向,代价是每路功率减少,但方向增益可以保持。这两种思路在仿真里我都做了测试,结果说明:双功能系统性能的上限不完全由硬件决定,更多由波形设计和空间自由度分配决定。

速度测量我这次没有深挖,因为双功能系统的动目标检测值得单独开一章。不过仿真里多普勒处理的链路是搭好的,脉冲串做FFT就可以提取速度维信息,后续要扩展很容易。

6. 实操过程与突发问题排查实录

6.1 方向矢量写错导致的波束指向偏移

这是我最先踩到的一个坑。第一次跑方向图,设定的目标方向是30度,但峰值出现在大约30.5度的位置,而且主瓣形状不对称。排查后发现是方向矢量公式里的sin函数角度单位搞错了:Matlab的sin默认输入弧度,我传人角度却忘了做deg2rad转换。就这样一个单位问题能让整个方向图偏移好几个度。

修正之后主瓣峰值精确落在30度。这其实是个很好的反面教材:阵列处理的精度完全依赖数学公式的每一步实现,角度单位、d/λ数值、阵元索引从1还是0开始,都会造成系统的、不易察觉的偏差。我的建议是核心函数写完之后,先用解析式验证。比如已知均匀线阵在机械角度0度应该产生最大增益,跑一个简单测试,看峰值是否在0度;再做扫描角度是否与计算值一致。这种五分钟的验证能省下后面无数调试时间。

6.2 功率分配与归一化陷阱

发射信号这部分还有一个典型问题:不归一化就会导致信号幅度失真、后端误码率异常。最开始我用s = alpha·s_radar + beta·s_comm直接相加,然后发现通信星座图整体偏大或偏小,均衡后仍不稳定。原因很简单:功率分配系数α和β是对功率的比例关系,但信号相加发生在电压域,需要对信号做有效值归一化后再分配。

正确做法是先分别归一化s_radar和s_comm的平均功率到1,再按系数分配:

s_radar = s_radar / rms(s_radar); s_comm = s_comm / rms(s_comm); s_tx = alpha * s_radar + beta * s_comm;

这样s_tx的总功率正好是α²+β²=1,并且保证两路分量在功率维度上精确按比例分配。如果不做归一化,两个信号源有效值差一个量级,那功率分配相当于失效,雷达和通信的性能曲线都会变得不可解释。

6.3 协方差矩阵求逆不稳定的处理

MVDR权重计算中,最让人头疼的问题是Rxx矩阵可能是病态的。特别是快拍数少、信噪比高、存在强相关干扰时,Rxx的条件数很大,普通inv函数得到的逆矩阵会有严重的数值误差,导致波束方向图出现毛刺甚至完全失灵。

我实际处理的办法有两个。一个是用matlab的左除算子替代显式求逆,因为左除在求解线性方程组时做了更稳定的数值分解。另一个就是在Rxx对角线加入小量对角加载。代码实现非常简单,加一行即可:

Rxx_loaded = Rxx + 0.1 * mean(diag(Rxx)) * eye(M);

这一行的效果非常显著,权值模值不再爆炸,方向图稳定可用。从理论上解释,对角加载等效于给协方差矩阵施加了一个正则化约束,约束解的二范数不能过大,这正是自适应波束在低样本数场景下最需要的稳健性。

6.4 匹配滤波峰值搜索与时间同步偏差

雷达和通信两个接收链路在同一个仿真里运行,最容易出现的就是时间基准不同步。雷达的匹配滤波输出峰值和通信的符号定时同步各自做相关运算,但两套相关用的参考信号长度不同、采样点起始位置不同,如果不统一时间基准,联合指标就会出现错位。

我的解决办法是建立一个全局时间轴数组,从第一个脉冲起点开始到最后一个通信符号结束为止,所有信号的采样点都对应全局时间的索引。雷达回波的时延从全局时间轴换算,通信符号起始位置也从全局时间轴定位,两个通道的结果就严格对齐了。这种方法在小规模仿真里看似多此一举,但一旦做多目标、多用户、多脉冲扩展,时间基准统一与否会直接决定算法能否收敛。

6.5 常见问题速查表

故障现象常见原因处理办法
方向图峰值偏移角度单位弧度/角度混用统一用deg2rad转换,写进函数注释
方向图出现多个高旁瓣阵元间距大于半波长设置d_lambda=0.5,检查阵列参数
MVDR输出畸变协方差矩阵病态使用左除+对角加载
通信误码率居高不下发射与接收符号未对齐用帧同步序列做相关定位
距离估计整体偏移匹配滤波峰值索引换算错误验证时延=峰值索引/采样率是否合理
仿真内存溢出采样率过高、脉冲数过多降低采样率或分段处理脉冲簇

其中阵列间距的问题我要多说一句。仿真里我教育自己用过d_lambda = 0.8,结果方向图上在某个角度出现了栅瓣,乍一看还以为是目标副瓣。这就是物理上栅瓣现象的直接体现,当观察角度满足sin(theta) = m·λ/d时,所有阵元信号再次同相叠加,形成与主瓣等高的假目标。实际系统里这会带来严重的多径虚警,务必避免。

7. 性能优化与后续扩展方向

7.1 仿真效率和参数扫描的优化

第一版仿真直接在Matlab脚本里循环跑,跑一个完整的信噪比扫描要几分钟。后来我把内层循环向量化,发射信号生成和阵列加权改成矩阵运算,速度提升了近十倍。经验是:Matlab环境下,凡是能用矩阵乘法解决的都不要用for循环;凡是能提前分配内存的都不要动态增长数组;凡是能用局部函数的都不要在循环里重复计算导向矢量。

参数扫描我建议用结构体统一管理所有参数,然后写一个扫描函数接收参数结构体做核心仿真。这样每次跑一组参数,只需要修改结构体字段,输出结果自动保存在一个结果字典里,再做图或者统计就非常方便。这种组织方式也方便以后做蒙特卡洛实验。

7.2 从单目标到复杂场景的演进方向

目前的仿真只支持一个点目标、一个通信用户、一个干扰源。实际雷达场景要复杂得多,至少要考虑多目标回波叠加、目标的起伏特性、以及地面杂波。扩展方向很清晰:

  • 多目标:回波通道改成多个时延-多普勒分量的叠加,匹配滤波后做多峰值检测。
  • 目标起伏:引入Swerling I/II型起伏模型,让目标截面积随脉冲变化,评估检测概率。
  • 杂波:在距离-多普勒域添加服从特定分布的面杂波,测试优化检测器的效果。
  • 多通信用户:发射端用空分多址,把不同用户分配到不同波束方向,用同一功率同时服务多个用户。

这些扩展都不需要推翻现有框架,只需在信道模型和接收处理两个模块里做增量开发。波束成形方向图方面的进一步验证,还可以加入波束赋形优化算法和干扰对消模块,这在小规模阵列上效果明显。

7.3 用理论值校验仿真结果的技巧

我在仿真过程中始终保留一个重要习惯:把仿真结果和理论值放在同一张图里比较。比如通信误码率的BPSK理论公式是BER = 0.5·erfc(sqrt(SNR)),点对点链路仿真结果应该与理论曲线基本吻合;一旦偏差较大,不是信道建模有问题就是均衡没做好。

阵列处理方面也有解析值可以比对:均匀线阵的主瓣宽度、峰值旁瓣电平,理论上有近似公式。CBF方向图的第一旁瓣电平约为-13.5dB,仿真结果应该在这个值附近。如果偏太多,基本可以确定是加权系数或方向矢量公式有错误。拿理论值校验仿真不是对自己的不信任,而是给复杂系统提供一套快速免疫测试,能在早期发现问题,避免把错误带到后续模块。

8. 一点实际操作中的体会

整个项目做下来,我最深的体会是:双功能雷达与通信系统真正难的不是单独搞定雷达信号处理,也不是单独搞定通信链路,而是让两套系统在同一个波束成形框架下互相妥协、互相配合。Matlab仿真最大的优势是能快速看见这种妥协关系:功率分配因子往雷达偏一点,通信星座图立刻变差;往通信偏一点,雷达目标检测的噪声底马上变高。这种全局视野,是纯理论推导很难获得、纯硬件实验又很难快速试出来的视角。

如果你打算拿这个课题继续做下去,我的建议是从两个方向入手。一个是把发射波形做得更聪明,用波形分集或者编码调制把雷达和通信信息融合到同一个波形的时频结构中,这样功率分配就不再是零和游戏,两个任务的性能上限会同时抬升。另一个是把波束成形的调度策略做活,在雷达扫描模式和通信传输模式之间动态切换,甚至用一个优化器来决定当前时刻波束该指向哪里、该给哪条链路多少功率,这就会自然过渡到智能感知与通信一体化的研究方向。

最后分享一个写仿真时的小技巧:在所有关键函数开头加一个参数校验块,比如检查阵元数是否为正整数、d_lambda是否在0.5附近、功率分配系数平方和是否近似为1。这些校验在开发初期看起来是浪费时间,但等到你连续改了一百个参数、忘记某个变量含义的时候,这些校验就是帮你保持头脑清醒的坐标轴。我至今记得有一次因为把采样率从20MHz改成25MHz,却忘了同步调整通信符号的过采样倍数,结果误码率曲线突然变成一条直线,排查了好久才定位到是速率匹配出错。这类问题,如果一开始就有完善的自检机制,几分钟就能揪出来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询