阵列信号处理是现代信号处理的一个重要分支,其涉及雷达、声呐、通信、电子侦察等多个领域,应用十分广泛,本系列教程拟通过通俗易懂的python语言,实现阵列信号处理,与大家共同探索阵列信号处理的奥秘。
假定有一个远场平面波信号 s 0 ( t ) s_0(t) s0(t), 以 θ 0 \theta_0 θ0 角度人射到均匀直线线阵, 均匀线阵由 M M M 个阵元等间距 (阵元间距为 d d d ) 排列成一条直线组成, 线阵基线在 x x x 轴, 垂直于阵列的方向为法线方向, 人射方位角 θ 0 \theta_0 θ0 是信号人射方向与线阵法线的夹角, 每个阵元接一部数字接收机,通过推导可得,第 k k k 个接收机收到信号 x k ( t ) x_k(t) xk(t) 为:
x k ( t ) = s 0 ( t + τ k ) = s 0 ( t + ( k − 1 ) d sin θ 0 c ) = A 0 cos [ ω 0 ( t + ( k − 1 ) d sin θ 0 c ) ] = A 0 cos [ 2 π f 0 t + 2 π f 0 ( k − 1 ) d sin θ 0 c ] ( k = 1 , 2 , ⋯ , M ) (2.1) \begin{aligned} &x_k(t)=s_0\left(t+\tau_k\right)=s_0\left(t+\frac{(k-1) d \sin \theta_0}{c}\right)= \\ &A_0 \cos \left[\omega_0\left(t+\frac{(k-1) d \sin \theta_0}{c}\right)\right]= \\ &A_0 \cos \left[2 \pi f_0 t+2 \pi f_0 \frac{(k-1) d \sin \theta_0}{c}\right] \quad(k=1,2, \cdots, M) \\ & \tag {2.1} \end{aligned} xk(t)=s0(t+τk)=s0(t+c(k−1)dsinθ0)=A0cos[ω0(t+c(k−1)dsinθ0)]=A0cos[2πf0t+2πf0c(k−1)dsinθ0](k=1,2,⋯,M)(2.1)
一般情况下, 如果有 P P P 个不同方向的正弦信号, 那么第 k k k 个阵元接收到的信号 x k ( t ) x_k(t) xk(t) 为 P P P 个信号之和, 即:
x k ( t ) = ∑ i = 1 P A i cos [ 2 π f i t + 2 π f i ( k − 1 ) d sin θ i c ] ( k = 1 , 2 , ⋯ , M ) (2.2) x_k(t)=\sum_{i=1}^P A_i \cos \left[2 \pi f_i t+2 \pi f_i \frac{(k-1) d \sin \theta_i}{c}\right] \quad(k=1,2, \cdots, M)\tag {2.2} xk(t)=i=1∑PAicos[2πfit+2πfic(k−1)dsinθi](k=1,2,⋯,M)(2.2)
当某一时刻 t ′ t^{\prime} t′, M M M 个阵元同时采样 (快拍), 得到一次快拍 数据 (空间采样数据), 当接收为单个信号时, 式 ( 2.3 ) (2.3) (2.3) 变为:
x k ( t ′ ) = A 0 cos [ 2 π f 0 t ′ + 2 π f 0 ( k − 1 ) d sin θ 0 c ] = A 0 cos [ 2 π f 0 ( k − 1 ) d sin θ 0 c + 2 π f 0 t ′ ] = A 0 cos [ 2 π ( f 0 d sin θ 0 c ) ( k − 1 ) + 2 π f 0 t ′ ] ( k = 1 , 2 , ⋯ , M ) (2.3) \begin{aligned} x_k\left(t^{\prime}\right)=& A_0 \cos \left[2 \pi f_0 t^{\prime}+2 \pi f_0 \frac{(k-1) d \sin \theta_0}{c}\right]=\\ & A_0 \cos \left[2 \pi f_0 \frac{(k-1) d \sin \theta_0}{c}+2 \pi f_0 t^{\prime}\right]=\\ & A_0 \cos \left[2 \pi\left(f_0 \frac{d \sin \theta_0}{c}\right)(k-1)+2 \pi f_0 t^{\prime}\right] \quad(k=1,2, \cdots, M)\tag {2.3} \end{aligned} xk(t′)=A0cos[2πf0t′+2πf0c(k−1)dsinθ0]=A0cos[2πf0c(k−1)dsinθ0+2πf0t′]=A0cos[2π(f0cdsinθ0)(k−1)+2πf0t′](k=1,2,⋯,M)(2.3)
对式 ( 2.3 ) (2.3) (2.3)进行变换,快拍空间序列可变为:
x k ( t ′ ) = A 0 cos [ 2 π f θ 0 ( k − 1 ) + ϕ θ 0 ] ( k = 1 , 2 , ⋯ , M ) (2.4) x_k\left(t^{\prime}\right)=A_0 \cos \left[2 \pi f_{\theta 0}(k-1)+\phi_{\theta 0}\right] \quad(k=1,2, \cdots, M) \tag {2.4} xk(t′)=A0cos[2πfθ0(k−1)+ϕθ0](k=1,2,⋯,M)(2.4)
其中: f θ 0 = f 0 d sin θ 0 c = d sin θ 0 λ 0 f_{\theta 0} = f_0 \frac{d \sin \theta_0}{c}=\frac{d \sin \theta_0}{\lambda_0} fθ0=f0cdsinθ0=λ0dsinθ0 为空间数字频率 , ϕ θ 0 = 2 π f 0 t ′ \phi_{\theta 0}=2 \pi f_0 t^{\prime} ϕθ0=2πf0t′ 为相位。
当线阵接收为多个空间正弦信号时, M M M 个阵元接收到的信号快拍为:
x k ( t ′ ) = ∑ i = 1 P A i cos [ 2 π f i t ′ + 2 π f i ( k − 1 ) d sin θ i c ] = ∑ i = 1 P A i cos [ 2 π f i d sin θ i c ( k − 1 ) + 2 π f i t ′ ] = ∑ i = 1 P A i cos [ 2 π d sin θ i λ i ( k − 1 ) + 2 π f i t ′ ] ( k = 1 , 2 , ⋯ , M ) (2.5) \begin{aligned} x_k\left(t^{\prime}\right)=& \sum_{i=1}^P A_i \cos \left[2 \pi f_i t^{\prime}+2 \pi f_i \frac{(k-1) d \sin \theta_i}{c}\right]=\\ & \sum_{i=1}^P A_i \cos \left[2 \pi f_i \frac{d \sin \theta_i}{c}(k-1)+2 \pi f_i t^{\prime}\right]=\\ & \sum_{i=1}^P A_i \cos \left[2 \pi \frac{d \sin \theta_i}{\lambda_i}(k-1)+2 \pi f_i t^{\prime}\right] \quad(k=1,2, \cdots, M) \end{aligned}\tag {2.5} xk(t′)=i=1∑PAicos[2πfit′+2πfic(k−1)dsinθi]=i=1∑PAicos[2πficdsinθi(k−1)+2πfit′]=i=1∑PAicos[2πλidsinθi(k−1)+2πfit′](k=1,2,⋯,M)(2.5)
可以看出, 一次快拍的空间序列数据 x k ( t ′ ) ( k = 1 , 2 , ⋯ , M ) x_k\left(t^{\prime}\right)(k=1,2, \cdots, M) xk(t′)(k=1,2,⋯,M) 是 P P P 个正弦离散信号的叠加, P P P 个空间数字频率为
f θ i = d sin θ i λ i ( i = 1 , 2 , ⋯ , P ) (2.6) f_{\theta i}=\frac{d \sin \theta_i}{\lambda_i} \quad(i=1,2, \cdots, P)\tag {2.6} fθi=λidsinθi(i=1,2,⋯,P)(2.6)
其 P P P 个空间频率 f θ i ( i = 1 , 2 , ⋯ , P ) f_{\theta i}(i=1,2, \cdots, P) fθi(i=1,2,⋯,P) 反映了信号的空间分布 ( θ i ) \left(\theta_i\right) (θi) 。
通过上述对空间频率的分析可以发现:
一般为了理论推导方便, 可以认为接收的信号为复信号, 对实信号进行希尔伯特变换就可以得到复信号。
设参考点接收一个人射信号源 s 0 ( t ) s_0(t) s0(t) 为一个复正弦信号, 即
s 0 ( t ) = A 0 exp ( j ω 0 t ) (2.7) s_0(t)=A_0 \exp \left(\mathrm{j} \omega_0 t\right)\tag {2.7} s0(t)=A0exp(jω0t)(2.7)
对于复信号的时间延迟 τ k ( θ 0 ) \tau_k\left(\theta_0\right) τk(θ0) 可以等价为相位延迟 ω 0 τ k ( θ 0 ) \omega_0 \tau_k\left(\theta_0\right) ω0τk(θ0), 那么阵列收到信号为:
[ x 1 ( t ) x 2 ( t ) ⋮ x M ( t ) ] = [ exp ( j ω 0 τ 1 ( θ 0 ) ) exp ( j ω 0 τ 2 ( θ 0 ) ) ⋮ exp ( j ω 0 τ M ( θ 0 ) ) ] s 0 ( t ) (2.8) \left[\begin{array}{c} x_1(t) \\ x_2(t) \\ \vdots \\ x_M(t) \end{array}\right]=\left[\begin{array}{c} \exp \left(\mathrm{j} \omega_0 \tau_1\left(\theta_0\right)\right) \\ \exp \left(\mathrm{j} \omega_0 \tau_2\left(\theta_0\right)\right) \\ \vdots \\ \exp \left(\mathrm{j} \omega_0 \tau_M\left(\theta_0\right)\right) \end{array}\right] s_0(t)\tag {2.8} ⎣⎢⎢⎢⎡x1(t)x2(t)⋮xM(t)⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡exp(jω0τ1(θ0))exp(jω0τ2(θ0))⋮exp(jω0τM(θ0))⎦⎥⎥⎥⎤s0(t)(2.8)
那么:
x ( t ) = a ( θ 0 ) s 0 ( t ) \boldsymbol{x}(t)=\boldsymbol{a}\left(\theta_0\right) s_0(t) x(t)=a(θ0)s0(t)
其中:
a ( θ 0 ) = [ 1 exp ( j ω 0 d sin θ 0 c ) ⋮ exp ( j ω 0 ( M − 1 ) d sin θ 0 c ) ] (2.9) \boldsymbol{a}\left(\theta_0\right)=\left[\begin{array}{c} 1 \\ \exp \left(\mathrm{j} \omega_0 \frac{d \sin \theta_0}{c}\right) \\ \vdots \\ \exp \left(\mathrm{j} \omega_0 \frac{(M-1) d \sin \theta_0}{c}\right) \end{array}\right]\tag {2.9} a(θ0)=⎣⎢⎢⎢⎢⎡1exp(jω0cdsinθ0)⋮exp(jω0c(M−1)dsinθ0)⎦⎥⎥⎥⎥⎤(2.9)
通过上述对方向矢量的分析可以发现:
当有多个信号源时,多个源方向矢量构成阵列方向矢量的集合 A \boldsymbol{A} A , 又称做阵列流形。矢量 a ( θ i ) \boldsymbol{a}\left(\theta_i\right) a(θi) 称为第 i i i 个源 信号的方向矢量 (也称为舵矢量)。
A = [ a ( θ 1 ) , a ( θ 2 ) , ⋯ , a ( θ P ) ] M × P (2.10) \begin{gathered} \boldsymbol{A}=\left[\boldsymbol{a}\left(\theta_1\right), \boldsymbol{a}\left(\theta_2\right), \cdots, \boldsymbol{a}\left(\theta_P\right)\right]_{M \times P} \end{gathered}\tag {2.10} A=[a(θ1),a(θ2),⋯,a(θP)]M×P(2.10)
a ( θ i ) = [ exp ( j ω i τ 1 ( θ i ) ) exp ( j ω i τ 2 ( θ i ) ) ⋮ exp ( j ω i τ M ( θ i ) ) ] (2.11) \begin{gathered} \boldsymbol{a}\left(\theta_i\right)=\left[\begin{array}{c} \exp \left(\mathrm{j} \omega_i \tau_1\left(\theta_i\right)\right) \\ \exp \left(\mathrm{j} \omega_i \tau_2\left(\theta_i\right)\right) \\ \vdots \\ \exp \left(\mathrm{j} \omega_i \tau_M\left(\theta_i\right)\right) \end{array}\right] \end{gathered}\tag {2.11} a(θi)=⎣⎢⎢⎢⎡exp(jωiτ1(θi))exp(jωiτ2(θi))⋮exp(jωiτM(θi))⎦⎥⎥⎥⎤(2.11)
DOA估计的任务就是研究如何由观测信号及阵列结构估计出阵列流形中包含的信源个数及其方向。
对阵列信号的一次快拍 x ( t ′ ) \boldsymbol{x}\left(t^{\prime}\right) x(t′) 进行 DTFT 可以得到连续的频谱 X ( ω θ ) X\left(\omega_\theta\right) X(ωθ) 为
X ( ω θ ) = ∑ n = 0 M − 1 x n ( t ′ ) exp ( − j n ω θ ) (2.12) X\left(\omega_\theta\right)=\sum_{n=0}^{M-1} x_n\left(t^{\prime}\right) \exp \left(-\mathrm{j} n \omega_\theta\right) \tag {2.12} X(ωθ)=n=0∑M−1xn(t′)exp(−jnωθ)(2.12)
其幅度谱 ∣ X ( ω θ ) \mid X\left(\omega_\theta\right) ∣X(ωθ) |峰值个数反映了空间信号数量, 峰值位置反映了信号空间方位分布, 从而得到空间谱(空间幅度谱)。
在实际应用中由 ∣ X ( ω θ ) ∣ \left|X\left(\omega_\theta\right)\right| ∣X(ωθ)∣ 的峰值位置空间频率 ω θ \omega_\theta ωθ 反映的空间信号位置并不直接, 可直接转换为与方位 θ \theta θ 有关的量 X ( θ ) X(\theta) X(θ) 。将空间频率代人变为:
X ( θ ) = ∑ n = 0 M − 1 x n ( t ′ ) exp ( − j 2 π d sin θ λ n ) (2.13) X(\theta)=\sum_{n=0}^{M-1} x_n\left(t^{\prime}\right) \exp \left(-\mathrm{j} 2 \pi \frac{d \sin \theta}{\lambda} n\right)\tag {2.13} X(θ)=n=0∑M−1xn(t′)exp(−j2πλdsinθn)(2.13)
直接搜索 ∣ X ( θ ) ∣ |X(\theta)| ∣X(θ)∣ 的峰值位置 θ \theta θ 来求方位。 ∣ X ( θ ) ∣ |X(\theta)| ∣X(θ)∣ 是连续谱, 对于峰值位置的搜索不可能计算无数个点进行比较, 实际应用中可通过对 36 0 ∘ 360^{\circ} 360∘ 的方位 θ \theta θ 等分,如按 0. 1 ∘ 0.1^{\circ} 0.1∘ 等分成 3600 个角度离散点), 计算离散点的 ∣ X ( θ ) ∣ |X(\theta)| ∣X(θ)∣, 然后搜索峰值位置。
将空间谱写为矢量形式
X ( ω θ ) = ∑ n = 0 M − 1 x n ( t ′ ) exp ( − j n ω θ ) = [ 1 exp ( − j ω θ ) ⋯ exp ( − j n ω θ ) ] [ x 1 ( t ′ ) x 2 ( t ′ ) ⋮ x M ( t ′ ) ] (2.14) \begin{aligned} X\left(\omega_\theta\right)=& \sum_{n=0}^{M-1} x_n\left(t^{\prime}\right) \exp \left(-\mathrm{j} n \omega_\theta\right)=\\ & {\left[\begin{array}{llll} 1 & \exp \left(-\mathrm{j} \omega_\theta\right) & \cdots & \exp \left(-\mathrm{j} n \omega_\theta\right) \end{array}\right]\left[\begin{array}{c} x_1\left(t^{\prime}\right) \\ x_2\left(t^{\prime}\right) \\ \vdots \\ x_M\left(t^{\prime}\right) \end{array}\right]} \end{aligned}\tag {2.14} X(ωθ)=n=0∑M−1xn(t′)exp(−jnωθ)=[1exp(−jωθ)⋯exp(−jnωθ)]⎣⎢⎢⎢⎡x1(t′)x2(t′)⋮xM(t′)⎦⎥⎥⎥⎤(2.14)
那么:
X ( ω θ ) = X ( θ ) = a ( θ ) H x ( t ′ ) = ⟨ a ( θ ) , x ( t ′ ) ⟩ (2.15) X\left(\omega_\theta\right)=X(\theta)=\boldsymbol{a}(\theta)^{\mathrm{H}} \boldsymbol{x}\left(t^{\prime}\right)=\left\langle\boldsymbol{a}(\theta), \boldsymbol{x}\left(t^{\prime}\right)\right\rangle\tag {2.15} X(ωθ)=X(θ)=a(θ)Hx(t′)=⟨a(θ),x(t′)⟩(2.15)
这里我们直接给出结论,详细推导过程可参考《宽带阵列信号波达方向估计理论与方法》。
δ θ = 2 λ M d cos θ (2.16) \delta \theta=\frac{2 \lambda}{M d \cos \theta}\tag {2.16} δθ=Mdcosθ2λ(2.16)
上式表明, 天线阵越长 (近似等于 M d M d Md ), 分辨力越高, 另外分辨力与方位有关, 当 θ = 0 ∘ \theta=0^{\circ} θ=0∘ 时分辨力最高, 偏离天线轴线越大分辨力越差。
# 导入模块
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 生成快拍数据
def gen_signal(fre, t_0, theta, speed, numbers, space):
res = []
for i in range(numbers):
res.append(np.exp(2j*np.pi*fre*t_0 + 2j*np.pi*fre*i*space*np.sin(theta)/speed))
return np.array(res)
# 生成方向矢量
def steer_vector(fre, theta, speed, numbers, sapce):
alphas = []
for i in range(numbers):
alphas.append(np.exp(2j*np.pi*fre*i*space*np.sin(theta)/speed))
return np.array(alphas).reshape(-1, 1)
# 计算空间谱
def cal_spectrum(fre, speed, numbers, space, signal):
mags = []
thetas = np.linspace(-np.pi/2, np.pi/2, 1800)
for _theta in thetas:
_alphas = steer_vector(fre, _theta, speed, numbers, space)
projection = np.matmul(np.conjugate(_alphas).T, signal.reshape(-1, 1))
mags.append(projection[0][0])
mags = np.array(mags)
return thetas/np.pi*180, mags
# 初始化数据
fs = 20000
# 定义源信号
fre = 100
t = np.arange(0, 0.01, 1/fs)
theta1 = -np.pi / 6
theta2 = np.pi / 3
# 传播速度
speed = 340
# 阵元数量
numbers = 32
# 阵元之间距离
space = 1
# 生成模拟快拍数据
signals = []
for t_0 in t:
signal1 = gen_signal(fre, t_0, theta1, speed, numbers, space)
signal2 = gen_signal(fre, t_0, theta2, speed, numbers, space)
signal = signal1 + signal2
signals.append(signal.tolist())
signals = np.array(signals).T
# 计算空间谱
thetas, mags = cal_spectrum(fre, speed, numbers, space, signal)
plt.figure(figsize=(10, 2))
plt.plot(thetas, abs(mags))
plt.xlim(-90, 90)
plt.xlabel('degree')
plt.ylabel('mag')
plt.show()
文中如有错误或不清晰的地方,敬请谅解,可留言指出,笔者将及时答复、更改,希望共同进步,谢谢支持。