阵列天线方向图合成(线阵、面阵)-附Python代码

阵列天线波束赋形

导向矢量

在这里插入图片描述

  • ULA线阵:

    a = 1 N [ 1 , e − j 2 π λ d cos ⁡ θ , ⋯   , e − j 2 π λ ( N − 1 ) d cos ⁡ θ ] T \mathbf{a}={\frac{1}{\sqrt{N}}\left[ 1,e^{-j\frac{2\pi}{\lambda}d\cos\theta},\cdots,e^{-j\frac{2\pi}{\lambda}(N-1)d\cos\theta} \right]^{\mathrm{T}}} a=N 1[1,ejλ2πdcosθ,,ejλ2π(N1)dcosθ]T

  • UPA面阵:

    a U R A = 1 M N [ 1 , ⋯   , e j 2 π λ d sin ⁡ θ [ ( m − 1 ) cos ⁡ ϕ + ( n − 1 ) sin ⁡ ϕ ] , ⋯   , e j 2 π λ d sin ⁡ θ [ ( M − 1 ) cos ⁡ ϕ + ( N − 1 ) sin ⁡ ϕ ] ] T \mathbf{a}_{\mathrm{URA}}=\frac{1}{\sqrt{MN}}[ 1,\cdots,e^{j\frac{2\pi}{\lambda}d\sin\theta[(m-1)\cos\phi+(n-1)\sin\phi]},\cdots,e^{j\frac{2\pi}{\lambda}d\sin\theta[(M-1)\cos\phi+(N-1)\sin\phi]} ]^{\mathrm{T}} aURA=MN 1[1,,ejλ2πdsinθ[(m1)cosϕ+(n1)sinϕ],,ejλ2πdsinθ[(M1)cosϕ+(N1)sinϕ]]T

  • UCR圆阵:

    a U C A = 1 N [ 1 , e j 2 π λ d sin ⁡ θ cos ⁡ ( ϕ − 2 π N ) , ⋯   , e j 2 π λ d sin ⁡ θ cos ⁡ [ ϕ − 2 π N ( N − 1 ) ] ] T . \mathbf{a}_{\mathrm{UCA}}=\frac{1}{\sqrt{N}}[ 1,e^{j\frac{2\pi}{\lambda}d\sin\theta \cos(\phi-\frac{2\pi}{N})},\cdots,e^{j\frac{2\pi}{\lambda}d\sin\theta \cos[\phi-\frac{2\pi}{N}(N-1)]} ]^{\mathrm{T}}. aUCA=N 1[1,ejλ2πdsinθcos(ϕN2π),,ejλ2πdsinθcos[ϕN2π(N1)]]T.

代码仿真

"""
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-轴之间的夹角))
    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*dx*np.cos(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=plt.get_cmap('jet'),
            linewidth=0, antialiased=False, alpha=0.5)
        
        plt.show()
        
    elif sign=='mlab':
        ## #2  mayavi库画图(效果更好)
        from mayavi import mlab
        
        ## 画天线方向图
        s = mlab.mesh(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_ = mlab.mesh(xx, yy, zz, line_width=1.0 )
        #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
"""
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')

仿真结果

ULA方向图
UPA方向图
UPA方向图2

参考文献

[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.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值