1. 均匀线性阵列的延迟-求和波束形成
任务说明
本案例实现一个8元均匀线性阵列(ULA)的延迟-求和波束形成器,对远场窄带信号进行空间增强。核心任务包括:计算各阵元相对参考点的时延、构造波束形成权重、绘制波束图(Beam Pattern),并验证主瓣方向与预设指向一致。
理论模型
考虑间距为 \(d\) 的 \(M\) 元均匀线性阵列,远场窄带平面波以入射角 \(\theta\)(相对阵列法线)到达。以第一个阵元为参考,第 \(m\) 个阵元接收信号相对参考点的时延为:
\[ \tau_m(\theta) = \frac{(m-1)d\sin\theta}{c} \]
其中 \(c\) 为声速。延迟-求和波束形成器通过补偿期望方向 \(\theta_0\) 的时延并对各阵元输出求和,实现对 \(\theta_0\) 方向信号的相干叠加增强。波束图定义为:
\[ B(\theta) = \left| \sum_{m=0}^{M-1} w_m e^{-j2\pi f \tau_m(\theta)} \right| \]
其中权重 \(w_m = e^{j2\pi f \tau_m(\theta_0)}\) 用于对齐期望方向相位。
代码实现
import numpy as np
import matplotlib.pyplot as plt
# 参数配置
M = 8 # 阵元数
d = 0.05 # 阵元间距 (m),半波长@3kHz
f = 3400.0 # 信号频率 (Hz)
c = 340.0 # 声速 (m/s)
theta0 = 30.0 # 期望指向角 (度)
# 生成角度扫描范围 (-90° ~ 90°)
theta_scan = np.linspace(-90, 90, 1801)
theta_rad = np.deg2rad(theta_scan)
# 计算各阵元位置
array_pos = np.arange(M) * d
# 期望方向的时延补偿权重
tau0 = array_pos * np.sin(np.deg2rad(theta0)) / c
w = np.exp(1j * 2 * np.pi * f * tau0)
# 计算波束图
B = np.zeros_like(theta_rad, dtype=complex)
for idx, th in enumerate(theta_rad):
tau = array_pos * np.sin(th) / c
steering = np.exp(-1j * 2 * np.pi * f * tau)
B[idx] = np.dot(w, steering)
# 归一化并转换为dB
B_db = 20 * np.log10(np.abs(B) / np.max(np.abs(B)) + 1e-12)
# 绘制波束图
plt.figure(figsize=(10, 6))
plt.plot(theta_scan, B_db, linewidth=2)
plt.xlabel('入射角 (度)')
plt.ylabel('归一化增益 (dB)')
plt.title('8元ULA延迟-求和波束图 (指向30°)')
plt.grid(True, alpha=0.3)
plt.xlim(-90, 90)
plt.ylim(-60, 5)
plt.axvline(x=theta0, color='r', linestyle='--', label=f'指向角 {theta0}°')
plt.legend()
plt.tight_layout()
plt.savefig('beam_pattern.png', dpi=150)
plt.show()
# 输出主瓣峰值位置验证
peak_idx = np.argmax(np.abs(B))
print(f"主瓣峰值角度: {theta_scan[peak_idx]:.2f}°")
print(f"主瓣峰值增益: {20*np.log10(np.max(np.abs(B))):.2f} dB")
关键实现说明
代码首先定义阵列参数并生成扫描角度网格。权重向量 w 通过对期望方向时延取正指数实现相位补偿。波束图计算时,对每个扫描角度构造导向向量并与权重做内积,得到该方向的阵列响应。最后将响应归一化并转换为dB刻度绘制。
验证方法
运行代码后观察以下判定标准:
- 波束图在30°处出现主瓣峰值,且主瓣峰值角度输出值应为30.00°(允许±0.05°误差);
- 主瓣峰值增益应为0 dB(归一化后);
- 波束图关于主瓣方向近似对称,第一零点位置约在 \(\theta_0 \pm \arcsin(\lambda/L)\) 附近,其中 \(L = (M-1)d\) 为阵列孔径;
- 旁瓣电平低于主瓣约-13 dB(均匀加权理论值)。
若输出角度与30°偏差超过0.1°,需检查时延计算公式或角度单位转换是否正确。
运行方式
将代码保存为 ula_delay_sum.py,在安装有NumPy和Matplotlib的Python环境中运行:
python ula_delay_sum.py
程序执行后生成波束图文件 beam_pattern.png,并在控制台输出主瓣峰值角度。若需改变指向角,修改 theta0 变量后重新运行即可。