ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

均匀直线阵常规波束形成:从原理到仿真实践指南

均匀直线阵常规波束形成:从原理到仿真实践指南

简介:均匀直线阵常规波束形成(CBF)是无线通信、雷达与声纳系统中利用相位差实现信号定向增强的核心技术,适合信号处理初学者和从事阵列信号处理的工程师学习参考,也常用于均匀线阵建模与波束赋形教学演示。压缩包内共2个文件,均为.m脚本,整体仅2KB,两个脚本分别对应波束图绘制与CBF实验,代码轻量,便于在MATLAB中直接运行和修改。已有1693人学习该资源,是理解常规波束形成原理的入门示例。脚本可实现方位谱图计算与常规波束形成权矢量求解,覆盖数据采集、相位校正、权重计算、波束合成及波束扫描等基本流程,直观呈现方位谱图可视化与CBF加权求和两种实现思路,帮助读者理解阵元间距、阵列长度对波束指向和主瓣宽度的影响。借助该资源可快速搭建实验,验证不同权矢量下的波束方向图,也可作为课程设计或工程原型的基础代码进行二次开发。

1. 均匀直线阵常规波束形成:从空域滤波到可落地的第一步

很多人第一次接触“均匀直线阵常规波束形成”时,会以为它是某个数学公式的堆砌,或者是某本教材里一个翻过去就忘的推导。其实它解决的工程问题非常具体:给出一排等间距摆放的传感器(水听器、麦克风、天线阵元),让你把某个方向来的信号“捞出来”,同时把其他方向的干扰压下去。在没有自适应算法、没有超分辨算法介入的前提下,常规波束形成(Conventional Beamforming, CBF)就是最可靠、最直观、最适合作为系统基线(baseline)的实现方案——它等价于对阵列接收数据做一次空域匹配滤波,通过调整各阵元延时或相位补偿,让目标方向的信号同相叠加,从而获得阵增益。

这篇内容适合刚接触阵列信号处理的从业者,也适合已经跑过一些算法但想回头把基础打扎实的工程师。对于新手,你只需要知道阵列几何、窄带信号和傅里叶变换的基本概念,就能把下面的仿真跑通;对于熟手,我会把阵元间距、孔径、加权、信噪比、栅瓣这些参数的边界和坑都摆出来,方便你直接复用。我们不做自适应波束形成,不涉及 MVDR、LCMV 这类进阶主题,只把常规波束形成这一件事做透、做彻底。因为在实际工程里,一个能稳定工作、参数边界清晰的 CBF 实现,往往比一个看起来高级但参数敏感的自适应算法更值得先落地。

2. 为什么选择均匀直线阵:模型推导与仿真设计

2.1 阵列模型:从单个阵元到阵列响应向量

均匀直线阵(Uniform Linear Array, ULA)是阵列信号处理里最简单也最常用的几何模型。假设有 M 个全向阵元,沿 x 轴等间距排列,间距为 d。考虑一个远场窄带平面波信号 s(t),从与阵列法线方向夹角为 θ 的方向入射。所谓“远场”,是指信号源到阵列的距离远大于阵列孔径,此时波前可以近似为平面;所谓“窄带”,是指信号带宽远小于载频,此时信号包络在阵元间的传播延迟内基本不变。这两个假设是所有常规波束形成的基础,也是后续一切推导的前提。

对于第 m 个阵元,它接收到的信号相对参考阵元(通常取第一个阵元)存在一个时延 τ_m = (m-1)d sin θ / c,其中 c 是传播速度。在窄带条件下,时延可以转换为相位差,于是阵列接收数据可以写成向量形式:

x(t) = a(θ) · s(t) + n(t),

其中 n(t) 是噪声向量,a(θ) 称为方向响应向量或导向矢量(steering vector),表达式为:

a(θ) = [1, exp(-j2πd sin θ / λ), ..., exp(-j2π(M-1)d sin θ / λ)]^T。

这个向量刻画的不是信号本身,而是阵列对不同方向入射信号的“相位响应”。它可以预先计算,与接收数据无关,这正是波束形成能以离线方式设计的原因。值得注意的是,相位中出现的频率项由波长 λ 决定,也就是说同样的阵列几何在不同频段上行为完全不同——这是后续选择阵元间距的最核心依据。

2.2 常规波束形成的本质:复加权与同相叠加

