news 2026/10/12 6:30:54

均匀线阵、加权线阵、面阵与圆阵方向图对比:Python实战与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
均匀线阵、加权线阵、面阵与圆阵方向图对比:Python实战与避坑指南

简介:这份资源围绕阵列天线方向图展开,面向无线通信、天线设计与电磁仿真方向的学习者和工程人员,帮助理解单元个数、阵元间距与波长变化对辐射特性的影响。压缩包共4个文件,均为m脚本文件,体积约2KB,分别对应不同参数组合下的方向图计算与比较,便于在MATLAB环境中直接运行、修改参数并观察波束宽度、增益与旁瓣的变化。内容涉及2单元、4单元、8单元等不同阵列规模,以及λ/2、λ、λ/4等阵元间距条件,可直观看到主瓣、零点与旁瓣抑制之间的关系。已有2133人学习下载,适合作为课堂实验、课程设计或自学阵列天线基础时的参考脚本,帮助读者快速建立参数与方向图之间的对应认识,为后续波束赋形与阵列优化打下基础。

1. 几种阵列的方向图比较:从“看起来差不多”到“差之毫厘”

做天线阵列的同行大概都有过这种经历:仿真软件里跑出来几组方向图,肉眼看着主瓣都差不多,可一旦装到整机上,旁瓣电平、零点位置、波束宽度全变了样。问题往往不在仿真设置,而在于一开始就没搞清楚均匀线阵、加权线阵、均匀面阵、圆阵这几种拓扑的方向图到底差在哪。方向图比较这件事,本质上是把阵列因子、阵元间距、加权方式、扫描角这几个变量拆开,逐一量化它们对主瓣宽度、旁瓣电平、方向性系数的影响。适合已经能跑通单个阵列仿真、但面对多种布阵方案不知道怎么选的人。这篇笔记按“先立理论、再动手算、最后避坑”的顺序走,所有代码基于 Python 的 NumPy 和 Matplotlib,不依赖任何特定商业软件,跑完就能拿到可对比的曲线。

2. 阵列因子与方向图比较的数学底座

2.1 从阵元到阵列:方向图乘积定理的适用边界

方向图乘积定理说的是,阵列方向图等于单个阵元方向图乘以阵列因子。这个定理成立的前提是所有阵元取向一致、且互耦可忽略。我一般会在比较之前先确认这两条:如果阵元是微带贴片且间距小于半波长,互耦会明显改变各阵元激励,乘积定理就失效了。常见做法是先用半波长间距起步,把阵列因子单独拿出来比较,等拓扑选定了再考虑互耦补偿。

阵列因子的通用形式是各阵元激励乘以相位因子的求和。对于沿 z 轴排列的 N 元线阵,远场方向图只与方位角有关。均匀激励时阵列因子有闭式解,但一旦加权或者换成面阵、圆阵,闭式解要么不存在,要么形式复杂到没法直观比较。所以实操中我倾向于数值计算:把角度离散成足够密的网格,对每个角度累加所有阵元的贡献,再取模归一化。这样不管什么拓扑,比较的基准是一致的。

2.2 四种阵列拓扑的阵列因子写法

均匀线阵(ULA)是最简单的基准。N 个阵元等间距 d 排成一条线,激励等幅同相时,阵列因子是 sin(Nψ/2)/sin(ψ/2) 的形式,其中 ψ = kd cosθ + β,β 是相邻阵元间的递变相位。主瓣宽度近似为 0.886λ/(Nd) 弧度,旁瓣电平约 -13.2 dB。这两个数字是后面所有比较的锚点。

加权线阵在均匀线阵基础上给每个阵元乘一个幅度权。常用的是切比雪夫权和泰勒权。切比雪夫权能在给定旁瓣电平下做到最窄主瓣,代价是等旁瓣;泰勒权则让靠近主瓣的几个旁瓣保持低电平,远处旁瓣抬升,更符合实际干扰分布。加权会展宽主瓣,这是绕不开的代价。

均匀面阵(UPA)是线阵的二维扩展,M×N 个阵元排在矩形栅格上。它的阵列因子可以写成两个线阵因子的乘积,但只在两个维度独立加权时成立。面阵的波束在方位和俯仰两个方向都有宽度,比较时要同时看两个切面。

均匀圆阵(UCA)的阵元均匀分布在一个圆周上。它的阵列因子没有简单的闭式,但有个重要特性:方向图在方位面内近似旋转不变,扫描时波束形状变化比线阵小。代价是同样阵元数下,圆阵的孔径利用率不如面阵,主瓣通常更宽。

2.3 比较时到底该看哪几个指标

