ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

阵列方向图比较仿真指南:从MATLAB/Python到栅瓣与旁瓣判读

阵列方向图比较仿真指南:从MATLAB/Python到栅瓣与旁瓣判读 简介阵列天线方向图对比的Matlab实现包面向无线通信、天线工程领域的初学者与研发人员可用于直观理解单元个数、阵元间距和波长对辐射特性的影响。压缩包内共4个文件均为.m脚本体积仅2KB轻量易运行无需额外数据即可完成典型场景的方向图仿真。已有2132人学习说明该主题具有较好的参考价值。通过运行脚本可对比2、4、8单元等不同阵列规模以及λ/2、λ、λ/4等阵元间距和波长变化下的主瓣、旁瓣与零点分布帮助读者将理论公式转化为可视化结果进而掌握阵列天线的设计权衡为波束赋形、旁瓣抑制等工程优化提供实践参考。1. 几种阵列的方向图比较先搞清楚“比什么”仿真才有意义做阵列天线方案选型时几乎每个团队都会把“几种阵列的方向图比较”这句话挂在嘴边。但真到仿真阶段很多人发现拿出来的图没法看有的比的是阵因子有的比的是全阵方向图有的归一化到功率有的归一化到幅度有的阵元数不一样却硬摆在一起。方向图不是一个孤立曲线它是口径分布、阵元位置、加权系数和扫描角共同作用的结果。比较方向图的意义不是看谁“好看”而是看波束宽度、旁瓣电平、扫描损耗和栅瓣出现位置四条线能不能同时满足系统指标。这篇东西按我自己做仿真验证的路径来讲先建立统一的比较口径再给出一套可复现的 MATLAB 和 Python 脚本然后落到参数定标和读图锚点最后把五类最容易翻车的比较陷阱逐个拆开。适合刚接手相控阵或阵列方向图仿真的工程师也适合需要给方案评审拿出对比依据的硬件同事。2. 方向图背后的量纲从阵因子到功率方向图的换算逻辑2.1 口径、阵因子与单元方向图的乘积关系任何阵列方向图都可以拆成单元方向图与阵因子的乘积这是比较工作的第一原则。单元方向图取决于贴片、偶极子还是波导开口阵因子只和阵元位置、激励幅度与相位有关。比较“阵列”本身的差异时应该固定单元方向图这样曲线差异才能反映阵列排布带来的贡献。实际仿真时单元方向图常常被设置为各向同性也就是单元方向图恒等于 1此时全阵方向图退化为纯阵因子。这样做的价值在于快速评估栅瓣和波束宽度趋势代价是主瓣附近的边界效应和扫描角的单元互耦都无法体现。我一般会把两条链路都跑一遍各向同性单元看阵因子趋势再叠一层实测或仿真的单元方向图看真实边界。这里面还有个容易被忽视的细节方向图到底用幅度还是功率表示。阵因子通常是复数求和取绝对值得到的曲线是幅度方向图功率方向图是幅度的平方。归一化时幅度方向图普遍归一化到峰值 1功率方向图归一化到峰值 1 或 0 dB。如果拿幅度和功率曲线放在同一张图上对比会在半功率波束宽度附近出现约 3 dB 的偏差这个错位能直接导致你对波束宽度的判断差一个身位。提示做比较前先约定量纲建议统一使用功率方向图的 dB 显示-3 dB 切面就是半功率波束宽度读图最直接。2.2 直线阵、圆环阵、平面阵的方向图形状差异直线阵ULA的方向图只在包含阵列轴线的平面内有定义方位扫描时波束会在锥面上移动出现不可忽视的锥角效应。圆环阵UCA在方位面内天然全向适合需要 360 度覆盖的场合但它的波束宽度会随扫描方位角变化而且在俯仰方向的指向能力很弱。平面阵UPA则是在两个正交方向都有口径能够实现方位和俯仰的独立波束指向代价是阵元数量翻倍、馈电网络更复杂。从方向图形状上看直线阵的典型主瓣最窄方向是法向扫描到端射方向时波束急剧展宽旁瓣也会明显抬高。圆环阵在方位面内没有端射问题但方向图在俯仰角接近阵列平面时会出现对称的“漏斗状”响应这在实际工程里意味着天顶方向和水平方向的覆盖能力完全不同。平面阵的栅瓣条件更苛刻因为两个方向都有周期阵元排布栅瓣会从四个象限同时涌入可见空间。比较这三种阵列时如果只取一个剖面来比很容易得出片面结论。我通常的做法是方位面取 θ90 度剖面俯仰面取 φ0 度剖面必要时再补一个三维方向图的最高旁瓣统计用“全局最高旁瓣”而不是“剖面最高旁瓣”来做最终裁定。2.3 为什么“比较”本身也是一项设计决策不同项目对方向图比较的关注重心完全不同。通信基站的阵列比较重点在扫描范围内旁瓣是否低于某个绝对电平比如 -13 dB 或 -15 dB因为干扰抑制直接决定系统容量。雷达系统的阵列比较则更关注波束宽度和栅瓣位置因为测角精度和模糊度直接挂钩。射电天文或测控场景通常关心的是第一旁瓣和远旁瓣包络对主瓣宽度不敏感。选型逻辑也受阵元间距约束。直线阵的阵元间距一旦超过 0.5 倍波长扫描到大角度时必然出现栅瓣圆环阵的等效口径比直线阵小相同阵元数下主瓣天然宽一截但换来的是全方位覆盖。平面阵如果按矩形栅格排布在斜 45 度方向上的栅瓣距离最近这也是很多人仿真时只看 0 度和 90 度剖面、漏掉 45 度剖面之后在实测阶段突然发现栅瓣的直接原因。比较之前先问三个问题系统要覆盖的角度范围是多少允许的最高旁瓣电平是多少阵面物理尺寸的上限是多少。答案不同结论就会反转。没有一套方向图能同时赢在波束窄、旁瓣低、扫描范围大这三件事上。3. 用 MATLAB 在本地跑通阵列方向图的最小仿真3.1 均匀直线阵方向图的向量化计算搭建最小仿真不需要商用电磁软件一段 MATLAB 脚本就能把几种阵列的方向图算出来。核心是构造阵元位置矩阵和观察方向矢量然后做复数求和。以一个 16 元半波长间距的均匀直线阵为例先跑法向波束。% 均匀直线阵方向图16 元半波长间距法向波束 N 16; % 阵元数 d_lambda 0.5; % 阵元间距单位波长 theta_deg linspace(-90, 90, 1801); % 观察角度单位度 theta deg2rad(theta_deg); % 阵元位置以第一个阵元为相位参考点 pos (0:N-1) * d_lambda; % 法向波束各阵元激励相位相同 phase 2 * pi * pos. * sin(theta); % 维度N x 1801 array_factor sum(exp(1j * phase), 1); % 沿阵元维度求和 pattern abs(array_factor); % 幅度方向图 pattern_dB 20 * log10(pattern / max(pattern) eps); % 绘制功率方向图 figure; plot(theta_deg, pattern_dB, LineWidth, 1.5); xlabel(Theta (deg)); ylabel(Normalized Pattern (dB)); ylim([-40 5]); grid on;这段代码里 phase 矩阵的每一行代表一个阵元在所有观察角度下的空间相位差exp 之后按列求和得到阵因子。加 eps 是为了防止 log10(0) 出现无穷大。归一化用最大值而不是第一个点的值保证 0 dB 对齐到主瓣峰值。需要注意相位参考点设在第一个阵元如果换到阵列中心方向图的相位响应会变但幅度不变。幅度方向图对相位参考点不敏感所以归一化后的曲线和参考点位置无关这一点在做直线阵比较时可以放心。3.2 一个函数切换直线阵、圆环阵和平面阵把阵元位置和观察方向矢量的构造抽出来就能用一个核心函数统一处理三种阵列。下面这段 Python 代码比 MATLAB 更灵活适合做多阵列批量对比核心思路是位置矩阵 P 和观察方向矩阵 K 的矩阵乘法一步得到全部相位。import numpy as np def array_pattern(array_type: str, N: int, d_lambda: float, theta_deg: np.ndarray, phi_deg: np.ndarray, scan_theta: float 0.0, scan_phi: float 0.0): array_type: ula 直线阵 / uca 圆环阵 / upa 平面阵 N: 阵元数 d_lambda: 阵元间距波长倍数 theta_deg, phi_deg: 观察方向的俯仰角和方位角网格 theta np.deg2rad(theta_deg) phi np.deg2rad(phi_deg) scan_t np.deg2rad(scan_theta) scan_p np.deg2rad(scan_phi) if array_type ula: # 直线阵沿 x 轴排布 pos np.stack([np.arange(N) * d_lambda, np.zeros(N), np.zeros(N)], axis0) # (3, N) elif array_type uca: # 圆环阵半径按相邻阵元间距 d_lambda 反推 angle 2 * np.pi * np.arange(N) / N radius d_lambda / (2 * np.sin(np.pi / N)) pos np.stack([radius * np.cos(angle), radius * np.sin(angle), np.zeros(N)], axis0) elif array_type upa: # 方形平面阵N 必须是平方数按 sqrt(N) x sqrt(N) 排布 M int(np.sqrt(N)) x, y np.meshgrid(np.arange(M) * d_lambda, np.arange(M) * d_lambda) pos np.stack([x.ravel(), y.ravel(), np.zeros(M*M)], axis0) else: raise ValueError(unknown array type) # 观察方向单位矢量每个角度对一组 (kx, ky, kz) sin_t np.sin(theta) k_vec np.stack([sin_t * np.cos(phi), sin_t * np.sin(phi), np.cos(theta)], axis0) # (3, N_ang) # 扫描方向单位矢量 k_scan np.array([np.sin(scan_t) * np.cos(scan_p), np.sin(scan_t) * np.sin(scan_p), np.cos(scan_t)]) # 相位 2pi * 位置矩阵转置 x (观察方向 - 扫描方向) phase 2 * np.pi * (pos.T (k_vec - k_scan[:, None])) # (N, N_ang) pattern np.abs(np.sum(np.exp(1j * phase), axis0)) return pattern / pattern.max()这段代码把相位参考点隐式放在坐标原点。直线阵的原点在第 0 个阵元圆环阵的原点在圆心平面阵的原点在第一个阵元。幅度方向图对参考点不敏感所以这种写法在比较幅度曲线时安全但如果后续要算相位中心或做干涉测角就必须显式控制参考点。平面阵的 meshgrid 顺序需要多说一句x 和 y 都用相同间距ravel 之后阵元按行优先排列如果外部需要按物理位置索引阵元这个顺序必须和数据表对齐。另外平面阵扫描角和观察角的定义我用的是常规球坐标有些文献会把 theta 定义成和 z 轴的夹角代码里需要保持一致。3.3 比较三者的输出归一化与坐标显示有了上面的函数比较三种阵列只需要循环调用即可。这里有一个提升效率的小技巧先构造所有观察角度的 k_vec再在循环外一次性计算投影矩阵避免每个阵列都重复做三角函数运算。阵列数量少时无所谓但扫描到几百个角度网格后三角函数开销能差出 20% 的耗时。import matplotlib.pyplot as plt theta np.linspace(-90, 90, 901) # 俯仰角剖面 phi np.zeros_like(theta) # 方位角固定在 0 度 plt.figure(figsize(8, 5)) for name in [ula, uca, upa]: pat array_pattern(name, N64, d_lambda0.5, theta_degtheta, phi_degphi) pat_db 20 * np.log10(pat 1e-12) plt.plot(theta, pat_db, labelname) plt.ylim([-40, 5]) plt.xlabel(Theta (deg)) plt.ylabel(Normalized Pattern (dB)) plt.legend() plt.grid(True) plt.show()注意这里圆环阵的 64 元在 0 度方位剖面下主瓣宽度并不代表它的真实覆盖能力因为圆环阵在方位面内全向取任意方位剖面都相似但在俯仰面上它的波束响应和直线阵完全不同。平面阵的 64 元按 8×8 排布主瓣宽度理论上约等于 8 元直线阵在 x 方向的口径但如果剖面只取 phi0你看到的只是其中一个维度。提示三种阵列的图形差异只有在同一阵元数、同一剖面方向和同一归一化方式下才有可比性。换一个剖面排名就可能反过来。4. 几种阵列的方向图对比三个读图锚点与参数定标4.1 阵元数相同条件下的波束宽度对比阵元数相同但排列不同主瓣宽度会有明显差异。以 32 元阵列为例直线阵长度是 15.5 倍波长半功率波束宽度大约为 3.3 度圆环阵半径约为 0.252 倍波长除以 sin(π/32) 的折算等效口径远小于直线阵主瓣宽度通常在 8 到 14 度之间浮动具体值取决于观察剖面。平面阵如果按 4×8 排布两个方向的主瓣宽度各自由 4 元和 8 元口径决定呈现明显的“扇贝形”波束。比较时最稳妥的做法是列出波束宽度表而不是只放一张叠加曲线图。因为曲线叠在一起后-3 dB 切面容易视觉误读特别是在斜率大的区域一条线的微小偏移可能造成 0.5 度以上的判读误差。下面是一张典型对比表参数为 32 元、0.5 倍波长间距、法向波束、各向同性单元阵列类型排布参数主瓣宽度 (-3 dB)第一旁瓣电平扫描 ±45° 时旁瓣变化直线阵32×1约 3.3°-13.2 dB旁瓣上升至 -11.5 dB 左右圆环阵32 元单环约 12.5°方位剖面-7.9 dB高旁瓣扫描变化小旁瓣稳定平面阵4×8方位约 13°俯仰约 6.5°-13.2 dB主平面45° 斜剖面旁瓣恶化至 -9 dB这张表的价值在于说明波束宽度和旁瓣是同一组阵元位置约束下的耦合结果没有独立调优的空间。圆环阵旁瓣偏高是因为环形排布的阵因子在方位面内没有均匀的旁瓣结构它不是传统意义上的“低旁瓣阵列”。4.2 幅度加权与旁瓣电平比较时最容易错位的参数很多人在比较阵列时默认使用均匀加权但实际工程里几乎都会加窗。泰勒窗、汉明窗、切比雪夫窗的作用是压低旁瓣代价是主瓣展宽。切比雪夫窗可以给出精确的恒定旁瓣电平但端点权值往往很大对馈电幅相精度极其敏感泰勒窗旁瓣包络可控主瓣宽度增长更温和工程实现更常见。比较不同阵列时如果 A 阵列用了泰勒窗、B 阵列用了均匀加权两者画在同一张图上旁瓣差异会被误读成阵列排布的差异。正确做法是所有阵列用同一套加权参数或者至少在做结论前把加权方式标注在图上。我一般会在图标题里直接写“16 元 ULA泰勒 -30 dBnbar4”这样任何人拿到图都不会产生歧义。加权对方向图的影响还有个容易被忽略的点幅度加权只对直线阵和平面阵的旁瓣抑制有效对圆环阵的方位剖面加权同样能压低旁瓣但因为圆环阵方向图的旁瓣不是规则对称分布加窗后的主瓣展宽比例也不均匀。仿真时要观察整个方位角范围内的最高旁瓣而不是只看一个切面的第一旁瓣。4.3 扫描角、栅瓣与视场的三角关系扫描是方向图比较里最复杂的维度。均匀直线阵在阵元间距 d、工作波长 lambda 下栅瓣出现条件为 d/lambda 大于某个临界值。具体来说法向波束的栅瓣出现在 sin(theta) m * lambda / d 的角度m 取整数。当 d 0.5 倍波长时可见空间内只有 m0 一个解无栅瓣当 d 1 倍波长时m±1 的两个栅瓣刚好落在 ±90 度方向。扫描之后栅瓣会移动。波束指向 theta_0 时栅瓣位置满足 sin(theta) - sin(theta_0) m * lambda / d。这个公式直接说明为什么大扫描角下阵元间距必须进一步压缩如果要扫描到 60 度sin(60) ≈ 0.866想要栅瓣不出现在 ±90 度以内d 必须小于约 0.536 倍波长。也就是说只看 0 度波束时的方向图无法判断扫描后的表现必须把扫描角纳入比较维度。平面阵的栅瓣条件更复杂因为两个方向都有周期排布。矩形栅格的阵元间距 dx 和 dy 需要分别满足约束栅瓣会以二维点阵形式出现在方向余弦空间里。比较平面阵和直线阵时如果只看主平面剖面漏掉对角线方向的栅瓣就是前面提到的 45 度剖面陷阱。5. 做方向图比较时的五个常见翻车点现象、原因与解决5.1 栅瓣被误判成主瓣现象仿真曲线在某个大角度出现一个幅度只比主瓣低零点几 dB 的峰初看以为是扫描后的旁瓣抬升细算发现它的移动规律和扫描角不匹配。原因阵元间距超过栅瓣临界值或者比较时只取了小角度范围栅瓣没有完整进入视野。0.5 倍波长间距在 60 度扫描时栅瓣尖端已经接近可见区域边缘。解决把观察角度范围扩到接近 ±90 度并在代码里用公式计算栅瓣预期位置。如果曲线峰值出现在 sin(theta) sin(theta_0) m * lambda / d 对应的角度直接判定为栅瓣而不是“异常旁瓣”。5.2 相位参考点不一致导致波束指向漂移现象两段代码实现同一个阵列算出的主瓣指向在扫描时差了零点几度。原因一段代码以第一个阵元为相位参考另一段以阵列中心为参考。幅度方向图对参考点不敏感但扫描相位一旦写成相对相位增量两种写法在数值上会引入不同的相位斜坡叠加在方向图上就会让峰值位置整体偏移。解决先确认所有阵列的相位参考点都在坐标原点或者都在阵列中心统一后再比较。在代码注释里显式写明“参考点 阵元 0 / 圆心 / 阵面中心”这个习惯能省掉大量排查时间。5.3 阵因子和单元方向图相乘时重复计算现象方向图的主瓣比预期窄或者旁瓣结构出现奇怪的波纹。原因有人先把阵列方向图算出来又乘了一次单元的 cos 方向图导致等效口径被算了两遍。或者反过来算完阵因子忘了乘单元方向图直接用各向同性曲线去比对实测贴片方向图。解决固定一个仿真链路模板先算阵因子再乘单元方向图最后做归一化和 dB 转换。单元方向图如果是仿真软件里提取的要注意提取时是否已经包含阵列环境的互耦效应如果包含了就不能再和阵因子相乘。5.4 对数坐标下 0 dB 参考选错现象两组数据画在一起一条曲线的旁瓣底部明显高于另一条但数值换算后其实相同。原因一组用幅度归一化后取 20log10另一组用功率归一化后取 10log10或者归一化时除以了均值而不是最大值。解决统一用功率方向图显示即先对幅度方向图取平方再归一化到峰值 1最后取 10*log10。下面这行代码是固定写法pattern_power_db 10 * log10(abs(array_factor).^2 / max(abs(array_factor).^2) eps)。注意 eps 的位置在分母外面还是里面也会造成 -200 dB 以下的底部抖动虽然不影响主瓣和旁瓣的判读但会干扰曲线平滑度。5.5 圆环阵的周期对称性被忽略现象圆环阵方向图比较时只取了 0 度方位剖面得出“圆环阵主瓣比直线阵宽很多”的结论但换成 45 度方位剖面数值又变了。原因圆环阵在方位面内具有旋转对称性但它的方向图对观察方位角的敏感度远高于直线阵。取单一切面无法描述阵列的真实空间响应。解决至少取三个方位剖面0 度、30 度、60 度叠加显示或者直接输出三维方向图的最高旁瓣电平作为最后结论。圆环阵的波束宽度本来就会随扫描方位角抖动这是物理特性不是仿真 bug。6. 用方向性系数和口径效率给比较结果做一次体检幅度方向图只是外部形态真正决定阵列优劣的是方向性系数。方向性系数 D 定义为最大辐射方向的功率密度与平均辐射功率密度之比在数值上等于 4π 乘以最大方向增益再除以整个球面上的方向图功率积分。用离散角度网格近似时D 可以直接由方向图数据求出def directivity(theta_deg, phi_deg, pattern_power): 输入俯仰角网格、方位角网格、功率方向图线性值未归一化 输出方向性系数线性值和对应的 dBi theta np.deg2rad(theta_deg) phi np.deg2rad(phi_deg) T, P np.meshgrid(theta, phi, indexingij) # 球面离散积分面积元 sin(theta) dtheta dphi integrand pattern_power * np.sin(T) dtheta T[1,0] - T[0,0] dphi P[0,1] - P[0,0] D 4 * np.pi * pattern_power.max() / (np.sum(integrand) * dtheta * dphi) return D, 10 * np.log10(D)这段代码对角度网格的均匀性有要求。如果 theta 和 phi 的步长不一致积分权重会偏如果网格覆盖不到整个球面方向性系数会被高估。比较阵列时方向性系数能告诉你一个关键信息波束更窄的阵列是否真的把能量集中了还是只是方向图上看起来窄但整体辐射效率低。直线阵在法向的方向性通常高于圆环阵因为它的等效口径更大但圆环阵在方位面内全向覆盖全空间平均功率分布更均匀。口径效率是另一个体检指标。公式是口径效率 方向性系数 / (4π * 物理面积 / 波长的平方)。物理面积按阵列外接矩形或外接圆面积计算。直线阵的物理面积只有一个维度口径效率的定义不直观但平面阵和圆环阵可以算。计算后你会发现均匀加权的平面阵口径效率接近理论上限而圆环阵因为中心区域没有阵元口径效率天然偏低。这个数值可以帮你在方案评审时解释“为什么圆环阵在相同方向性下体积更大”。我自己做比较时有个习惯把所有阵列的法向方向图、扫描 45 度方向图、方向性系数值放在一张汇总表里并且把生成曲线的全部参数写进脚本文件的注释头。这样过两周回来看图还能准确知道每条曲线是怎么算出来的。方向图比较本身没有“最好”的答案只有“在某个约束下更合适”的方案。清楚边界在哪里比得到一个漂亮的图片更有价值希望帮到你。本文还有配套的精品资源点击获取
返回列表