常规波束形成器对阵列接收数据 x(t) 做复加权求和,输出 y(t) = w^H x(t),其中权向量取为 w = a(θ_0)(针对观察方向 θ_0)。这意味着我们对每个阵元的信号乘上一个与导向矢量共轭的复系数,把各阵元相位对齐,使得来自 θ_0 方向的信号在各阵元上同相叠加,形成主瓣峰值;而来自其他方向的信号由于相位未对齐,会被部分抵消。

从频域和空域滤波的角度看,这本质上是一个空域 FIR 滤波器:对空间离散采样的信号做加权求和,等价于对空间频率(sin θ 方向)做傅里叶变换。这一视角解释了为什么阵列的方向响应(也称波束图)可以用傅里叶关系来理解——均匀直线阵的波束图近似于 sinc 函数的形状,主瓣宽度由阵列孔径决定,旁瓣电平由加权方式和阵元数决定。

实现时,对一个快拍(snapshot)的数据做波束形成,就是遍历所有关心的扫描角度 θ,每个角度计算一次 w^H x,最后得到输出功率随角度的变化曲线:

P(θ) = |w^H(θ) · x|^2。

这也就是经典的“延迟求和波束形成”在窄带下的复基带形式。工程上,导向矢量可以预先算成一个矩阵(角度 × 阵元),然后对每个快拍做矩阵乘法,计算量非常可控。

2.3 用 Python 实现最小仿真:从接收数据到角度谱

我一般会用 Python 做这类仿真的快速原型,因为矩阵运算和绘图都在一个环境里完成,方便调参。下面给出一个最小可运行的例子,它生成一个 8 阵元、半波长间距的均匀直线阵,接收一个 20° 方向的信号加噪声,利用常规波束形成扫描 -60° 至 60°,输出空间谱。

import numpy as np import matplotlib.pyplot as plt # 基本参数 M = 8 # 阵元数 d_lambda = 0.5 # 阵元间距与波长之比 d/lambda,半波长 theta_target = 20.0 # 信号入射角度(度) SNR_dB = 10 # 信噪比(dB) N_snap = 200 # 快拍数 # 生成导向矢量 def steer_vector(theta_deg, M, d_lambda): theta = np.deg2rad(theta_deg) m = np.arange(M) return np.exp(-1j * 2 * np.pi * d_lambda * m * np.sin(theta)) # 生成接收数据:信号 + 噪声 s = np.exp(1j * 2 * np.pi * 0.1 * np.arange(N_snap)) # 复基带信号 a = steer_vector(theta_target, M, d_lambda) noise_power = 10 ** (-SNR_dB / 10) X = np.outer(a, s) + np.sqrt(noise_power / 2) * ( np.random.randn(M, N_snap) + 1j * np.random.randn(M, N_snap)) # 常规波束形成扫描 scan_angles = np.linspace(-60, 60, 121) power = [] for theta_deg in scan_angles: w = steer_vector(theta_deg, M, d_lambda) y = np.conj(w) @ X # 加权求和 power.append(np.mean(np.abs(y) ** 2)) # 时间平均功率 power_db = 10 * np.log10(power / np.max(power)) plt.plot(scan_angles, power_db) plt.xlabel('入射角度(度)') plt.ylabel('归一化功率(dB)') plt.grid(True) plt.show()

代码里 steer_vector 函数按半波长间距生成导向矢量,核心依据是公式 exp(-j2π·d/λ·m·sinθ)。接收数据 X 用外积方式构造,信号方向由导向矢量 a 确定,噪声为复高斯白噪声,功率按信噪比折算。波束扫描部分把每个角度上的加权输出功率做时间平均,归一化后转为 dB。这里有几个参数值得留意:快拍数 N_snap 影响功率估计的方差,快拍太少会出现旁瓣抖动和主瓣起伏;扫描角度分辨率影响谱线的平滑度,实际应用中建议以 0.5° 或 1° 为步进,不必过密。

2.4 如何验证波束形成的核心结果:主瓣位置与半功率宽度

运行上述代码后,你会看到空间谱在 20° 附近出现峰值,旁瓣低于主瓣大约 13 dB(对于均匀加权)。这个 13 dB 不是巧合,而是均匀直线阵的理论旁瓣电平。验证仿真是否正确,建议做三件事。

