在这篇文章中,我们将探讨方向查找和信号恢复中的巴特利特和卡彭波束形成器。我们还将了解到为什么在某些情况下更多的噪声可能是有益的,而相关信号可能对算法产生负面影响。我们将亲眼看到波束形成技术如何显著改进了简单的方法。这种方法适用于任何使用传感器阵列或网络的场景,特别是在机器人技术领域。
这是系列文章的最后一篇,介绍波束形成器这一主题,也是最有趣的一篇,因为我们会直接进入代码,通过正弦波进行探索。
- 波束成形入门 第1部分 — 延迟与求和波束成形器
- 波束成形入门 第2部分 — Bartlett 波束形成器
- 波束成形入门 第3部分 — Capon 波束成形器
- 这一部分介绍波束成形入门第4部分 — 方位定位与信号恢复
波束成形器简介tl;dr: 一个很好的解决办法是用Capon准则进行角度估计,用Bartlett方法重建信号。
这篇帖子涉及Bartlett和Capon波束形成器技术,如果你想了解更多,请参阅上面的帖子。在这里,我们将仅总结将在Python中实现的有用数学部分。
信号模型(信号模子)我们将使用以下通用信号模型
通用波束成形技术广义波束成形器是一个复数向量_w_与阵列响应X相乘,H 上标表示共轭转置,因为我们处理的是复数,如下所示。
巴特利特波束形成器巴特勒谱图如下所示,该计算用于确定信号的到达方向。产生最大响应((P \varphi))的 steering 矢量_v_对应于信号的到达方向θ。然后可以将_v_作为权重向量插入到通用波束形成器中取代w,来估计原始信号。
火鸡波束成形器Capon频谱(零变形最小方差响应)如下所示:请注意,它需要我们对样本矩阵进行求逆,这使得它在计算上更为复杂,比计算巴特勒特频谱更复杂。
类似于巴特莱特,上述公式将允许我们确定由指向矢量 v 描述的最有可能的到达角度。我们使用这个指向矢量来计算卡朋波束形成器 w,并通过将 w 代入广义波束形成器方程来估计原始信号。
实用小技巧在我们开始之前,让我们分享一些实用的建议,帮助你在实际数据上成功使用这些波束形成器。
前向后均值前向后向平均法是一种技术,已被实验证明可以降低信号到达方向的估计误差,并减少信号之间的相关性。它通过减少由相关信号导致的奇异点来实现这一点。有关详细信息,请参阅此页面的第76页,在这里我们将展示如何计算前向后向样本相关矩阵。
其中,它是指复数共轭,而 J 是交换矩阵。
对角线加载法对角线加载是指在矩阵的对角线上添加微小扰动 σ,以减少其奇异性并确保其可逆性。这在计算Capon谱时尤为重要,因为在计算Capon谱时需要对样本相关矩阵求逆。计算矩阵逆时几乎总是会用到这种方法,几乎无理由不使用这种技术。
Python 示例代码让我们直接开始,只看重点部分,不会包含所有的细节,只展示关键部分,完整代码可以在GitHub上查看。
实施信号模型这两种方法之间都存在权衡点,我们将探索这些权衡点,并确定其中一个波束成形器更优。
在理论信号模式下(以及在过去的教程中),我们使用了均值为零的随机向量作为信号,但在本文里我们将使用正弦波,因为它们更有趣味。这里是我们将用于比较的基本信号模型的实现。
# 输入参数
SNR = 15.0 # 假设所有源信号的信噪比相同(最大值:100,最小值:0)
T = 10000 # 采样数量
M = 20 # 阵元数量
D = 5 # 源信号数量
THETA_DEG = [-10, 0, -20, 25, 50] # 到达角
SOURCE_POWER = np.array([23, 18, 14, 17, 20]) # 功率(dB)
# 正弦波参数(如有需要可以修改)
fs = 1e6 # 采样频率(Hz)
t = np.arange(T)/fs # 时间向量(秒)
f_tone = 0.01*1e6 # 频率
omega = 2*np.pi*f_tone # 弧度
c = 3e8 # m/s
lmbda = c/f_tone # 米
# 衍生参数
SOURCE_POWER_WATT = db2watt(SOURCE_POWER)
NOISE_POWER_DB = SOURCE_POWER.mean() - SNR
NOISE_POWER_WATT = db2watt(NOISE_POWER_DB)
SOURCE_THETAS = [theta*np.pi/180 for theta in THETA_DEG]
# 构建阵列的响应
V = np.vstack([steering_vector(theta, M) for theta in SOURCE_THETAS]).T
# 或随机复正弦源
F = random_complex_sinusoidal_source(D, f_tone, t, fs, SOURCE_POWER_WATT)
N = NOISE_POWER_WATT * np.random.randn(M, T)
# 构建阵列的响应
X = V @ F + N
我们的目标信号是-10°方向,功率水平为23 dB的信号 (所有其他信号都被视为干扰),下图同时绘制了该信号及其阵列响应 (即每个阵列单元收到的信号)。
图1. 左:期望的原始信号。右:对源信号和干扰信号的阵列响应。来源:原文作者。
下面我们来计算样本相关矩阵(样本协方差矩阵的相关版本),以及它的逆。
Rxx = (X @ np.conj(X).T) / X.shape[1] # 计算自相关矩阵
Rxx_inv = np.linalg.pinv(Rxx_fb) # 计算Rxx的伪逆矩阵
(Note: np.conj
表示取复共轭,np.linalg.pinv
表示求伪逆。变量 X
和 Rxx_fb
在上下文中有特定含义,建议在首次出现时定义。)
我们来看看做得怎么样。注意:我随机调整了信号参数,你可能会得到略有不同的结果。
图2. 基本信号模型的角度频谱。来源:本文作者。
还算可以,我们预计Capon谱能够获取所有信号,相比之下,Bartlett在方向测定方面的表现明显较差。这是来自-10°、23 dB处信号恢复的情况。
图3. 巴特利特(左)和卡朋(右)波束形成器(Beamformers)的恢复信号。来源:本文作者。
还算可以,这意味着如果我们能找到到达角(AoA),就可以恢复信号,均方误差(MSE)如下:
bartlett_mse, capon_mse
# 21.021789879679755, 14.797694238550449
我们现在有了基础模型,我们来看看去掉数组噪声会有什么不同。
噪声和对角加载的效果在大多数情况下,我们想要消除噪音。但如果你知道有些噪音其实是好的,会怎么样呢?让我们看看当我们去除数组噪声会发生什么,我们只需要从模型中去除它就可以了。
X 等于 V 和 F 的某种操作结果加上 N。
现在我们来看看这些东西:
图4. 无噪声信号模型的角度频谱。作者提供,如图所示。
巴特莱特谱系表现稳定(但仍然不能捕捉到所有的信号),而科apon谱系已经严重受损。让我们看看添加对角线加载能否改善这种情况。
Rxx = (X @ np.conj(X).T) / X.shape[1]
# 如果使用前向后向平均法
J = np.fliplr(np.eye(M)) # M是矩阵的行数
Rxx_fb = 0.5 * (Rxx + J @ np.conj(Rxx) @ J)
# 如果采用对角线加载
sigma_l = 1e-6
Rxx_inv = np.linalg.pinv(Rxx + sigma_l * np.eye(Rxx.shape[0])) # pinv表示矩阵的伪逆
我们现在来看看在每种情况下逆矩阵的规模是怎样的。
图5. 逆自相关矩阵图。左:未对角线加载。右:已对角线加载。(来源:作者)
当我们加入对角线加载时,逆矩阵中会出现一条漂亮的对角线功率分布。现在我们来看看角度频谱是怎样的。
图6. 无噪声信号模型的对角加载角度光谱。(来源:作者)
好多了,真是这样。我们已经看到去除数组噪声对性能有害,尤其是对Capon (卡朋特),因为这种噪声严重扰乱了样本相关矩阵的逆。值得庆幸的是,假设所有元素都有数组噪声是一个非常现实的假设,我们可以通过添加对角线加载来确保这种噪声的存在,从而减少矩阵的奇异程度。
高度关联的信号这个案例探讨了高度相关的信号的影响,我们修改了模型,不再随机改变信号参数。相反,我们将从不同角度发送相同的信号。这就是模型的更新说明。
F = 复指数信号源(f_tone, t, SOURCE_POWER_WATT)
N = NOISE_POWER_WATT * 随机生成复数((M, T))
# 构建阵列响应
X = V @ F + N
注意,高度相关的信号会相互影响,导致Capon谱估计出现问题。这是因为Capon方法将信号视为单一信号源,而不是多个信号源,这样我们就违背了模型的假设。
这意味着Capon遇到了多径传播的问题,多径传播是一种常见的现象,即同一信号通过多种路径传送到阵列,从而产生多个延迟和衰减的信号副本。
我们将使用对角线和加载以及前向后向平均法,你自己就能看出来前向后向平均法对Capon重建提供了一点点改进,但这关系不大,因为在这里Bartlett重建好得多。
Rxx = (X @ np.conj(X).T) / X.shape[1]
# 如果使用前向后向平均法
J = np.fliplr(np.eye(M)) # 注意:这里生成的是M维的单位矩阵
Rxx_fb = 0.5 * (Rxx + (J @ np.conj(Rxx) @ J))
# 如果使用对角加载法
sigma_l = 1e-6
# 计算样本相关矩阵的逆矩阵
Rxx_inv = np.linalg.pinv(Rxx_fb + sigma_l*np.eye(Rxx_fb.shape[0])) # 注意:这里的sigma_l是小数点后六位的正数,用于防止矩阵病态
我们来看看情况咋样:
图7. 相关信号模型的角度频谱。来源:作者。
现在我们来看看重建的情况:
图8. (左)Bartlett 和(右)Capon 恢复信号。作者。
恢复后的卡朋信号表现不佳。尽管卡朋方法仍然提供更好的角度估计,但它在信号高度相关时难以恢复这些信号。高度相关的信号在实际中很常见,因此,我们需要找到合适的方法来应对这种状况。
最后不可否认,对于角度估计,Capon 方法具有诸多好处,但在存在相关信号的情况下,其信号恢复性能很差。一个好办法是使用 Capon 方法进行角度估计,用 Bartlett 方法重构信号。 这样就能避免相关信号干扰我们的估计。
参考文献- Van Trees, H. L. (2002). 最优阵列处理(检测、估计和调制理论第四部分). Wiley.
- https://pdxscholar.library.pdx.edu/cgi/viewcontent.cgi?article=5344&context=open_access_etds
共同学习,写下你的评论
评论加载中...
作者其他优质文章