文章目录

  • 一、概述
  • 二、空间谱的概念
  • 2.1 均匀直线阵的输入信号
  • 2.2 均匀直线阵的空间频率
  • 2.3 均匀直线阵信号方向矢量
  • 2.4 均匀直线阵的空间傅里叶变换
  • 2.5 空间分辨率
  • 三、python语言实现空间谱变换
  • 四、Tips


一、概述



  阵列信号处理是现代信号处理的一个重要分支,其涉及雷达、声呐、通信、电子侦察等多个领域,应用十分广泛,本系列教程拟通过通俗易懂的python语言,实现阵列信号处理,与大家共同探索阵列信号处理的奥秘。

二、空间谱的概念

2.1 均匀直线阵的输入信号

fork信号 python python信号处理教程_阵列信号处理


图2.1 线阵接收平面波示意图

fork信号 python python信号处理教程_阵列信号处理_02, 以 fork信号 python python信号处理教程_fork信号 python_03 角度人射到均匀直线线阵, 均匀线阵由 fork信号 python python信号处理教程_信号处理_04 个阵元等间距 (阵元间距为 fork信号 python python信号处理教程_python_05 ) 排列成一条直线组成, 线阵基线在 fork信号 python python信号处理教程_python_06 轴, 垂直于阵列的方向为法线方向, 人射方位角 fork信号 python python信号处理教程_fork信号 python_03 是信号人射方向与线阵法线的夹角, 每个阵元接一部数字接收机,通过推导可得,第 fork信号 python python信号处理教程_信号处理_08 个接收机收到信号 fork信号 python python信号处理教程_信号处理_09 为:
fork信号 python python信号处理教程_信号处理_10

fork信号 python python信号处理教程_阵列信号处理_11 个不同方向的正弦信号, 那么第 fork信号 python python信号处理教程_信号处理_08 个阵元接收到的信号 fork信号 python python信号处理教程_信号处理_09fork信号 python python信号处理教程_阵列信号处理_11 个信号之和, 即:
fork信号 python python信号处理教程_python_15

2.2 均匀直线阵的空间频率



fork信号 python python信号处理教程_阵列信号处理_16, fork信号 python python信号处理教程_信号处理_04 个阵元同时采样 (快拍), 得到一次快拍 数据 (空间采样数据), 当接收为单个信号时, 式 fork信号 python python信号处理教程_阵列信号处理_18 变为:
fork信号 python python信号处理教程_信号处理_19

fork信号 python python信号处理教程_阵列信号处理_18进行变换,快拍空间序列可变为:
fork信号 python python信号处理教程_python_21

fork信号 python python信号处理教程_python语言_22 为空间数字频率 , fork信号 python python信号处理教程_fork信号 python_23

fork信号 python python信号处理教程_信号处理_04 个阵元接收到的信号快拍为:
fork信号 python python信号处理教程_阵列信号处理_25

fork信号 python python信号处理教程_阵列信号处理_26fork信号 python python信号处理教程_阵列信号处理_11 个正弦离散信号的叠加, fork信号 python python信号处理教程_阵列信号处理_11 个空间数字频率为
fork信号 python python信号处理教程_阵列信号处理_29

fork信号 python python信号处理教程_阵列信号处理_11 个空间频率 fork信号 python python信号处理教程_python语言_31 反映了信号的空间分布 fork信号 python python信号处理教程_fork信号 python_32

  通过上述对空间频率的分析可以发现:

  • 对于频率相同的多个信号 fork信号 python python信号处理教程_阵列信号处理_33 相同 fork信号 python python信号处理教程_python_34, 由于来波方向不同 fork信号 python python信号处理教程_fork信号 python_35 不同 fork信号 python python信号处理教程_python_34 时, 那么空间频率 fork信号 python python信号处理教程_信号处理_37
  • 当信号方向相同 ( fork信号 python python信号处理教程_阵列信号处理_38 相同), 频率不同 ( fork信号 python python信号处理教程_阵列信号处理_39 不同) 时, 那么空间频率 fork信号 python python信号处理教程_信号处理_37