第一,检查峰值角度是否等于信号入射角,如果偏差超过 QR 扫描步进一半,说明实现中可能有符号错误。第二,测量半功率波束宽度,理论值近似为 0.886·λ / (M·d·cos θ_0),对 8 阵元、半波长间距、法线方向,这个值约为 12.7°;你可以从谱线上读出半功率点验证。第三,把阵元数改成 16,观察主瓣是否变窄,旁瓣是否下降,这符合孔径增大、角度分辨率提高的预期。这三个验证做完,你的仿真实现基本可以视为正确。

3. 参数如何选:阵元间距、阵元数与加权的三重权衡

3.1 阵元间距:从空间混叠到栅瓣的边界约束

阵元间距 d 必须满足 d ≤ λ/2,这是均匀直线阵最基本的硬约束。原因是 sin θ 的取值区间是 [-1,1],导向矢量在这个区间内的相位变化范围是 [-2πd/λ, 2πd/λ];如果 d 超过 λ/2,不同角度的导向矢量可能出现相同的相位响应,波束图会出现额外的极大值峰,称为栅瓣(grating lobe)。栅瓣的危害在于它会让来自非目标方向的信号以几乎不衰减的增益被接收,相当于空间混叠。

我在实际项目中见过不少在阵列设计阶段就踩了这个坑的案例。例如某跨平台系统的天线阵设计时,为了减少阵元数量而把间距拉大到 0.8λ,结果高频段的方向响应在 ±40° 附近出现等高的栅瓣,测向结果出现周期性错误。排查了半天,最后发现不是算法问题,是阵列几何违反了采样定理。

间距过小也有代价。虽然不出现栅瓣,但阵列有效孔径变小,波束主瓣变宽,角度分辨率下降。工程上一般取 d = λ/2 作为标准值,只有在需要解决空间模糊或特定频段覆盖时才偏移。如果你的系统是宽带工作,必须考虑最低频对应波长的一半作为最大间距,同时还要接受高频段波束宽度变窄带来的扫描范围压缩。

3.2 阵元数:口径、分辨率与成本的对立

阵元数 M 直接决定阵列口径 L = (M-1)d,而口径决定最大角度分辨率。常规波束形成的主瓣宽度与 1/(M·d) 近似成正比,所以提高阵元数是压缩主瓣、提高分辨多个临近目标最直接的手段。但它带来的代价也很明显:每增加一个阵元,意味着增加一整套接收通道(传感器、模拟前端、ADC、校准系数),成本和体积都线性上升。

在声呐和麦克风阵列场景,由于波长相对较大(声速约 1500 m/s,1 kHz 对应波长 1.5 m),要达到几度的波束宽度往往需要很大的物理孔径。我的习惯是先用指标反推阵元数:设定目标波束宽度、工作频率、最大扫描角,然后按公式估算口径,再折算阵元数,最后留出 10% 到 20% 的余量用于通道校准误差和边缘效应。

3.3 加权方式:均匀窗、Hamming 窗与 Dolph-Chebyshev 窗的对比

常规波束形成的权向量并不局限于均匀加权。对导向矢量乘以幅度窗 w_w,可以压低旁瓣,但会加宽主瓣。常见的做法包括均匀加权(最大阵增益、最高旁瓣约 -13 dB)、Hamming 窗(旁瓣约 -43 dB,主瓣加宽约 50%)和 Dolph-Chebyshev 窗(可指定旁瓣电平,主瓣宽度随旁瓣约束变化)。

加权方式第一旁瓣电平(dB)主瓣宽度相对均匀加权的倍数适用场景
均匀窗-13.31.0需要最大 SNR 增益,对旁瓣不敏感
Hamming 窗-42.8约 1.44旁瓣抑制要求中等,实现简单
Dolph-Chebyshev 窗可指定(如 -30、-40)随指定旁瓣增大而变宽对旁瓣有严格指标要求时

你可能会问:CBF 的旁瓣压制到底重不重要?在低信噪比场景,旁瓣的影响不大,因为干扰源本身不强,均匀加权的增益优势能最大化信噪比;但在强干扰场景,比如通信基站附近存在固定方向的发射塔,旁瓣泄漏会直接抬高噪声底,制约可检测的最小信号。这里我给一个经验值:如果环境中强干扰与目标方向夹角大于 20°,旁瓣电平在 -20 dB 以下基本够用;如果夹角可能小到 10° 以内,你应该优先考虑增加阵元数收窄主瓣,而不是一味压低旁瓣——波束形状是物理口径决定的,窗函数只是微调。

3.4 带宽对相位补偿的影响:窄带假设失效的临界点

