
简介这份资源面向雷达系统设计与电子工程方向的初学者及工程师聚焦相控阵天线与波束扫描的MATLAB仿真实现。压缩包内含2个文件以1个m脚本和1个txt说明为主整体约4KB其中脚本承担天线阵列建模、相位控制与波束扫描的核心计算文本文件则提供配套的理论说明或数据来源参考。资源围绕相控阵原理展开涉及相位控制、波束扫描、阵列尺寸与单元间距、波束宽度及相位步长等关键仿真参数并借助MATLAB工具箱分析增益、旁瓣水平与波束宽度等电磁性能指标可动态演示波束在不同角度下的扫描过程。目前已有1199人学习下载适合希望快速理解相控阵工作机制、验证阵列设计参数并预测雷达性能的读者参考使用。1. 从一份 multi_array.rar 说起相控阵天线仿真到底在算什么很多人第一次拿到multi_array.rar这种命名的压缩包心里是没底的——里面大概率是一堆.m文件加几个.mat数据没有 README没有论文函数名还全是拼音缩写。但只要你做的是相控阵雷达天线方向这套东西的核心其实就一件事把 N 个阵元按一定几何排布摆好给每个阵元加上幅度和相位加权然后算出远场的合成方向图。听起来简单真正上手才会发现阵元间距差半个波长栅瓣就冒出来了相位量化位数少一位副瓣就抬起来了。这份标题里的关键词——天线阵、相控阵仿真、相控阵 MATLAB、雷达仿真参数——指向的是一个非常典型的工程闭环阵列建模 → 加权设计 → 方向图计算 → 参数扫描 → 性能评估。它适合两类人一类是刚接触雷达/通信阵列的研究生需要一套能跑通、能改参数的仿真骨架另一类是做 FPGA 波束控制或射频前端验证的工程师需要一个 MATLAB 侧的参考模型来对标实测数据。热词里有人问“fpga 可以控制相控阵的相位吗”答案是当然可以但前提是你得先在 MATLAB 里把相位-方向图的映射关系算清楚否则硬件调半天也不知道对不对。这一篇不打算复述天线教材而是顺着这份 multi_array 类仿真包的常见结构把参数怎么设、代码怎么写、结果怎么验、坑在哪一条线讲透。你照着做至少能得到一套可复现的线阵/平面阵方向图仿真流程并且知道每个参数动了之后方向图会往哪个方向变。2. 阵列建模与方向图计算从阵元位置到远场合成2.1 均匀线阵与平面阵的几何建模相控阵仿真第一步不是写方向图公式而是把阵元坐标定下来。最常见的两种排布是均匀线阵ULA和均匀平面阵UPA。线阵只有一个维度适合做一维电扫平面阵能同时在方位和俯仰两个方向扫描是雷达的主流选择。在 MATLAB 里我一般用一个N×3的矩阵存阵元坐标列分别是 x、y、z单位统一用波长归一化这样后面算相位差时不用反复乘lambda。% 均匀线阵N 个阵元间距 d单位波长 N 16; % 阵元数 d 0.5; % 阵元间距半波长是常用值 pos zeros(N, 3); pos(:,1) (0:N-1). * d; % 沿 x 轴排布 % 均匀平面阵M×N行沿 y列沿 x M 8; N 8; dx 0.5; dy 0.5; [X, Y] meshgrid((0:N-1)*dx, (0:M-1)*dy); pos_upa [X(:), Y(:), zeros(M*N,1)];这里d 0.5是半波长目的是在 ±90° 扫描范围内不出现栅瓣。如果你把d改成 0.8 甚至 1.0方向图会在非主瓣方向冒出幅度接近主瓣的假峰这就是栅瓣。栅瓣出现的条件是d/λ 1/(1|sinθ_max|)扫描角越大允许的间距越小。很多人仿真时只看正前方间距设大了没发现问题一扫描就翻车这是血泪经验。平面阵的坐标生成用meshgrid再拉平顺序要和后面的加权向量对应。X(:)是按列优先展开的如果你后面用reshape恢复二维图维度顺序必须一致否则方向图会转 90°。2.2 阵列因子与方向图的计算公式方向图的核心是阵列因子Array Factor。对一组任意排布的阵元远场某方向(θ, φ)的合成场可以写成% 计算阵列因子 theta linspace(-90, 90, 721); % 俯仰角扫描 phi 0; % 先看一个切面 k 2*pi; % 波数波长归一化后 k2π AF zeros(size(theta)); for ii 1:length(theta) u sind(theta(ii))*cosd(phi); v sind(theta(ii))*sind(phi); phase k * (pos(:,1)*u pos(:,2)*v); AF(ii) sum(exp(1j*phase)); end AF_dB 20*log10(abs(AF)/max(abs(AF)));这段代码里k 2*pi是因为坐标已经用波长归一化实际波数2π/λ乘上以波长为单位的距离λ 约掉了。u和v是方向余弦线阵只看 x 方向时v0。AF_dB做了归一化主瓣峰值 0 dB副瓣和零点都是相对值。参数说明theta的分辨率决定方向图曲线是否光滑721 点对应 0.25° 步进一般够用。如果你要做零陷优化或者副瓣电平精确测量建议加到 3601 点。phi固定为 0 是看 x-z 平面切面平面阵要同时扫phi才能看到完整波束形状。2.3 加权向量幅度锥削与相位扫描没有加权的均匀阵副瓣只有 -13.2 dB很多雷达指标要求 -25 dB 甚至 -30 dB 以下这时候就要做幅度锥削。常见窗函数有 Taylor、Chebyshev、Hamming。MATLAB 里taylorwin和chebwin直接可用。% 幅度加权Taylor 窗副瓣 -30 dB N 16; w_amp taylorwin(N, 5, -30); % 5 个近旁瓣目标副瓣 -30dB % 相位加权波束指向 30° theta0 30; w_phase exp(-1j * k * pos(:,1) * sind(theta0)); % 总加权 w w_amp .* w_phase; % 带加权的阵列因子 AF_w zeros(size(theta)); for ii 1:length(theta) u sind(theta(ii)); phase k * pos(:,1) * u; AF_w(ii) sum(w .* exp(1j*phase)); end AF_w_dB 20*log10(abs(AF_w)/max(abs(AF_w)));taylorwin(N, nbar, sll)三个参数分别是阵元数、近旁瓣数量、目标副瓣电平负数。nbar越大副瓣衰减越平缓但主瓣会变宽。这是典型的“副瓣换主瓣宽度” trade-off没有免费午餐。相位加权exp(-1j*k*x*sin(theta0))的作用是把主瓣从 0° 搬到theta0。注意符号如果方向图峰值跑到 -30° 去了把sind前面的负号去掉试试。不同教材坐标系定义不同这是新手最容易卡住的地方不是代码错是坐标约定没对齐。加权之后主瓣宽度会变宽。16 阵元半波长线阵均匀加权时 3dB 波束宽度约 6.4°加 Taylor -30 dB 后可能变成 8° 以上。如果你的雷达要求波束宽度小于某个值阵元数就得加或者换低副瓣但主瓣展宽小的窗。3. 雷达仿真参数怎么设从波束宽度到扫描范围3.1 阵元数、间距与孔径的三角关系相控阵雷达仿真参数里最核心的三个量是阵元数 N、阵元间距 d、阵列孔径 L (N-1)d。它们决定了波束宽度、增益和栅瓣条件。波束宽度近似公式是θ_3dB ≈ 0.886 * λ / (N*d)弧度换成角度再乘 57.3。孔径越大波束越窄角分辨率越高但扫描时的波束展宽也越明显。参数典型值影响注意阵元数 N16 / 32 / 64N 越大波束越窄、增益越高计算量和硬件通道数同步上升间距 d0.5λ决定无栅瓣扫描范围d0.5λ 时扫描角受限扫描角 θmax±45° / ±60°决定栅瓣条件和波束展宽扫描越大波束越宽、增益越低副瓣电平-25 / -30 dB抗干扰能力越低主瓣越宽我一般会先根据扫描范围反推最大允许间距d_max λ / (1 sin(θmax))。如果 θmax 60°d_max 0.536λ所以 0.5λ 是安全的。如果 θmax 只有 30°d_max 可以到 0.67λ这时候用 0.6λ 能省阵元数。但省阵元数的代价是副瓣和栅瓣余量变小实测时阵元互耦和安装误差一叠加可能就压不住了。3.2 扫描角与波束展宽为什么大角度扫描会翻车相位扫描的波束宽度随扫描角增大而展宽近似关系是θ_3dB(θ0) θ_3dB(0) / cos(θ0)。扫描 60° 时波束宽度是正前方的 2 倍。这意味着同样阵元数大角度扫描时角分辨率下降而且增益也按cos(θ0)下降。很多仿真只在 0° 看方向图很漂亮一到 60° 就发现波束胖得没法用这不是代码 bug是物理规律。% 扫描角对波束宽度的影响 theta0_list [0, 30, 45, 60]; for t0 theta0_list w w_amp .* exp(-1j*k*pos(:,1)*sind(t0)); AF zeros(size(theta)); for ii 1:length(theta) AF(ii) sum(w .* exp(1j*k*pos(:,1)*sind(theta(ii)))); end AF_dB 20*log10(abs(AF)/max(abs(AF))); % 找 -3dB 宽度 idx find(AF_dB -3); bw theta(idx(end)) - theta(idx(1)); fprintf(扫描 %d°, 3dB 波束宽度 %.2f°\n, t0, bw); end跑出来你会看到 0° 时约 6.4°60° 时可能到 12° 以上。如果指标要求全扫描范围内波束宽度不超过 8°那要么加阵元数要么限制扫描范围要么接受分辨率下降。仿真参数不是拍脑袋定的是拿指标反推出来的。3.3 相位量化位数6-bit 和 4-bit 差在哪实际相控阵的移相器不是连续相位而是量化到 2^B 个状态B 就是相位位数。常见 4-bit、5-bit、6-bit。量化会引入相位误差抬高副瓣。仿真时要把理想相位量化一下再算方向图。B 4; % 相位位数 phase_ideal angle(w_phase); % 理想相位 phase_quant round(phase_ideal / (2*pi/2^B)) * (2*pi/2^B); w_quant w_amp .* exp(1j*phase_quant); AF_q zeros(size(theta)); for ii 1:length(theta) AF_q(ii) sum(w_quant .* exp(1j*k*pos(:,1)*sind(theta(ii)))); end AF_q_dB 20*log10(abs(AF_q)/max(abs(AF_q)));4-bit 量化时副瓣可能从 -30 dB 抬到 -24 dB 左右主瓣几乎不变。6-bit 时副瓣抬升不到 1 dB。如果你的指标卡在 -30 dB4-bit 移相器基本没戏至少 6-bit。但位数越高移相器成本和 FPGA 控制线越多这是硬件和指标的折中。热词里问“fpga 可以控制相控阵的相位吗”答案是可以但你要先在这里仿真出量化位数对副瓣的影响再决定 FPGA 给多少位控制字。4. 避坑与排查相控阵 MATLAB 仿真里最容易翻车的 5 个点4.1 方向图峰值不在设定扫描角现象设了theta0 30但方向图峰值跑到 -30° 或者 150° 去了。原因坐标系定义和相位符号不匹配。有的公式用exp(-j*k*x*sinθ)有的用exp(j*k*x*sinθ)还有的把 θ 从阵列法线算有的从端射方向算。解决先跑一个theta0 0的均匀加权确认峰值在 0°。然后设theta0 10看峰值往正方向还是负方向移动。如果反了把相位公式里的符号取反。不要同时改多个地方一次只动一个符号。4.2 栅瓣出现在不该出现的位置现象扫描到 40° 以上时方向图在 -70° 附近冒出一个只比主瓣低几 dB 的峰。原因阵元间距 d 过大不满足d/λ 1/(1sinθmax)。或者坐标归一化时忘了除以波长实际间距变成了 0.5 米而不是 0.5 波长。解决检查pos矩阵的单位。如果阵元坐标是以米为单位k必须用2*pi/lambda不能直接用2*pi。另外把 d 降到 0.5λ 以下再试如果栅瓣消失就是间距问题。4.3 副瓣电平比理论值高很多现象用了 Taylor -30 dB 窗但仿真副瓣只有 -22 dB。原因可能是相位量化没加也可能是角度扫描分辨率不够峰值没采到。还有一种常见情况是加权向量和阵元坐标顺序不对应比如taylorwin生成的向量是从左到右但pos是从右到左。解决先把扫描角设为 0不加相位加权只看幅度加权。如果副瓣还是高检查w_amp和pos的对应关系。用plot(pos(:,1), abs(w_amp), o)画出来看一眼幅度大的阵元应该在中间。如果偏了翻转其中一个向量。4.4 平面阵方向图出现不对称现象8×8 平面阵x 和 y 方向间距都是 0.5λ但方向图在 u-v 平面上不对称。原因meshgrid生成的坐标顺序和reshape恢复时的维度不匹配。MATLAB 是列优先X(:)把矩阵拉成列向量如果你后面用reshape(AF, M, N)而 M 和 N 搞反了图就转了。解决统一用pos [X(:), Y(:), zeros(numel(X),1)]然后在算方向图时用reshape(AF, size(X))恢复。画图前用size确认维度。4.5 计算速度慢到无法做参数扫描现象16 阵元、721 个角度点跑一次要好几秒扫 100 组参数要几分钟。原因用了双重循环MATLAB 的 for 循环在旧版本里很慢。解决把角度循环向量化。AF sum(exp(1j*k*pos(:,1)*sind(theta)), 1)一行就能算完所有角度前提是pos(:,1)是列向量sind(theta)是行向量广播后得到N×length(theta)矩阵再沿第一维求和。速度能快几十倍。如果阵元数上千再用gpuArray或者分块计算。5. 进阶技巧用参数扫描和实测对标把仿真可信度拉起来仿真跑通方向图只是起点真正决定这套 multi_array 代码有没有用的是你能不能拿它做参数扫描和实测对标。我一般会做两件事一是扫间距和扫描角画出副瓣电平和波束宽度的二维热力图找到满足指标的安全区二是拿暗室实测的方向图切面对比看主瓣宽度和副瓣位置是否一致如果副瓣对不上优先怀疑阵元互耦和幅相误差。% 参数扫描间距 vs 扫描角输出副瓣电平 d_list 0.4:0.05:0.7; theta0_list 0:10:60; SLL zeros(length(d_list), length(theta0_list)); for ii 1:length(d_list) for jj 1:length(theta0_list) pos [(0:N-1).*d_list(ii), zeros(N,2)]; w taylorwin(N,5,-30) .* exp(-1j*k*pos(:,1)*sind(theta0_list(jj))); AF sum(exp(1j*k*pos(:,1)*sind(theta)), 1) * 0; % 占位 AF zeros(size(theta)); for kk 1:length(theta) AF(kk) sum(w .* exp(1j*k*pos(:,1)*sind(theta(kk)))); end AF_dB 20*log10(abs(AF)/max(abs(AF))); % 找主瓣外的最大峰值 [~, main_idx] max(AF_dB); left AF_dB(1:main_idx-20); right AF_dB(main_idx20:end); SLL(ii,jj) max([left, right]); end end imagesc(theta0_list, d_list, SLL); colorbar; xlabel(扫描角 (°)); ylabel(阵元间距 (λ)); title(副瓣电平 (dB));这段代码跑完你能一眼看出哪些间距和扫描角组合副瓣超标。比如 d0.6λ、扫描 50° 时副瓣可能只有 -18 dB而 d0.5λ 时能保持 -25 dB 以下。这就是选型的依据。对标实测时重点看三个量主瓣 3dB 宽度、第一副瓣位置、第一副瓣电平。主瓣宽度对不上通常是幅相误差导致孔径效率下降副瓣位置对不上可能是阵元间距实测值和设计值有偏差副瓣电平对不上优先查互耦和移相器量化。我习惯把实测方向图归一化后和仿真曲线画在同一张图上用legend标清楚然后逐点算误差。如果误差在 1 dB 以内这套仿真模型就可以用来做后续的波束调度和资源分配了。最后说个习惯每次改完参数先把theta00、均匀加权的方向图跑一遍确认峰值 0°、副瓣 -13.2 dB。这是你的基准线基准不对后面所有优化都是空中楼阁。希望帮到你。本文还有配套的精品资源点击获取