[实战] 天线阵列波束成形原理详解与仿真实战(完整代码)
天线阵列波束成形原理详解与仿真实战
1. 引言
在无线通信、雷达和声学系统中,波束成形(Beamforming)是一种通过调整天线阵列中各个阵元的信号相位和幅度,将电磁波能量集中在特定方向的技术。其核心目标是通过空间滤波增强目标方向的信号,同时抑制干扰和噪声。本文将从阵列模型、波束成形原理、数学推导及波束增益计算等方面展开详细分析。
2. 天线阵列模型
2.1 均匀线性阵列(ULA)
假设一个由
N
N
N个各向同性阵元组成的均匀线性阵列(Uniform Linear Array, ULA),阵元间距为
d
d
d。以第一个阵元为参考点,第
n
n
n个阵元的位置为:
x
n
=
(
n
−
1
)
d
(
n
=
1
,
2
,
…
,
N
)
x_n = (n-1)d \quad (n=1,2,\dots,N)
xn=(n−1)d(n=1,2,…,N)
2.2 远场假设
当信号源距离阵列足够远时,入射波可视为平面波。假设信号入射方向与阵列法线方向的夹角为
θ
\theta
θ,则相邻阵元间的相位差为:
Δ
ϕ
=
2
π
d
sin
θ
λ
\Delta \phi = \frac{2\pi d \sin\theta}{\lambda}
Δϕ=λ2πdsinθ
其中
λ
\lambda
λ为波长。
3. 波束成形的基本原理
3.1 阵列响应向量
对于入射角度
θ
\theta
θ,阵列的响应向量(导向向量)为:
a
(
θ
)
=
[
1
,
e
j
Δ
ϕ
,
e
j
2
Δ
ϕ
,
…
,
e
j
(
N
−
1
)
Δ
ϕ
]
T
\mathbf{a}(\theta) = \left[ 1, e^{j\Delta\phi}, e^{j2\Delta\phi}, \dots, e^{j(N-1)\Delta\phi} \right]^T
a(θ)=[1,ejΔϕ,ej2Δϕ,…,ej(N−1)Δϕ]T
3.2 加权合成
通过为每个阵元分配复权重
w
n
w_n
wn,合成输出信号为:
y
(
t
)
=
w
H
x
(
t
)
=
∑
n
=
1
N
w
n
∗
x
n
(
t
)
y(t) = \mathbf{w}^H \mathbf{x}(t) = \sum_{n=1}^N w_n^* x_n(t)
y(t)=wHx(t)=n=1∑Nwn∗xn(t)
其中
w
=
[
w
1
,
w
2
,
…
,
w
N
]
T
\mathbf{w} = [w_1, w_2, \dots, w_N]^T
w=[w1,w2,…,wN]T为权重向量,
x
(
t
)
\mathbf{x}(t)
x(t)为接收信号向量。
3.3 波束方向图
阵列的波束方向图(Array Factor, AF)定义为:
A
F
(
θ
)
=
w
H
a
(
θ
)
=
∑
n
=
1
N
w
n
∗
e
j
(
n
−
1
)
Δ
ϕ
AF(\theta) = \mathbf{w}^H \mathbf{a}(\theta) = \sum_{n=1}^N w_n^* e^{j(n-1)\Delta\phi}
AF(θ)=wHa(θ)=n=1∑Nwn∗ej(n−1)Δϕ
4. 数学推导:波束成形的实现
4.1 相位补偿法
若需使主瓣对准方向
θ
0
\theta_0
θ0,需补偿相邻阵元间的相位差。权重向量设计为:
w
n
=
e
−
j
(
n
−
1
)
2
π
d
sin
θ
0
λ
w_n = e^{-j(n-1)\frac{2\pi d \sin\theta_0}{\lambda}}
wn=e−j(n−1)λ2πdsinθ0
此时,方向图在
θ
0
\theta_0
θ0处达到最大值。
4.2 波束方向图分析
代入权重后,方向图简化为:
A
F
(
θ
)
=
∑
n
=
0
N
−
1
e
j
n
2
π
d
λ
(
sin
θ
−
sin
θ
0
)
AF(\theta) = \sum_{n=0}^{N-1} e^{j n \frac{2\pi d}{\lambda} (\sin\theta - \sin\theta_0)}
AF(θ)=n=0∑N−1ejnλ2πd(sinθ−sinθ0)
利用等比数列求和公式:
A
F
(
θ
)
=
sin
(
N
⋅
π
d
λ
(
sin
θ
−
sin
θ
0
)
)
sin
(
π
d
λ
(
sin
θ
−
sin
θ
0
)
)
AF(\theta) = \frac{\sin\left( N \cdot \frac{\pi d}{\lambda} (\sin\theta - \sin\theta_0) \right)}{\sin\left( \frac{\pi d}{\lambda} (\sin\theta - \sin\theta_0) \right)}
AF(θ)=sin(λπd(sinθ−sinθ0))sin(N⋅λπd(sinθ−sinθ0))
4.3 主瓣与栅瓣
- 主瓣宽度:与 N N N成反比, N N N越大波束越窄。
- 栅瓣条件:当 d / λ > 0.5 d/\lambda > 0.5 d/λ>0.5时,可能出现多个主瓣(栅瓣)。
5. 波束增益计算
5.1 方向性系数
波束增益
G
G
G定义为最大辐射强度与各向同性辐射器的比值:
G
=
4
π
∣
A
F
(
θ
0
)
∣
2
∫
0
2
π
∫
0
π
∣
A
F
(
θ
,
ϕ
)
∣
2
sin
θ
d
θ
d
ϕ
G = \frac{4\pi |AF(\theta_0)|^2}{\int_0^{2\pi} \int_0^{\pi} |AF(\theta,\phi)|^2 \sin\theta d\theta d\phi}
G=∫02π∫0π∣AF(θ,ϕ)∣2sinθdθdϕ4π∣AF(θ0)∣2
对于均匀加权ULA,最大增益近似为:
G
≈
N
⋅
(
4
π
d
λ
)
G \approx N \cdot \left( \frac{4\pi d}{\lambda} \right)
G≈N⋅(λ4πd)
5.2 阵元间距影响
- 最优间距:通常取 d = λ / 2 d = \lambda/2 d=λ/2,以避免栅瓣并最大化增益。
- 过密阵元:间距过小导致互耦效应,降低效率。
5.3 实际增益公式
考虑效率
η
\eta
η后,实际增益为:
G
r
e
a
l
=
η
⋅
N
⋅
G
e
l
e
m
e
n
t
G_{real} = \eta \cdot N \cdot G_{element}
Greal=η⋅N⋅Gelement
其中
G
e
l
e
m
e
n
t
G_{element}
Gelement为单个阵元的增益。
6. 影响波束增益的关键因素
- 阵元数量(N):增益随 N N N线性增加。
- 权重设计:非均匀加权(如切比雪夫加权)可降低旁瓣,但略微减小主瓣增益。
- 频率与带宽:宽带信号需考虑色散效应。
- 阵元方向性:若阵元非各向同性,总增益需乘以阵元方向图。
- 扫描角度:扫描至端射方向( θ = 9 0 ∘ \theta = 90^\circ θ=90∘)时增益下降。
7. 扩展:平面阵列与二维波束成形
对于
M
×
N
M \times N
M×N平面阵列,导向向量为:
a
(
θ
,
ϕ
)
=
a
x
(
θ
,
ϕ
)
⊗
a
y
(
θ
,
ϕ
)
\mathbf{a}(\theta, \phi) = \mathbf{a}_x(\theta, \phi) \otimes \mathbf{a}_y(\theta, \phi)
a(θ,ϕ)=ax(θ,ϕ)⊗ay(θ,ϕ)
其中
⊗
\otimes
⊗表示Kronecker积。增益提升至
M
×
N
M \times N
M×N倍。
8. 仿真
这里直接提供仿真代码和仿真结果:
先说结果,采用32阵元的阵列进行仿真,阵列布局如图如下,阵元间隔0.8
λ
\lambda
λ
仿真在俯仰角60度时,方位角指向不同方向的波束情况如下:
完整代码作为福利,如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 8 22:13:36 2025
@author: neol
"""
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.close('all')
# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] # 黑体
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
# 参数设置
c = 299792458 # 光速
freq = 1268.52e6 # 频率
wavelength = c / freq # 波长
d = wavelength*0.7 # 阵元间距
N = 6 # 网格尺寸(6x6)
theta_res = 1 # 角度分辨率(度)
# 生成阵元位置(四角空缺)
positions = []
for i in range(N):
for j in range(N):
# 排除四个角落(0,0),(0,5),(5,0),(5,5)
if (i==0 and j==0) or (i==0 and j==5) or (i==5 and j==0) or (i==5 and j==5):
continue
positions.append([i*d - (N-1)*d/2, j*d - (N-1)*d/2, 0]) # 中心对齐
positions = np.array(positions)
num_elements = len(positions)
print(f"有效阵元数量: {num_elements}")
# 生成12个目标方向(方位角均匀分布)
num_beams = 12
phi_targets = np.linspace(0, 2*np.pi, num_beams, endpoint=False)
# theta_target = np.pi/2 # 固定俯仰角为90度(水平面)
pitch = 60
theta_target = np.radians(pitch) # 俯仰角设置
# 波束方向图计算函数
def calculate_beam_pattern(weights, positions, wavelength):
theta = np.linspace(0, np.pi, 181)
phi = np.linspace(0, 2*np.pi, 361)
THETA, PHI = np.meshgrid(theta, phi)
# 转换为直角坐标
X = np.sin(THETA) * np.cos(PHI)
Y = np.sin(THETA) * np.sin(PHI)
Z = np.cos(THETA)
pattern = np.zeros_like(THETA, dtype=np.complex128)
# 计算每个阵元的贡献
for i, pos in enumerate(positions):
phase_shift = 2*np.pi/wavelength * (pos[0]*X + pos[1]*Y + pos[2]*Z)
pattern += weights[i] * np.exp(1j*phase_shift)
return 20*np.log10(np.abs(pattern))
# 创建绘图
fig = plt.figure(figsize=(18,12))
fig.suptitle('32-Element Array Beam Patterns (12 Directions)', fontsize=16)
# 为每个波束生成权重并绘图
for beam_idx in range(num_beams):
# 当前目标方向
phi_target = phi_targets[beam_idx]
# 计算导向矢量
steering_vector = np.zeros(num_elements, dtype=np.complex128)
for i, pos in enumerate(positions):
phase = 2*np.pi/wavelength * (
pos[0]*np.sin(theta_target)*np.cos(phi_target) +
pos[1]*np.sin(theta_target)*np.sin(phi_target) +
pos[2]*np.cos(theta_target)
)
steering_vector[i] = np.exp(-1j*phase)
# 归一化权重
weights = steering_vector / np.linalg.norm(steering_vector)
# 计算方向图
pattern = calculate_beam_pattern(weights, positions, wavelength)
# 转换为极坐标并绘图
ax = fig.add_subplot(3, 4, beam_idx+1, projection='polar')
ax.set_theta_offset(np.pi/2)
ax.set_theta_direction(-1)
#标志主瓣方向
r_max = 15
r_min = -40
ax.plot([phi_target, phi_target], [r_min, r_max],
color='red', linestyle='--', linewidth=1.5, alpha=0.8)
phi_plot = np.linspace(0, 2*np.pi, 361)
theta_plot = np.linspace(0, np.pi, 181)
# 提取水平面方向图
horizontal_cut = pattern[:, pitch] # theta=90度
# 绘制极坐标图
ax.plot(phi_plot, horizontal_cut, linewidth=1.5)
ax.set_title(f'Beam {beam_idx+1}\nAzimuth={np.degrees(phi_target):.1f}°\nPitch={pitch:.1f}°', pad=20)
ax.set_rlim(r_min, r_max)
ax.grid(True)
plt.tight_layout()
plt.show()
# 绘制阵列几何布局
plt.figure(figsize=(8,6))
plt.scatter(positions[:,0]/wavelength, positions[:,1]/wavelength, s=50, c='r')
plt.title('Array Geometry (Wavelength Normalized)')
plt.xlabel('X (λ)')
plt.ylabel('Y (λ)')
plt.grid(True)
plt.axis('equal')
plt.show()
9. 结论
天线阵列波束成形通过精确控制各阵元的相位和幅度,实现了信号的空间选择性。其性能直接取决于阵元数量、间距及权重设计。理解其数学本质和增益限制因素,对5G Massive MIMO、雷达等系统设计至关重要。