UWB AOA原理
如下图所示,远场入射的平行波,入射到距离间隔
L
=
λ
/
2
L=\lambda /2
L=λ/2的两根天线,那么到达两个接收天线的信号具有相位差,
△
ϕ
=
2
∗
π
∗
L
∗
s
i
n
(
α
)
/
λ
\bigtriangleup \phi =2* \pi*L*sin(\alpha) / \lambda
△ϕ=2∗π∗L∗sin(α)/λ,其中
α
\alpha
α 是入射波和垂直虚线的夹角,所以代入
L
=
λ
/
2
L=\lambda /2
L=λ/2,我们可以得到
α
=
a
r
c
s
i
n
(
△
ϕ
/
π
)
\alpha =arcsin(\bigtriangleup \phi / \pi)
α=arcsin(△ϕ/π),所以入射角和相位差存在arcsin关系,也是单调的一对一关系。这里的假设是远场入射波,远场和近场的距离差别一般以
2
D
2
/
λ
2D^{2}/ \lambda
2D2/λ为界限,超过这个值可以定义为远场,其中D代表天线尺寸,以D=2cm为例,对于channel 9信号来说超过14——17cm都可以认为是远场入射平行波,小于这个距离的,要根据具体距离差定义入射角度和入射相位差的关系。
代码仿真
import numpy as np
import matplotlib.pyplot as plt
from scipy import constants
##定义参数
carrier_freq=7.9e9 #in Hz channel 9
wavlen=constants.c/carrier_freq # in meter
## 生成天线位置
ant0=[0,0] # orginal
ant1=[wavlen/2,0]
ant2=[0,wavlen/2]
ant_pos=np.array([ant0,ant1,ant2])
plt.plot(ant_pos[:,0],ant_pos[:,1],"bs")
3D角度测量
为了测量水平入射角和俯仰入射角,我们放置三个天线成L型布置,x轴两颗天线来测量水平入射角,y轴上的两个天线来测量俯仰入射角,但是我们的NCJ29D6只有连个入射通道,那么怎么同时测量水平入射角和俯仰入射角呢,这里需要用到多组STS信号,我们在SYNC和STS以及STS和STS之间通过切换前端射频开关的形式来选择不同天线,已达到水平入射角和俯仰入射角的测量。具体测量如下图所示:
SYNC序列中我么测量的A1和A3之间的相位差也就是result0,这里我们配置了4个STS,Result5就是测量天线A1和A2之间的相位差。我们以水平为例,通过仿真来查看相位差pdoa和doa角度之间的关系
#入射角度
ant0=[0,0] # orginal
ant1=[wavlen/2,0]
ant2=[0,wavlen/2]
alpha_degree=np.linspace(-60,60,21)
pdoa=[]
distance_target=5 #in meter
for a in alpha_degree:
x_target=distance_target*np.sin(np.deg2rad(a))
y_target=distance_target*np.cos(np.deg2rad(a))
target_pos=np.array([x_target,y_target])
target_ant0_distance=np.sqrt(np.sum((target_pos-np.array(ant0))**2))
target_ant1_distance=np.sqrt(np.sum((target_pos-np.array(ant1))**2))
delta_distance=target_ant0_distance-target_ant1_distance
delta_phase=2*np.pi*delta_distance/wavlen
pdoa.append(delta_phase)
pdoa_degree=np.degrees(pdoa)
aoa_calc=np.arcsin(np.array(pdoa)/np.pi)
aoa_calc_deg=np.degrees(aoa_calc)
plt.plot(alpha_degree,pdoa_degree,label="pdoa phase difference")
plt.plot(alpha_degree,aoa_calc_deg,label="calculated value vs incident value in degrees")
plt.xlabel("aoa in degrees")
plt.ylabel("in degrees")
3D空间内的AOA与PDOA的关系
上述示例代码演示的是二维平面平面内的pdoa和aoa的关系,现在我们来模拟3D空间中,在不同的高度上来测量水平入射角的还原信息,理论上物体的高度信息,不影响水平入射角的测量。仿真代码如下,有下图图中我们能能到,水平入射角的不论高度如何,都能够完美还原
ant0=[-wavlen/4,0,0]
ant1=[wavlen/4,0,0]
theta_deg=np.linspace(-60,60,3)
alpha_degree=np.linspace(-60,60,21)
distance_target=15 #in meter
for t in theta_deg:
pdoa_deg=[]
for a in alpha_degree:
#z_target=distance_target*np.sin(np.deg2rad(t))
#x_target=distance_target*np.cos(np.deg2rad(t))*np.sin(np.deg2rad(a))
#y_target=distance_target*np.cos(np.deg2rad(t))*np.cos(np.deg2rad(a))
x_target=distance_target*np.sin(np.deg2rad(a)) ##yz平面决定了入射角alpha,所以要往yz平面投影
y_target=distance_target*np.cos(np.deg2rad(a))*np.sin(np.deg2rad(t))
z_target=distance_target*np.cos(np.deg2rad(a))*np.cos(np.deg2rad(t))
target_pos=np.array([x_target,y_target,z_target])
target_ant0_distance=np.sqrt(np.sum((target_pos-np.array(ant0))**2))
target_ant1_distance=np.sqrt(np.sum((target_pos-np.array(ant1))**2))
delta_distance=target_ant0_distance-target_ant1_distance
delta_phase=2*np.pi*delta_distance/wavlen
pdoa_deg.append(np.degrees(delta_phase))
pdoa_rad=np.radians(pdoa_deg)
aoa_calc=np.arcsin(pdoa_rad/np.pi)
aoa_calc_deg=np.degrees(aoa_calc)
plt.plot(alpha_degree,aoa_calc_deg,label=f"theta:{np.round(t,0)}degrees")
plt.legend()
plt.xlabel("aoa in degrees")
plt.ylabel("aoa_calculated in degrees")
在实际测量中,不同目标高度,其水平角测量值之间有一些差异,这个差异是天线辐射特性不一致造成的,如果天线增益是一个复数,那么天线在各个方向上的增益并不一致,这样造成了即便是相同水平入射角,但是如果目标的高度不同,其pdoa的相位差并不一致,原因是天线在不同高度上呈现的增益不一样。从下图中,我们看到在水平入射角是20度情况下,俯仰角
β
=
5
4
0
\beta =54^{0}
β=540它的水平角测量值出现了较大的误差,说明天线在
β
=
5
4
0
\beta =54^{0}
β=540,水平入射角在20度情况下,天线特性出现了很大的差异,这种差异要么是天线增益太低,导致信号信噪比低,出现误差,要么是天线在此处有个明显的相位变化。
天线校准
实际过程中,为了补偿不同高度对水平测量角的误差,我们需要校准天线辐射图不一致或者不规则造成的误差,标准做法是测量记录天线在不同俯仰角以及不同入射角情况下的测量误差,做成表格,进行查表补偿这个误差。典型表格如下:
由于同样的原因,不同水平角度也会对俯仰角测量带来误差,所以对俯仰角也需要测量一个类似表格。在校准过程中,现根据俯仰aoa得出一个大致的俯仰入射角度,根据得到的俯仰入射角度,校准水平入射角度,根据得到的水平入射角度进而查表校准俯仰入射角角度,这个过程要重复几次以便得到准确的俯仰和水平入射角。
NXP芯片
针对以上校准过程,NXP内置了校准算法,我们只需要按照NXP要求提供,提供相应的测量结果即可,过程使用简单,测量结果准确。
演示视频
笔者在安富利开发了一款基于NXP SR150的UWB 评估板,SR150采用UCI接口,类似模组,在视频中,我们用了两个评估板,一个评估板作为initiator,另一个评估板作为responder,initiator固定在屏幕前不懂,笔者手动移动responder,从视频中可以清晰的看到,UWB准确的测量了responder相对于initiator的AOA和距离,并准确的记录了轨迹。基于这个应用,后续笔者会开发指向性鼠标,游戏手柄的产品。
uwb