方向图比较不能只看一张极坐标图。我固定看四个量:主瓣宽度(-3 dB 或 -10 dB,看应用)、峰值旁瓣电平(PSLL)、方向性系数(或阵列增益)、以及扫描到最大角时的波束畸变程度。前三个是标量,好比较;第四个需要把方向图在扫描角处重新归一化后再看形状。对于圆阵还要额外看方位面内的方向图起伏,因为它的旋转对称性只在连续孔径下严格成立,离散圆阵会有纹波。

提示:比较前把所有方向图按各自最大值归一化,否则阵元数不同时绝对增益的差异会掩盖形状差异。

3. 用 Python 把四种阵列的方向图跑出来

3.1 环境准备与通用阵列因子函数

先装好 NumPy 和 Matplotlib,这两个库足够完成所有计算和绘图。下面这个函数是后面所有比较的基础,输入阵元坐标矩阵和激励向量,输出指定角度网格上的归一化阵列因子。

import numpy as np import matplotlib.pyplot as plt def array_factor(elem_pos, weights, theta_deg, phi_deg=0.0, wavelength=1.0): """ elem_pos: (N, 3) 阵元坐标,单位与 wavelength 一致 weights: (N,) 复数激励 theta_deg: 俯仰角网格,度 phi_deg: 方位角,标量或与 theta 同形 """ k = 2 * np.pi / wavelength theta = np.deg2rad(theta_deg) phi = np.deg2rad(phi_deg) # 入射波单位矢量 u = np.array([np.sin(theta) * np.cos(phi), np.sin(theta) * np.sin(phi), np.cos(theta)]) # 相位延迟:阵元位置与波矢的点积 phase = k * np.dot(elem_pos, u) # (N, len(theta)) af = np.abs(np.dot(weights.conj(), np.exp(1j * phase))) return af / np.max(af)

逻辑说明:elem_pos的每一行是一个阵元的三维坐标,weights是对应激励。u是远场来波方向单位矢量,phase是每个阵元相对原点的相位差。最后用激励共轭与相位因子做内积再取模,得到阵列因子幅度。参数wavelength默认 1,实际比较时只要所有阵列用同一个值,绝对尺度不影响形状对比。

3.2 均匀线阵与加权线阵的对比脚本

线阵沿 z 轴排布,只扫俯仰角,方位角固定为 0。下面代码同时算均匀权和切比雪夫权两种情况。

N = 16 d = 0.5 elem_ula = np.zeros((N, 3)) elem_ula[:, 2] = np.arange(N) * d theta = np.linspace(0, 180, 3601) w_uniform = np.ones(N, dtype=complex) # 切比雪夫权,旁瓣 -30 dB from scipy.signal import chebwin w_cheb = chebwin(N, at=30).astype(complex) af_uni = array_factor(elem_ula, w_uniform, theta) af_cheb = array_factor(elem_ula, w_cheb, theta) plt.figure(figsize=(10, 4)) plt.plot(theta, 20*np.log10(af_uni + 1e-12), label='Uniform') plt.plot(theta, 20*np.log10(af_cheb + 1e-12), label='Chebyshev -30dB') plt.xlabel('Theta (deg)'); plt.ylabel('Normalized |AF| (dB)') plt.ylim(-60, 0); plt.legend(); plt.grid(True) plt.title('ULA: uniform vs Chebyshev weighting') plt.show()

逻辑说明:chebwin来自 SciPy,生成 N 点切比雪夫窗,at=30表示旁瓣比主瓣低 30 dB。加 1e-12 是防止 log10(0)。跑完能看到均匀权旁瓣约 -13 dB,切比雪夫权旁瓣压到 -30 dB,但主瓣明显变宽。参数d=0.5是半波长,若改成 1.0 会出现栅瓣,这是后面避坑要讲的。

3.3 面阵与圆阵的阵列因子计算

面阵放在 xy 平面,M×N 个阵元,两个方向都取半波长间距。圆阵半径取让相邻阵元弧长等于半波长的值。

M, N = 8, 8 elem_upa = np.array([[i*d, j*d, 0] for i in range(M) for j in range(N)]) w_upa = np.ones(M*N, dtype=complex) R = d / (2 * np.sin(np.pi / N)) # 相邻阵元弧长 = d angles = np.linspace(0, 2*np.pi, N, endpoint=False) elem_uca = np.array([[R*np.cos(a), R*np.sin(a), 0] for a in angles]) w_uca = np.ones(N, dtype=complex) phi_cut = 0.0 af_upa = array_factor(elem_upa, w_upa, theta, phi_cut) af_uca = array_factor(elem_uca, w_uca, theta, phi_cut) plt.figure(figsize=(10, 4)) plt.plot(theta, 20*np.log10(af_upa + 1e-12), label='8x8 UPA') plt.plot(theta, 20*np.log10(af_uca + 1e-12), label='8-elem UCA') plt.xlabel('Theta (deg)'); plt.ylabel('Normalized |AF| (dB)') plt.ylim(-60, 0); plt.legend(); plt.grid(True) plt.title('UPA vs UCA, phi=0 cut') plt.show()