前面所有推导都建立在窄带假设上:信号带宽远小于中心频率,使相位差能够精确表达为 exp(-j2πd sinθ/λ)。当信号带宽增加到一定程度,阵元间延迟对应的相位变化跨过多个频点,波束的指向会随频率漂移,这种现象称为波束偏斜(beam squint)。判断的粗略标准是:带宽与中心频率之比 B/f_c 超过 10% 时,需要认真考虑宽带波束形成方案,比如使用时域延迟线代替相位补偿,或者划分子带分别做窄带 CBF 再合成。

如果你必须在窄带框架下处理一定带宽的信号,折中方案是使用阵列中心频率的相位补偿,并接受主瓣指向在频带边缘的偏差。偏差量估算为 Δθ ≈ -(Δf/f_c)·tan θ_0,这里的 θ_0 是扫描角。例如在 3 GHz 中心频率、200 MHz 带宽、指向 45° 时,频带边缘的波束偏斜约 2.7°,大多数场景下可以接受,但如果你正在做高精度的测向,这个值就可能让你翻车。

4. 实现与验证中常见问题排查:从静默失效到系统性偏差

4.1 信号源角度与谱峰角度对不上:查坐标系和符号

现象:仿真中设定信号来自 20°,但输出谱峰出现在 -20° 或 70°。原因是导向矢量定义中 sin θ 的正负号、阵列轴向定义或扫描角度方向约定不一致。解决方法是固定一套坐标系约定:通常定义信号入射方向与阵列法线的夹角,正方向为从 x 轴正向看向 y 轴正向;导向矢量统一用 exp(-j2πd sinθm),扫描时使用相同的约定。只要代码中符号一致,正负号问题就能消除。另一个常见原因是角度单位混用,deg2rad 漏掉后低角度区接近 0,高角度区偏离原值,表现为曲线压缩或拉伸。

4.2 高角度扫描时谱峰坍塌:这是 cos 项在作怪

现象:信号从 60° 入射时,谱峰幅度明显低于 0°,或峰形变宽。原因是波束宽度随扫描角变化,主瓣宽度近似与 1/cos θ 成正比,在大扫描角下主瓣变宽、峰值增益略微下降。这不是实现错误,而是均匀直线阵的固有特性。解决办法一是接受它,在检测阈值设计时按角度变化设置自适应门限;二是把阵列架构改为圆形阵或均匀面阵,从几何上削弱这种角度依赖。如果必须用直线阵且要求大范围扫描,可以考虑在后续处理中按角度做增益补偿,补偿量为 cos θ 的倒数。

4.3 谱线毛刺多、峰值不稳定:快拍数太少与信号非平稳

现象:同一仿真参数多次运行,谱峰位置最多差 3°,旁瓣起伏明显。原因是快拍数 N_snap 太少,功率估计方差大;或者信号本身是间歇性的,快照内并非平稳。解决办法是增加快拍数到 500 以上,或者改用频域累积(对多个频点做平均)。若信号非平稳,可以把时间数据分块做短时波束形成再非相干累加。这里有一条经验法则:要求谱峰估计标准差小于 1°,信噪比在 0 dB 时至少需要 100 个独立快拍;低信噪比下需要的快拍数按信噪比的平方增长。

4.4 通道增益不一致导致旁瓣升高:校准是唯一解

现象:阵列实测数据做 CBF,旁瓣明显高于理论值,主瓣形状不对称。原因是各通道幅度和相位响应不一致,常见于模拟前端滤波器和 ADC 通道间的离散性。解决方法是做通道校准:注入已知信号,估计各通道的复增益,然后在导向矢量中逐阵元乘上校准系数。校准系数的精度直接影响旁瓣水平,要获得 -30 dB 的旁瓣,幅度不一致需控制在 0.3 dB 以内,相位不一致需要控制在 2° 以内。如果做不到,使用均匀加权就没有意义,旁瓣可能劣化到 -10 dB 以下。

4.5 已知干扰方向的零陷无法手动设置:CBF 的边界

现象:使用 CBF 时,一个强干扰在 40° 方向,目标在 20° 方向,即使波束对准 20°,干扰泄漏依然抬高基底。原因是常规波束形成只在单一方向形成主瓣,无法同时对特定方向形成零陷。这是 CBF 的结构性局限,不是参数问题。如果需要抑制方向已知的强干扰,需要使用自适应波束形成(如 MVDR 或线性约束最小方差),或者在 CBF 后处理中做干扰对消。但对于初步检测来说,正确的做法是把干扰抑制需求写进系统指标,然后增加阵元数、压低旁瓣或者调整阵列结构,而不是在 CBF 框架内硬求。