2.3 均匀直线阵信号方向矢量



  一般为了理论推导方便, 可以认为接收的信号为复信号, 对实信号进行希尔伯特变换就可以得到复信号。

fork信号 python python信号处理教程_阵列信号处理_02 为一个复正弦信号, 即
fork信号 python python信号处理教程_python_42

fork信号 python python信号处理教程_阵列信号处理_43 可以等价为相位延迟 fork信号 python python信号处理教程_fork信号 python_44, 那么阵列收到信号为:
fork信号 python python信号处理教程_python语言_45
  那么:
fork信号 python python信号处理教程_阵列信号处理_46
  其中:
fork信号 python python信号处理教程_python_47

  通过上述对方向矢量的分析可以发现:

  • 方向矢量由各个阵元的相位延迟 fork信号 python python信号处理教程_python_48 组成。
    26
  • 每次快拍 fork信号 python python信号处理教程_信号处理_49 矢量不同, 但不同快拍各个阵元相位延迟不变, 因此方向矢量 fork信号 python python信号处理教程_python语言_50
  • 方向矢量由各个阵元相位延迟组成, 相位延迟又由来波方向、阵元位置与信号中心频率决定, 因此方向矢量可以反映来波方向与信号的中心频率。

fork信号 python python信号处理教程_信号处理_51 , 又称做阵列流形。矢量 fork信号 python python信号处理教程_python_52 称为第 fork信号 python python信号处理教程_阵列信号处理_53

fork信号 python python信号处理教程_python语言_54

fork信号 python python信号处理教程_阵列信号处理_55

  DOA估计的任务就是研究如何由观测信号及阵列结构估计出阵列流形中包含的信源个数及其方向。

2.4 均匀直线阵的空间傅里叶变换



fork信号 python python信号处理教程_阵列信号处理_56 进行 DTFT 可以得到连续的频谱 fork信号 python python信号处理教程_阵列信号处理_57
fork信号 python python信号处理教程_python语言_58
  其幅度谱 fork信号 python python信号处理教程_python_59

fork信号 python python信号处理教程_python语言_60 的峰值位置空间频率 fork信号 python python信号处理教程_阵列信号处理_61 反映的空间信号位置并不直接, 可直接转换为与方位 fork信号 python python信号处理教程_python_62 有关的量 fork信号 python python信号处理教程_python_63 。将空间频率代人变为:
fork信号 python python信号处理教程_fork信号 python_64
  直接搜索 fork信号 python python信号处理教程_阵列信号处理_65 的峰值位置 fork信号 python python信号处理教程_python_62 来求方位。fork信号 python python信号处理教程_阵列信号处理_65 是连续谱, 对于峰值位置的搜索不可能计算无数个点进行比较, 实际应用中可通过对 fork信号 python python信号处理教程_python_68 的方位 fork信号 python python信号处理教程_python_62 等分,如按 fork信号 python python信号处理教程_阵列信号处理_70 等分成 3600 个角度离散点), 计算离散点的 fork信号 python python信号处理教程_阵列信号处理_65, 然后搜索峰值位置。
  将空间谱写为矢量形式
fork信号 python python信号处理教程_信号处理_72
  那么:
fork信号 python python信号处理教程_fork信号 python_73

2.5 空间分辨率



  这里我们直接给出结论,详细推导过程可参考《宽带阵列信号波达方向估计理论与方法》。

fork信号 python python信号处理教程_python语言_74

fork信号 python python信号处理教程_fork信号 python_75 ), 分辨力越高, 另外分辨力与方位有关, 当 fork信号 python python信号处理教程_python_76

三、python语言实现空间谱变换

# 导入模块
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()

fork信号 python python信号处理教程_fork信号 python_77


图3.1 空间谱变换结果

四、Tips

  文中如有错误或不清晰的地方,敬请谅解,可留言指出,笔者将及时答复、更改,希望共同进步,谢谢支持。