资讯动态

MATLAB相控阵雷达仿真:从波束形成到目标探测全流程实战

发布时间:2026/10/9 17:41:02 来源:尧图企业网站定制
1. 相控阵雷达到底控的是什么先弄懂波束形成的物理逻辑很多人一提到相控阵雷达第一反应是那个天线不用转就能扫的雷达。这句话对但只对了一半。相控阵真正厉害的地方不是不用转而是它能在微秒级时间内把波束指向任意方向同时做搜索、跟踪、多目标照射——机械转动根本做不到这种响应速度。那它凭什么呢凭的是干涉。先回忆一个中学物理实验水面上两个波源同时振动某些方向波峰叠波峰波高翻倍某些方向波峰撞波谷互相抵消。相控阵雷达的原理就是这件事的宏观工程化版本。阵列里每个阵元发射同一频率的电磁波但因为每个阵元的馈电相位不同电磁波在空间中某个方向同相叠加形成高增益主瓣在其他方向因为相位错乱而相互抵消增益被压得很低。这个人为控制相位差、让波束指向特定方向的过程就是波束形成。关键点来了波束指向由相位差决定而不是由天线朝向决定。只要把每个阵元的移相器调到一个特定状态波束就能指向某个角度再把移相器全部重调一遍波束立刻跳到另一个角度。这个纯电控过程就是电扫。在MATLAB里做仿真核心就是把这个物理过程翻译成数学表达式。一个均匀线阵ULA有N个阵元阵元间距d入射/发射方向与法线夹角为θ那么相邻阵元之间的空间相位差是Δφ 2π·d·sin(θ) / λ这个公式是所有仿真代码的地基。后面不管是方向图、扫描角、波束宽度还是副瓣电平全都从它推导出来。我在最初做仿真时犯过一个错误直接把相位差当成了移相器度数结果方向图主瓣指向完全错误。后来才意识到移相器的物理量纲是相位弧度或度而相位差对应的是空间路径差引起的电长度差两者必须通过波长换算。这个细节建议初学者先画个几何草图把斜入射的波程差画出来再对照公式看一遍会清楚很多。仿真环境上我用的是MATLAB结合Phased Array System Toolbox也就是相控阵系统工具箱。如果只有基础版MATLAB也能写纯脚本实现只是需要自己处理坐标系、阵元响应、信号模型这些底层逻辑工作量大不少。有工具箱的话很多函数可以直接调用比如phased.URA创建阵列、phased.SteeringVector计算导向矢量、phased.ArrayResponse计算阵列响应。需要注意的是工具箱函数默认坐标系是局部坐标Local Coordinate System阵列法线方向是正x轴而很多人习惯用正z轴作为法线方向仿真时如果不统一坐标系后面所有角度都会对不上。2. 仿真第一步搭一个看得见的均匀线阵模型搭建阵列模型是整个仿真的地基。地基歪了后面所有结果都不可信。先定义基础参数。假设仿真频率是10GHz对应波长λ 0.03m光速除以频率阵元间距d取半个波长即0.015m。为什么取半波长因为间距超过一个波长会出现栅瓣——波束在多个方向同时出现这会严重干扰目标探测。半波长是一个工程上的折中既能避免栅瓣又能保证足够的孔径长度。阵元数N取16。阵元数直接决定波束宽度波束宽度大约正比于λ / (N·d·cosθ)N越大波束越窄角分辨率越高。16个阵元在10GHz下的波束宽度大约6度左右对于演示和教学完全够用。如果后面要仿真高精度测向可以考虑32甚至64阵元但计算量会明显增加。% 基础参数设置 c 3e8; % 光速 freq 10e9; % 工作频率 lambda c / freq; % 波长 d lambda / 2; % 阵元间距 N 16; % 阵元数量 % 使用工具箱创建均匀线阵 ula phased.ULA(NumElements, N, ElementSpacing, d, ArrayAxis, y);这里有个容易忽略的细节ArrayAxis参数。工具箱默认的线阵沿y轴排列但很多人脑海里画的是沿x轴排列的阵。如果这个参数设置不对后面算方向图时角度轴会莫名翻转排查起来非常费时间。创建完阵列下一步是计算和绘制方向图。方向图描述的是阵列在不同方向上的增益响应。先用phased.ArrayResponse计算阵列在某个方向范围内的响应再用极坐标或直角坐标画出来。% 计算阵列响应未加权的均匀激励 ang -90:0.1:90; % 扫描角度范围 resp phased.ArrayResponse(SensorArray, ula, PropagationSpeed, c, WeightsInputPort, true); w ones(N, 1); % 均匀加权 pattern resp(freq, [ang; zeros(1, length(ang))], w); pattern_dB 20*log10(abs(pattern) / max(abs(pattern))); % 绘制方向图 figure; plot(ang, pattern_dB, LineWidth, 1.5); xlabel(方位角度); ylabel(归一化增益dB); title(16元均匀线阵方向图等幅加权); grid on; ylim([-40 5]);运行这段代码你会看到一个主瓣位于0度方向的对称方向图两侧对称分布着副瓣第一副瓣大约在-13.3dB左右。这个-13.3dB是均匀加权线阵的理论值也是个非常著名的雷达常数。如果你画出来的第一副瓣不是这个数说明代码里有问题——最常见的原因是角度轴定义不一致。要加大扫描能力可以对每个阵元施加不同权值。比如使用泰勒加权Taylor Window可以把第一副瓣压到-30dB以下代价是主瓣略微展宽。在相控阵里这就是低副瓣设计的雏形。工程上副瓣电平直接关系到抗干扰能力副瓣越高就越容易被敌方干扰机从旁瓣方向打进来。在继续往下走之前我想强调一件事方向图只是静态快照它描述的是阵列在某一组权值下的响应。但雷达是动态系统波束要扫描、目标要移动、信号要随时间变化。所以静态方向图只是第一道开胃菜真正的核心在于下一步的时域信号生成与波束扫描。3. 从方向图到雷达信号把连续波换成脉冲串相控阵雷达要探测目标发射的不是单纯的正弦波而是一串经过调制的脉冲。为什么因为雷达需要测量目标距离而距离是通过发射脉冲到收到回波的时间差算出来的这就要求发射信号在时间上有明确的标记点。连续波虽然能测速但测距能力天然不足。最常用的波形是线性调频LFMLinear Frequency Modulation脉冲也就是频率随时间线性变化的脉冲。它解决了两个问题一是脉冲宽度不够时探测距离受限能量不够二是脉冲宽度增加时距离分辨率变差时间上分不开。线性调频通过频率编码让宽脉冲拥有窄脉冲的距离分辨率接收端用匹配滤波器把信号压缩回去这就是脉冲压缩技术。在MATLAB里phased.LinearFMWaveform可以方便地生成线性调频波形% 线性调频波形参数 fs 20e6; % 采样率 pulse_width 50e-6; % 脉宽50微秒 prf 10e3; % 脉冲重复频率10kHz sweep_bandwidth 2e6; % 带宽2MHz % 创建波形对象 wav phased.LinearFMWaveform(SampleRate, fs, PulseWidth, pulse_width, ... PRF, prf, SweepBandwidth, sweep_bandwidth, SweepDirection, Up); % 生成单个脉冲 x wav();为什么带宽2MHz很重要因为雷达的距离分辨率δR c / (2B)B是信号带宽。2MHz带宽对应的距离分辨率是75米。如果需要更高分辨率就必须加大带宽。这也是现代雷达普遍采用宽带波形的原因——带宽决定了你看清目标细节的能力。生成单个脉冲之后还要把脉冲串接起来。相控阵雷达的发射机在每个脉冲重复间隔PRI即1/PRF内发射一个脉冲一串脉冲形成脉冲串。多个脉冲的处理增益由相参积累提供如果目标回波在N个脉冲中保持相位相参那么N个脉冲累加后信号幅度增加N倍噪声只增加√N倍信噪比提升10·log10(N) dB。这就是为什么雷达总在说多脉冲积累。% 生成一组脉冲序列 num_pulses 16; pulse_train repmat(x, num_pulses, 1);到这里为止我们只做了阵元发射相同信号这件事。但相控阵的特点在于每个阵元发射的信号要经过不同的相位加权。也就是说第n个阵元发射的信号是x(t)乘以一个复加权系数w_n。这个加权系数包含了移相器的相位值是波束指向的核心。4. 波束指向的计算与误差校正16个阵元各该移多少相位假设我们要让波束指向θ0 20度每个阵元的相位值按前面说的公式计算。设第n个阵元的位置为(n - (N-1)/2)·d那么它相对参考点的相位补偿量是φ_n (2π / λ) · r_n · u其中r_n是阵元位置矢量u是波束指向方向单位矢量。对均匀线阵u [sinθ0, 0, 0]所以相位补偿量简化为φ_n (2π·d / λ) · (n - (N-1)/2) · sin(θ0)这段代码直接生成导向矢量Steering Vector% 目标波束指向角 theta0 20; % 方位角20度 % 构造指向20度的导向矢量 steer_vec phased.SteeringVector(SensorArray, ula, PropagationSpeed, c); sv steer_vec(freq, [theta0; 0]); % 发射加权 tx_weights sv; % 使用加权后的方向图 resp_with_weights resp(freq, [ang; zeros(1, length(ang))], tx_weights); pattern_steered 20*log10(abs(resp_with_weights) / max(abs(resp_with_weights))); % 对比两幅方向图 figure; plot(ang, pattern_dB, LineWidth, 1.2); hold on; plot(ang, pattern_steered, LineWidth, 1.2); legend(0°指向, 20°指向); xlabel(方位角度); ylabel(归一化增益dB); title(波束扫描方向图对比); grid on; ylim([-40 5]);运行后你会发现主瓣确实出现在20度附近但同时主瓣宽度变宽了副瓣也升高了一点。这不是bug是物理规律波束指向偏离法线后阵列的有效孔径投影面积变小有效孔径 物理孔径·cosθ所以波束展宽。θ越大展宽越明显。工程上超过±60度的扫描范围哪怕原理上可行实际增益损失和副瓣恶化都会让人头疼。在仿真中还需要特别注意移相器量化误差。真实的相控阵雷达用的是数字移相器相位不能连续可调只能取2的整数幂个离散值比如4位移相器只有16档每档22.5度。仿真中如果直接用连续相位值会高估波束性能。要模拟量化误差可以把相位量化为最近的离散档位% 4位移相器量化 num_phase_bits 4; phase_quant_step 360 / 2^num_phase_bits; % 提取相位并量化 phase_continuous angle(sv) * 180 / pi; phase_quantized round(phase_continuous / phase_quant_step) * phase_quant_step; sv_quantized exp(1j * phase_quantized * pi / 180); % 量化后的方向图 pattern_quantized 20*log10(abs(resp(freq, [ang; zeros(1, length(ang))], sv_quantized)) / max(abs(...)));量化后的方向图会有一个典型特征主瓣增益略微下降通常不到0.5dB但副瓣电平可能明显抬高尤其在低副瓣设计中量化副瓣往往会成为主导副瓣。这是工程实践和理论仿真之间一个重要的鸿沟仿真里如果完全忽略它后面实测时会被莫名变高的副瓣打个措手不及。5. 目标回波模拟把点目标放进阵列视野里有了发射信号和波束指向接着要模拟目标回波。一个最简单的点目标模型包含三个要素距离、速度、角度。距离决定回波延迟τ 2R / c。速度决定多普勒频移f_d 2v / λ。角度决定回波到达阵列时的波前方向也就是各阵元之间存在的相位差。目标回波的到达角如果与波束指向角一致接收方向图增益最高如果不一致接收增益按方向图衰减。这就引出了相控阵雷达的测角原理发射波束指向某个方向如果这个方向真的有目标回波最强如果目标偏离波束中心回波幅度下降。用一个和波束加差波束的单脉冲体制可以精确估计目标偏离角精度可以达到波束宽度的几十分之一。MATLAB里可以用phased.MonopulseFeed来实现单脉冲馈电但作为基础仿真我们先用最直接的方式理解回波结构。回波的完整仿真流程包括几个环节目标时延、多普勒调制、目标方向上的接收阵列响应、接收机噪声。% 定义目标参数 target_range 7500; % 距离7.5公里 target_speed 60; % 径向速度60 m/s target_angle 19; % 目标角度19度 % 单脉冲时延采样点 delay_samples round(2 * target_range / c * fs); % 多普勒频移 fd 2 * target_speed / lambda; % 构造目标回波基带域处理 t (0:length(x)-1) / fs; doppler_shift exp(1j * 2 * pi * fd * t); pulse_delayed [zeros(delay_samples, 1); x(1:end-delay_samples)] .* doppler_shift; % 叠加接收导向矢量 rx_sv steer_vec(freq, [target_angle; 0]); rx_signal pulse_delayed * rx_sv.; % 16个阵元的接收快拍这里有一个非常容易踩的坑目标距离对应的时延通常不会刚好落在整数采样点上。如果直接取整距离测量会带误差。工程上通常用插值或更精细的匹配滤波器处理来解决亚采样时延。但作为第一次仿真整数采样点足够用来理解整个信号流程。目标信号太弱怎么办接收端通常会对回波做匹配滤波脉冲压缩。在MATLAB里用phased.MatchedFilter对接收信号做卷积就能把线性调频脉冲压缩成窄脉冲信噪比获得处理增益。时域尖峰出现的位置对应目标距离。% 匹配滤波 mf phased.MatchedFilter(Coefficients, getMatchedFilter(wav), SpectrumWindow, Hamming); rx_compressed mf(rx_signal(:, 8)); % 取第8号阵元做脉冲压缩脉冲压缩后的输出峰值位置乘以c/2就是目标距离。如果目标距离7500米你会看到峰值出现在大约500个采样点处。采样率20MHz对应距离采样间隔7.5米所以50微秒脉宽对应7500米正好不多不少。6. 波束扫描与单目标测向把静态仿真跑起来前面的步骤都是静态的——单个波束指向、单个目标场景。但雷达是动态工作的波束要一遍遍扫描整个空域。这一节把波束扫描和测向串起来做一个完整的单目标探测流程。先做一个机械扫描的等价物将波束指向从-45度到45度以1度步进扫描每个指向角度上计算接收信号功率。目标所在方向附近的波束指向会得到最大输出功率这个峰值对应的角度就是目标角度估计值。这正是相控阵雷达顺序波束扫描测向的基础方式。% 波束扫描测角 scan_angles -45:1:45; power_scan zeros(size(scan_angles)); for k 1:length(scan_angles) % 当前扫描角度的接收导向矢量 sv_scan steer_vec(freq, [scan_angles(k); 0]); % 接收信号加权合成 y_beam rx_signal * conj(sv_scan); % 匹配滤波后取峰值功率 y_mf mf(y_beam); power_scan(k) max(abs(y_mf).^2); end % 找峰值角度 [~, idx_peak] max(power_scan); est_angle scan_angles(idx_peak); fprintf(目标角度估计%.1f 度\n, est_angle);如果目标在19度估计结果可能是19度或20度取决于扫描步进。这就是顺序波束扫描的分辨率极限——测角精度受扫描步进和波束宽度双重限制。要提高精度可以在峰值附近做抛物线插值或者改用单脉冲体制。再做一次距离-角度二维地图。沿距离维做匹配滤波沿角度维做波束扫描得到一个二维矩阵用图像形式画出来就是雷达领域常见的Range-Angle图俗称热力图。% 距离-角度二维图 range_axis (0:length(y_mf)-1) * c / (2 * fs); figure; imagesc(scan_angles, range_axis, power_scan); xlabel(角度度); ylabel(距离米); title(单目标距离-角度二维探测); colorbar;图上会看到一个明显亮点位置对应目标的真实距离和角度。这虽然是最简单的雷达检测流程但已经包含了发射-接收-波束形成-脉冲压缩-检测的完整链路。理解这个链路比会调用多少个工具箱函数都重要。在这一步有件事值得反复提醒你用的匹配滤波器是匹配发射波形的但实际接收信号经历了多普勒频移失配会带来一定的信噪比损失。当目标速度很快时失配损失加大需要先用多普勒滤波器组对多个脉冲做处理再进行距离匹配。这是相参处理的开端也是雷达信号处理的精髓所在。真到了多目标场景距离-多普勒二维处理会成为主角。7. 阵列仿真的常见坑与排查思路方向不对时先看哪里做MATLAB相控阵仿真几乎每个人都踩过几个坑。我把我踩过的和帮别人排查过的集中梳理一遍按最可能出现到最隐蔽排序。第一类方向图看起来反了。主瓣应该指向20度结果指向-20度。这多半是坐标系和角度符号定义不一致。工具箱的方位角定义是从x轴正方向起算正角度指向y轴正方向而你画图时可能习惯从法线起算。解决办法统一把角度轴定义写清楚画图前先打印几个特定角度0度、90度、-90度的响应值验证符号。第二类副瓣电平对不上理论值。均匀加权线阵理论第一副瓣是-13.3dB。如果仿真结果是-12dB或-9dB说明可能存在阵元间互耦未建模不对工具箱默认不考虑互耦。更常见的原因是你使用了角度域均匀采样但角度间隔太粗导致峰值没有对准采样点。把角度步进从1度改成0.1度副瓣读数就恢复正常了。第三类脉冲压缩输出很平找不到峰值。这个坑最容易让人懵。原因通常是回波的时延超过了单个脉冲长度。比如脉宽50微秒采样率20MHz一个脉冲有1000个采样点。如果目标距离超过7500米延迟会超过脉冲长度回波主体根本不在当前时间窗内。解决办法先算最大无模糊距离即R_unambiguous c / (2·PRF)。PRF越高最大无模糊距离越短选了10kHz PRF对应的最大距离是15公里目标距离别超过这个值。第四类多普勒频移让脉冲压缩失效。如果目标速度特别大匹配滤波器的参考信号和实际回波频率偏差过大压缩脉冲的高度明显下降甚至出现分叉。解决思路对多个脉冲做FFT分行多普勒通道在每个通道做匹配滤波。这就是range-Doppler处理的标准流程MATLAB里phased.RangeDopplerResponse可以直接调用。仿真时建议先做零多普勒情形验证距离正确后再加多普勒否则两个变量纠缠在一起很难定位问题。第五类数值类型引发精度幻觉。MATLAB默认用double精度但真实雷达接收机是有限字长的。仿真中用double当然没问题但如果模拟的是高动态范围场景比如强杂波里有弱目标double精度下的弱小目标可能依然可见而真实系统中早被量化噪声淹没了。想贴近实际可以用fi对象模拟定点数。排查问题的通用思路就一条逐步隔离变量。先固定目标角度为0验证发射波束和接收波束都正常然后固定目标距离为0让时延为0验证脉冲压缩正确最后加上多普勒验证频移处理。一旦每个模块单独都能工作在预期状态组合起来出问题时就容易定位是哪两个模块的接口对不上。8. 从单阵元到多阵元波束形成的注意力经济很多刚接触相控阵的同学会有个疑问为什么要用那么多阵元单个大天线也能获得高增益啊。答案是单天线做不到同时多波束和自适应抗干扰。阵列的核心优势在于每个阵元接收到的数据是独立的数字波束形成DBF能从这些数据中提取出比单天线丰富得多的信息。举个最直观的例子一个16元线阵每个阵元接收到的信号并排放在一起就是16路数据。如果对这16路数据做加权求和输出一个波束如果换一组权值再求和输出另一个指向的波束。同一份数据可以同时形成多个波束互不冲突。这就是数字波束形成的多波束能力。在机械扫描雷达时代你想同时观测两个方向得让天线在两个方向间来回快速切换在相控阵时代同一个阵列同时盯着所有方向只是给每个方向分配了不同的加权通道。再进一步自适应波束形成可以做到在目标方向保留增益、在干扰方向形成零陷。方法是从接收数据的协方差矩阵出发求解一个最优化权值使得输出功率最小化的同时约束目标方向增益不变。这就是经典的MVDR最小方差无失真响应波束形成器。在MATLAB里实现核心代码不到二十行% MVDR自适应波束形成 rx_multi rx_signal; % 16×N_samples Rxx rx_multi * rx_multi / size(rx_multi, 2); % 协方差矩阵 sv_target steer_vec(freq, [target_angle; 0]); w_mvdr (Rxx \ sv_target) / (sv_target * (Rxx \ sv_target));这段代码里核心是求解线性方程Rxx·w sv_target在干扰方向自然形成零陷。原理听起来玄乎背后其实就是一个思想既然接收到的数据里包含了干扰那就让合成权值主动适应数据把干扰滤掉。这个技术在现代相控阵中已经是标配仿真中要理解它关键是抓住自适应权值是数据驱动的这个本质。从仿真进阶的角度看多波束和自适应处理是相控阵仿真最有价值、也最拉开差距的方向。基础的方向图仿真只体现了波束扫描相当于硬件模拟时代的玩法深入DBF和自适应处理才算真正进入了数字阵列雷达DAR的核心领域。如果时间有限建议优先把这一块吃透无论对理解现代雷达架构还是后续做抗干扰仿真都是高杠杆的知识点。9. 仿真参数选择与代码结构设计的个人建议最后聊一点实际工程习惯这部分不在任何官方文档里但非常影响你的仿真效率和代码复用性。参数设计上建议用一个结构体或者类把所有仿真参数集中管理。比如sim_params.freq 10e9; sim_params.c 3e8; sim_params.fs 20e6; sim_params.prf 10e3; sim_params.pulse_width 50e-6; sim_params.sweep_bw 2e6; sim_params.num_elements 16; sim_params.array_spacing sim_params.c / sim_params.freq / 2;这样做的好处是后续做参数扫描比如对比不同阵元数、不同带宽对分辨率的影响时只需改这个结构体的字段代码主体完全不用动。我见过太多人把参数硬编码散落在几百行脚本里等要改频率时改了三处只改了两处结果出来的图怎么都不对——这种时间和情绪成本一次就够让人吸取教训了。另外推荐把发射模块、接收模块、波束形成模块、检测模块拆成独立函数。即使是脚本式仿真也至少用section分块%%做出边界。相控阵仿真链路长、中间变量多如果全部塞在一个大脚本里排查bug时你会发现寸步难行。关于代码性能有一个容易被忽视的点如果做多目标、多脉冲的完整仿真循环嵌套会非常慢。MATLAB的向量化不是万能的遇到大矩阵运算我会习惯性检查内存占用。例如在仿真64阵元、1000个脉冲、每个脉冲2000个采样点时接收数据矩阵是64×2000×1000直接用数值数组存会占用约1GB内存很容易让普通电脑卡死。这时考虑分段处理每次只处理一个脉冲做匹配滤波后再累加有效缓解内存压力。做相控阵雷达仿真的体会是这个领域看起来公式多但真正难的是把公式变成能跑通、能验证、能讲清楚结果的代码。方向图理论早就写在教科书里了但能画出副瓣压到-40dB、主瓣指向精确到0.1度的方向图并且明白为什么能压到-40dB、为什么只能精确到0.1度才算真正入了门。希望这篇里的过程和方法能帮你少走几段弯路。如果你照着上面的代码跑出来的第一幅方向图主瓣干干净净出现在设定角度那么恭喜你相控阵这个大门已经为你敞开了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