5. 进阶验证与实用技巧:把白板仿真推向可交付

5.1 用半功率带宽和旁瓣电平给波束图做“体检”

当你完成一个 CBF 实现,不要只看谱峰位置就宣告完成。我通常会对波束图做三项定量检查,作为交付质量的门禁。第一是主瓣方向误差,要求与信号真值偏差小于扫描步进。 第二是半功率波束宽度,与理论值对比,偏差超过 10% 时说明加权或阵元位置有问题。第三是最高旁瓣电平,与选定窗函数的理论值对比,超过 2 dB 时说明幅度/相位误差超标或窗函数未正确施加。这三项指标能快速区分“算法实现”和“系统实现”之间的差距。

5.2 多目标分辨的极限:Rayleigh 准则的实践尺度

常规波束形成的角度分辨能力受瑞利准则约束:两个等强度目标的角度间隔小于主瓣宽度时,无法在谱上区分。实际工程中,我常以主瓣宽度的 0.8 到 1.2 倍作为能否分辨的临界经验值。如果你有两个相隔 8° 的目标,而阵列主瓣宽度是 10°,它们会合成一个宽峰,看起来像一个目标;当你把阵元数从 8 加到 12,主瓣缩到约 6°,两个峰就清晰分离。在做目标检测类的应用时,这一项直接决定你能否把“多目标场景”写进交付文档。

5.3 乘性白噪声条件下 SNR 增益的验证公式

CBF 的阵增益等于阵元数 M,这是一个值得验证的结论。具体操作是:在输入信噪比固定时,测量波束形成输出的 SNR,对比单阵元 SNR,差值应接近 10·log10(M) dB。如果测得的增益明显偏低,优先检查通道校准和信号带宽是否满足窄带假设。在 8 阵元阵列、10 dB 输入信噪比下,输出信噪比理论为 19 dB,实测通常为 17 到 18.5 dB,落差主要来自加权窗的扫描损耗和有限快拍估计偏差。意识到这点,你就不会在拿到测试数据后怀疑算法写错了。

5.4 一个能提速十倍的处理技巧:预计算导向矢量矩阵

当扫描角度很多、快拍数很大时,逐角度循环做矩阵向量乘法的效率很低。更高效的做法是把所有扫描角度的导向矢量拼成一个矩阵 A_scan(维度为 角度数 × M),然后对每个快拍做一次矩阵乘法得到所有角度的输出:

A_scan = np.stack([steer_vector(th, M, d_lambda) for th in scan_angles]) Y = A_scan @ X # 每一行是一个角度的波束输出时间序列 P = np.mean(np.abs(Y)**2, axis=1)

这段代码把循环里的 Python 派发开销转移到一次矩阵乘法上,在 121 个角度、200 快拍、8 阵元的规模下,速度大约能提升 5 到 15 倍。如果角度数和阵元数继续增大,可以改用批量矩阵乘法或卷积方式实现同样的运算。

另一个效率相关的习惯是:如果只需要扫描窄角度范围(比如 -15° 到 15°),不要做全角度扫描,先对接收数据做一次空域 FFT 粗估计、再细化扫描。因为均匀直线阵的导向矢量在 sin θ 域等间隔采样时恰好是 DFT 矩阵的行,角度谱就等于接收数据的空间傅里叶变换。用 FFT 一次得到全部等间隔角度的输出,再做局部补偿精化,这在相控阵和雷达系统中是标准做法。常规波束形成在这个意义上是所有更先进波束形成器的地基——它简单、透明、可解释,任何复杂算法在交付前都应该先以 CBF 做基准对比。

回到我自己的项目习惯:每次做新的阵列方案,我都会先写一版 CBF 仿真并让它在多组信噪比、角度、阵元数组合下输出体检指标,确认没有实现错误,才放心地在其上叠加自适应算法或测向模块。这套流程省去过很多半夜查 bug 的时间。CBF 不是一个“需要被取代”的旧算法,而是一把直尺、一个校准源和一个兜底方案。希望这篇笔记能帮你把这一步走得稳,也把你的第一个 CBF 仿真做成以后所有阵列实验的基准。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进