天線陣列波束成形原理詳解與仿真實戰
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∑N?wn??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∑N?wn??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?1?ejnλ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 Axes3Dplt.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):continuepositions.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 = 15r_min = -40ax.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、雷達等系統設計至關重要。