逻辑说明:面阵用双重循环生成坐标,圆阵半径由相邻弧长等于半波长反推。注意圆阵只有 8 个阵元,面阵有 64 个,所以主瓣宽度差异很大,这正好说明比较时阵元数要归一化或者至少心里有数。phi_cut=0是取一个切面,圆阵在这个切面上的方向图与面阵的差异能看出圆阵的孔径展宽效应。

3.4 扫描角对方向图的影响怎么量化

把激励加上递变相位就能扫描。线阵扫描角 θ0 对应的相邻相位差是 -kd cosθ0。下面代码把均匀线阵扫到 60 度,看主瓣宽度和旁瓣的变化。

theta0 = np.deg2rad(60) beta = -2 * np.pi * d * np.cos(theta0) w_scan = np.exp(1j * beta * np.arange(N)) af_scan = array_factor(elem_ula, w_scan, theta) plt.figure(figsize=(10, 4)) plt.plot(theta, 20*np.log10(af_uni + 1e-12), label='Broadside') plt.plot(theta, 20*np.log10(af_scan + 1e-12), label='Scan 60 deg') plt.xlabel('Theta (deg)'); plt.ylabel('Normalized |AF| (dB)') plt.ylim(-60, 0); plt.legend(); plt.grid(True) plt.title('ULA beam scanning effect') plt.show()

逻辑说明:beta是相邻阵元递变相位,w_scan是扫描激励。跑完会看到扫描后主瓣展宽(约 1/cosθ0 倍),旁瓣电平也可能抬升。这是线阵的固有缺陷,面阵和圆阵在各自扫描面内的表现不同,比较时要固定扫描角再比。

4. 方向图比较中的避坑与排查

4.1 栅瓣突然冒出来

现象:方向图在非主瓣方向出现一个和主瓣差不多高的尖峰。原因:阵元间距大于半波长,或者扫描到较大角度时等效间距变大。解决:把间距压到半波长以下,扫描范围大时用 0.4λ 甚至更小;如果已经加工了,只能限制扫描角。

4.2 加权后主瓣宽到没法用

现象:为了压旁瓣加了切比雪夫权,结果主瓣宽度翻倍,分辨率不够。原因:旁瓣抑制和主瓣宽度是此消彼长的,-40 dB 旁瓣的切比雪夫阵主瓣比均匀阵宽近一倍。解决:先明确系统到底需要多低的旁瓣,通常 -25 到 -30 dB 够用;或者改用泰勒权,让近旁瓣低、远旁瓣放宽,主瓣展宽小一些。

4.3 圆阵方向图在方位面内起伏

现象:圆阵扫描时,不同方位角的方向图不完全一样,有零点漂移。原因:离散圆阵的旋转对称性被破坏,阵元数越少越明显。解决:增加阵元数,或者用多个圆环组成柱面阵;如果只是比较用,在方位面内多取几个切面看最差情况。

4.4 互耦让仿真和实测对不上

现象:仿真旁瓣 -30 dB,实测只有 -20 dB。原因:阵元间互耦改变了各阵元的实际激励和方向图,乘积定理失效。解决:在仿真中加入互耦模型,或者用实测的嵌入方向图替代理想阵元方向图;间距小于 0.4λ 时尤其要注意。

4.5 归一化方式不一致导致误判

现象:两组方向图比较时,一组按各自最大值归一化,另一组按同一个参考归一化,看起来旁瓣差很多。原因:归一化基准不同。解决:比较形状时统一按各自最大值归一化;比较绝对增益时统一按同一个参考(比如理想点源)归一化,并在图注里写清楚。

5. 把方向图比较做成可复用的扫描脚本

前面都是单次计算,实际选型时往往要扫一堆参数:阵元数、间距、加权类型、扫描角。我习惯写一个参数扫描脚本,把关键指标自动提取出来,用表格对比而不是靠眼睛看图。下面这个函数返回主瓣宽度和峰值旁瓣电平,配合循环就能批量跑。

