阵列天线⽅向图合成(线阵、⾯阵)-附Python 代码
阵列天线波束赋形
导向⽮量ULA线阵:UPA⾯阵:
UCR圆阵:代码仿真
"""
2021.12.07 ⽬前导向向量是矩阵形式,考虑后续变成向量形式
"""
import  numpy as  np
import  matplotlib .pyplot as  plt
""" 主要的两个function :
线阵:steeringVectorULA(N, theta, d)
⾯阵:steeringVectorUPA(Nx, Ny, theta, phi, dx, dy)
"""
def  steeringVectorULA (N , theta , d =0.5):
""" 均匀线阵的导向向量
N: 天线个数
theta: 导向⾓
d: 波长的d 倍(默认半波长)
"""
n = np .arange (N )
A = np .exp (1j  * 2*np .pi * d * n * np .cos (theta ))
return  A
def  steeringVectorUPA (Nx , Ny , theta , phi , dx =0.5, dy =0.5):
""" 均匀⾯阵的导向向量
N_x: x 轴维度
N_y: y 轴维度
theta: elevation angle 仰⾓(天顶⾓(原点到点P 的连线与正z-轴之间的夹⾓))
a =1,e ,⋯,e N 1[−j d cos θλ2π−j (N −1)d cos θλ2π]T
a =
URA [1,⋯,e ,⋯,e ]MN 1j d sin θ[(m −1)cos ϕ+(n −1)sin ϕ]λ2πj d sin θ[(M −1)cos ϕ+(N −1)sin ϕ]λ2π
T a =UCA [1,e ,⋯,e ].
N 1j d sin θcos(ϕ−)λ2πN 2πj d sin θcos[ϕ−(N −1)]λ2πN 2πT
theta: elevation angle 仰⾓(天顶⾓(原点到点P的连线与正z-轴之间的夹⾓))
phi: azimuth angle ⽅位⾓(与正x-轴之间的⽅位⾓)
d: 波长的d倍(默认0.5半波长)
"""
A = np.zeros((Nx,Ny),dtype='complex')
for n_x in range(Nx):
for n_y in range(Ny):
A[n_x,n_y]= np.exp(-1j*2*np.pi * np.sin(theta)*(n_x*s(phi)+n_y*dy*np.sin(phi))) return A
def get_directive_gain(g, minDdBi=-20):
"""天线增益化为 dB形式"""
DdBi =10* np.log10(g / np.max(g))
return np.clip(DdBi, minDdBi,None)
def sphere2xzy(theta, phi, R):
""" 球坐标转直⾓坐标
theta: 天顶⾓(原点到点P的连线与正z-轴之间的夹⾓)
phi: ⽅位⾓(与正x-轴之间的⽅位⾓)
R: 原点与点P的距离
"""
X = R * np.sin(theta)* np.cos(phi)
Y = R * np.sin(theta)* np.sin(phi)
Z = R * np.cos(theta)
return X, Y, Z
># 画图的函数
def plot_ULA(theta, gain_ULA):
""" 画线阵的阵列⽅向图
"""
fig = plt.figure()
ax = fig.add_subplot(projection='polar')# 极坐标系
ax.plot(theta, np.abs(gain_ULA))
# dB_gain = get_directive_gain(gain)  ## 还可以把增益转化为 dB 的形式
#    ax.set_rticks([-20, -15, -10, -5])
#    ax.set_rlabel_position(45)
plt.show()
def plot_UPA(THETA, PHI, gain_UPA, sign='matplotlib'):
""" 画平⾯阵的阵列⽅向图
"""
# 先把极坐标转化为直⾓坐标
X,Y,Z = sphere2xzy(THETA, PHI, np.abs(gain_UPA))
if sign =='matplotlib':
### #1  matplotlib库画图
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
plot = ax.plot_surface(
X, Y, Z, rstride=1, cstride=1, _cmap('jet'),
linewidth=0, antialiased=False, alpha=0.5)
plt.show()
elif sign=='mlab':
## #2  mayavi库画图(效果更好)
from mayavi import mlab
## 画天线⽅向图
s = sh(X, Y, Z, line_width=1.0)# representation="wireframe"
## 画⼀个平⾏于xoy轴的平⾯(模拟天线阵列的摆放)
x = np.arange(-10,10,2/Nx)
y = np.arange(-10,10,2/Ny)
xx, yy = np.meshgrid(x,y)
zz = np.zeros(xx.shape)
s_ = sh(xx, yy, zz, line_width=1.0)
#mlab.axes() #  xlabel='x', ylabel='y', zlabel='z'
#mlab.axes() #  xlabel='x', ylabel='y', zlabel='z'
mlab.show()
""" 测试 ULA
"""
N=8
theta = np.linspace(0,2*np.pi,360)
BF =  np.ones(N)### 波束赋形向量
gain_ULA = np.zeros(theta.shape)
for i, tt in enumerate(theta):
sv = steeringVectorULA(N, tt, d=0.5)
gain_ULA[i]= np.dot(sv, BF)
plot_ULA(theta, gain_ULA)
""" 测试 UPA
"""linspace函数python
Nx =8
Ny =8
phi, theta = np.linspace(0,2* np.pi,360), np.linspace(0, np.pi/2,90)
PHI, THETA = np.meshgrid(phi,theta)### ⽣成⽹格
### BF: beamforming 波束赋形矩阵
#BF = np.ones((Nx,Ny),dtype='complex')
BF = steeringVectorUPA(Nx, Ny, np.pi/4, np.pi/4, dx=0.5, dy=0.5).conj()
gain_UPA = np.zeros(THETA.shape,dtype=complex)
for i in range(THETA.shape[0]):
for j in range(THETA.shape[1]):
sv = steeringVectorUPA(Nx, Ny, THETA[i,j], PHI[i,j], dx=0.5, dy=0.5)
gain_UPA[i,j]= np.multiply(sv,BF).sum()
plot_UPA(THETA, PHI, gain_UPA, sign='mlab')
仿真结果
参考⽂献
[1] Z. Xiao et al., “A Survey on Millimeter-Wave Beamforming Enabled UAV Communications and Networking,” in IEEE Communications Surveys & Tutorials, doi: 10.1109/COMST.2021.3124512.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论