2. 均匀直线阵与均匀圆阵的几何建模

波束形成的全部数学推导,都建立在“阵元在哪里、信号从哪个方向来”这两个几何事实之上。几何建模的任务,就是把物理阵列抽象为一组可计算的坐标,并由此导出方向向量与阵列流形。本节以最常用的均匀直线阵(ULA)和均匀圆阵(UCA)为对象,把定义、约定与代码实现一次讲清。

一、坐标约定与阵元位置

建模前必须先固定参照系,否则后续所有相位符号都会混乱。本课程统一采用右手直角坐标系:阵列位于 xOy 平面内,z 轴指向阵列法向(正前方);方位角 θ 从 z 轴量起(即与法向的夹角,0° 为正前方),俯仰/周向角 φ 在 xOy 平面内从 x 轴逆时针量起。远场平面波的单位方向向量为

u = [sinθ·cosφ, sinθ·sinφ, cosθ]ᵀ

对位于 pm 的第 m 个阵元,相对参考阵元的时延为 τm = −pmᵀu / c,对应窄带信号的空间相位为 ψm = −k·pmᵀu,其中波数 k = 2π/λ。注意负号来自“信号先到达靠近来波方向的阵元”,这一符号约定在全文与图示中保持一致。

均匀直线阵:N 个阵元沿 x 轴等间距 d 排列,取首阵元为参考点,则 pm = [(m−1)d, 0, 0]ᵀ,m = 1,…,N。此时 pmᵀu = (m−1)d·sinθ·cosφ,若来波位于 xOz 平面(φ = 0),退化为熟悉的 (m−1)d·sinθ。为避免栅瓣,通常要求 d ≤ λ/2。

均匀圆阵:N 个阵元均匀分布在半径 r 的圆周上,第 m 个阵元的周向角为 φm = 2π(m−1)/N,位置为 pm = [r·cosφm, r·sinφm, 0]ᵀ。UCA 没有“首阵元在轴上”的天然参考,通常取圆心为相位参考点,或取 0 号阵元为参考,二者只差一个公共相位因子,不影响波束形状,但会影响流形矩阵的具体数值,建模时必须声明。

均匀直线阵 ULA(沿 x 轴) x z 0 1 2 3 4 d 来波方向 u θ p_m = [(m−1)d, 0, 0]ᵀ 均匀圆阵 UCA(xOy 平面) x y 圆心 0 1 2 3 4 5 6 7 r φ_m p_m = [r·cosφ_m, r·sinφ_m, 0]ᵀ,φ_m = 2π(m−1)/N

二、方向向量与阵列流形

把 N 个阵元的空间相位排成列向量,就得到该方向上的方向向量(steering vector):

a(θ, φ) = [e−jk·p₁ᵀu, e−jk·p₂ᵀu, …, e−jk·p_Nᵀu]ᵀ

当方向 (θ, φ) 在感兴趣的空域内连续变化时,所有方向向量构成的集合 {a(θ, φ)} 称为阵列流形(array manifold)。它是阵列的“指纹”:ULA 的流形是一维曲线(只依赖 θ),UCA 的流形是二维曲面(依赖 θ 与 φ),这也是圆阵能实现全方位无模糊测向的几何根源。实际计算时通常把空域离散为网格,得到 N×L 的流形矩阵 A,其中 L 为网格点数。

对 ULA,若取 d = λ/2、φ = 0,则 a(θ) 的第 m 个元素为 exp(−jπ(m−1)sinθ),这正是 Vandermonde 结构,可用 FFT 快速扫描;对 UCA,由于 pmᵀu = r·sinθ·cos(φ−φm),流形元素为 exp(−jkr·sinθ·cos(φ−φm)),它含有贝塞尔函数展开,不具备 Vandermonde 结构,因此 UCA 的波束形成通常需要显式构造流形矩阵或做模式空间变换。

三、MATLAB 与 Python 建模实现

下面给出可直接运行的建模函数。示例参数:工作频率 f = 3 kHz,声速 c = 1500 m/s,故 λ = 0.5 m;ULA 取 N = 8、d = 0.25 m(λ/2);UCA 取 N = 8、r = 0.3 m。这些数值仅作教学示例。

% MATLAB: 构造 ULA 与 UCA 的阵元坐标与流形矩阵
c = 1500; f = 3000; lambda = c/f; k = 2*pi/lambda;

N = 8;
d = lambda/2;
p_ula = [(0:N-1)'*d, zeros(N,1), zeros(N,1)];      % N×3

r = 0.3;
phi_m = 2*pi*(0:N-1)'/N;
p_uca = [r*cos(phi_m), r*sin(phi_m), zeros(N,1)];  % N×3

theta = (0:1:90)*pi/180;  phi = 0;                  % 扫描网格
u = [sin(theta)*cos(phi); sin(theta)*sin(phi); cos(theta)];  % 3×L

A_ula = exp(-1j*k*(p_ula*u));   % N×L 流形矩阵
A_uca = exp(-1j*k*(p_uca*u));
# Python (NumPy): 等价的建模实现
import numpy as np
c, f = 1500.0, 3000.0
lam = c / f; k = 2 * np.pi / lam
N = 8

p_ula = np.column_stack([np.arange(N) * lam / 2,
                         np.zeros(N), np.zeros(N)])

phi_m = 2 * np.pi * np.arange(N) / N
p_uca = np.column_stack([0.3 * np.cos(phi_m),
                         0.3 * np.sin(phi_m),
                         np.zeros(N)])

theta = np.deg2rad(np.arange(0, 91, 1))
u = np.vstack([np.sin(theta), np.zeros_like(theta),
               np.cos(theta)])          # 3×L, phi=0

A_ula = np.exp(-1j * k * (p_ula @ u))   # N×L
A_uca = np.exp(-1j * k * (p_uca @ u))

代码中有三个容易出错的点值得强调。第一,矩阵乘法 p @ u 的结果是 N×L,每一列对应一个扫描方向,务必确认维度顺序,否则会把阵元维和角度维搞反。第二,相位符号必须与前面的时延定义一致;若把 exp(−j…) 写成 exp(+j…),常规波束形成得到的谱峰位置会镜像翻转,在 θ 接近 0° 时不易察觉,在大角度时误差明显。第三,UCA 的参考点选择要与后续导向矢量、协方差矩阵处理保持一致,混用圆心参考与 0 号阵元参考会引入随阵元编号变化的附加相位。

四、结果检查与常见问题

建模完成后不要急于做波束图,先做两项自检。其一,检查 a(0°) 是否全为 1:正前方来波时各阵元等相位,这是最直接的符号与参考点校验。其二,对 ULA 检查相邻阵元相位差是否等于 −π·sinθ(d = λ/2 时),例如 θ = 30° 应得到 −π/2。若这两项通过,流形矩阵基本可信。

常见问题包括:阵元坐标用了行向量导致广播错误;角度单位混用度与弧度;UCA 半径取得过小导致有效孔径不足、分辨力下降,或取得过大在宽频带内出现空间混叠。工程上 UCA 的半径常按最高工作频率的波长选取,使 r/λ 落在合适区间,兼顾孔径与无模糊测向。把这些几何参数与流形矩阵的构造固定成可复用函数,后续的协方差估计、常规波束形成与高分辨算法才能在同一套几何约定下稳定衔接。