def beam_metrics(af, theta): af_db = 20 * np.log10(af + 1e-12) peak_idx = np.argmax(af_db) # -3 dB 主瓣宽度 left = np.where(af_db[:peak_idx] < -3)[0] right = np.where(af_db[peak_idx:] < -3)[0] if len(left) == 0 or len(right) == 0: bw = np.nan else: bw = theta[peak_idx + right[0]] - theta[left[-1]] # 峰值旁瓣:主瓣外最大值 mask = np.ones_like(af_db, dtype=bool) mask[max(0, peak_idx-5):peak_idx+6] = False psl = np.max(af_db[mask]) return bw, psl configs = [ ('ULA uniform', elem_ula, w_uniform), ('ULA Cheb -30', elem_ula, w_cheb), ('UPA 8x8', elem_upa, w_upa), ('UCA 8', elem_uca, w_uca), ] print(f"{'Config':<16}{'BW-3dB(deg)':<14}{'PSL(dB)':<10}") for name, pos, w in configs: af = array_factor(pos, w, theta) bw, psl = beam_metrics(af, theta) print(f"{name:<16}{bw:<14.2f}{psl:<10.2f}")

逻辑说明:beam_metrics先在主瓣两侧找 -3 dB 点算宽度,再把主瓣附近 5 个点挖掉后取最大值作为峰值旁瓣。configs列表把四种配置放一起,循环输出表格。跑完你会得到类似 ULA uniform 约 6.4 度、-13 dB,ULA Cheb 约 9 度、-30 dB,UPA 约 12 度、-13 dB,UCA 约 14 度、-8 dB 这样的数字。这些数字随阵元数和间距变化,但相对关系稳定。

注意:beam_metrics里的 5 点挖孔是经验值,角度网格密的时候要相应加大,否则会把主瓣裙边当成旁瓣。

最后说个我自己的习惯:每次比较方向图之前,先把所有阵列的阵元数、孔径、间距列成一张表,确认比较是在公平条件下进行的。如果阵元数不同,主瓣宽度的差异里混着孔径差异,结论就不可靠。我早年吃过这个亏,拿 8 元圆阵和 64 元面阵比旁瓣,得出圆阵不行的结论,后来才发现是阵元数差太多。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 6:29:38

AnyPS5:在封闭游戏主机上构建跨平台通用抽象层的工程实践

1. 从“AnyPS5”这个名字说起&#xff1a;它到底想解决什么问题第一次看到“AnyPS5”这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率不是一个官方项目&#xff0c;而是一个带着强烈个人色彩的命名。为什么这么说&#xff1f;因为“Any”这个前缀在技术…

作者头像 李华
网站建设 2026/10/12 6:28:28

Vue Router 核心机制与进阶实战:从嵌套路由到权限控制

1. 项目概述&#xff1a;为什么我建议每个Vue开发者都要吃透路由先说结论&#xff1a;Vue Router 是 Vue 单页应用的核心基础设施之一。在我接触前端这几年、前后参与过 30 多个中大型 Vue 项目后&#xff0c;可以负责任地说&#xff0c;路由没学明白&#xff0c;几乎不可能写出…

作者头像 李华
网站建设 2026/10/12 6:26:47

储能系统峰谷套利与调度策略:从收益测算到工程落地的完整拆解

电力系统调度员最头疼的&#xff0c;永远是日负荷曲线上那几个“尖峰时刻”。真正在调度台前待过的人都有体会——早上九点工业负荷一股脑上来&#xff0c;傍晚照明和空调叠加&#xff0c;电话基本没停过&#xff0c;该并的备用机组要并&#xff0c;该顶的顶峰电源要顶&#xf…

作者头像 李华
网站建设 2026/10/12 6:26:24

本地部署27B大模型:量化档位与显存配置实操指南

最近大半年&#xff0c;我隔三差五就会被同一个问题砸中&#xff1a;“我手里有一张 XX 显卡&#xff0c;到底能不能跑本地大模型&#xff1f;”前几天一个做设计的朋友问得更具体——“我想跑开源 27B 参数的 Qwen3.8-27B&#xff0c;显卡是 RTX 4090 24G&#xff0c;内存 64G…

作者头像 李华
网站建设 2026/10/12 6:25:10

adb录屏完全指南:从基础命令到自动化测试实战

用adb录屏这个事&#xff0c;说简单是真简单&#xff0c;一条命令就能开始&#xff1b;说麻烦也是真麻烦&#xff0c;码率、时长、方向、声音&#xff0c;每个环节都有人踩坑。我过去两年在不同项目里反复用adb shell screenrecord&#xff0c;从最开始只会录默认三分钟&#x…

作者头像 李华
网站建设 2026/10/12 6:24:59

dnSpy 6.1.3 + .NET Framework 4.7.2 逆向调试实战指南

简介&#xff1a;dnSpy-6.1.3-net472.zip 是一款面向.NET开发者与逆向分析人员的开源集成调试与反编译工具包&#xff0c;专为Windows平台设计&#xff0c;解决.NET程序动态调试、IL代码逆向还原及二进制级修改等核心需求。资源包大小22.37MB&#xff0c;含x64/x86双架构可执行…

作者头像 李华