为了账号安全,请及时绑定邮箱和手机立即绑定

贝姆形成简介:第四部分——方向估计与信号恢复的那些事儿

如何用波束成形器估计方向和恢复信号

在这篇文章中,我们将探讨方向查找和信号恢复中的巴特利特和卡彭波束形成器。我们还将了解到为什么在某些情况下更多的噪声可能是有益的,而相关信号可能对算法产生负面影响。我们将亲眼看到波束形成技术如何显著改进了简单的方法。这种方法适用于任何使用传感器阵列或网络的场景,特别是在机器人技术领域。

照片由Nils Leonhardt摄于Unsplash

这是系列文章的最后一篇,介绍波束形成器这一主题,也是最有趣的一篇,因为我们会直接进入代码,通过正弦波进行探索。

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 表示求伪逆。变量 XRxx_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 方法重构信号。 这样就能避免相关信号干扰我们的估计。

参考文献
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消