Python信号处理:波束形成及目标方位估计,CBF、MVDR

2023-11-09 17:20

本文主要是介绍Python信号处理:波束形成及目标方位估计,CBF、MVDR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要:一直以来都是用MATLAB做信号处理,得到预处理的特征后再用Python进一步应用神经网络之类的方法。这里利用Python实现了常规波束形成(CBF)、MVDR波束形成以及波束扫描方位估计。本文实现的都是窄带波束形成,一种简单的宽带波束形成方法时直接将不同频率的窄带输出相加,比较容易扩展。

系列目录

  1. Python信号处理:快速傅里叶变换(FFT),短时傅里叶变换(STFT),窗函数,以及滤波
  2. Python信号处理:自相关函数(对标MATLAB中的autocorr)
  3. Python信号处理:波束形成及目标方位估计,CBF、MVDR
  4. Python信号处理:cvxpy工具包求解稀疏约束优化问题

目录

  1. 波束形成和方位估计
  2. 常规波束形成器
  3. MVDR波束形成器

1. 波束形成和方位估计

波束形成就是通过一个加权向量 w w w对阵列接收到的数据 x x x加权相加得到输出 y = w H x y = w^Hx y=wHx,所以确定 w w w是波束形成中非常重要的步骤,知道 w w w就知道了波束输出。波束形成器的设计问题其实就是设计加权向量 w w w

已知阵列的方向响应向量为 a ( θ ) = [ 1 , e − i 2 π λ d sin ⁡ θ , . . . , e − i 2 π λ ( N − 1 ) d sin ⁡ θ ] H a(\theta)=[1, e^{-\rm{i}\frac{2\pi}{\lambda}d\sin{\theta}}, ..., e^{-\rm{i}\frac{2\pi}{\lambda}(N-1)d\sin{\theta}}]^H a(θ)=[1,eiλ2πdsinθ,...,eiλ2π(N1)dsinθ]H
,则波束响应为
B ( θ ) = w H a ( θ ) . B(\theta)=w^Ha(\theta). B(θ)=wHa(θ).
波束响应只与加权向量和方向响应向量有关,而与是否存在信号无关。对于确定方向的加权向量 w w w,改变方向响应向量就可以得到波束响应能量相对于不同方向的函数图,也就是波束图。波束图反映了波束形成器的空域滤波性能。

加权向量 w w w是波束观察方向 θ 0 \theta_0 θ0的函数,因此在波束观察方向的波束输出功率可以表示为
σ y 2 ( θ 0 ) = y ( θ 0 ) y H ( θ 0 ) = w H ( θ 0 ) x x H w ( θ 0 ) = w ( θ 0 ) H R x w ( θ 0 ) , \sigma_y^2(\theta_0)=y(\theta_0)y^H(\theta_0)=w^H(\theta_0)xx^Hw(\theta_0)=w(\theta_0)^HR_xw(\theta_0), σy2(θ0)=y(θ0)yH(θ0)=wH(θ0)xxHw(θ0)=w(θ0)HRxw(θ0),
其中 R x R_x Rx是接收数据的协方差矩阵。改变波束观察方向 θ 0 \theta_0 θ0,就可以获得在整个观察区内的波束输出功率,此时的到的就是波束扫描方位谱

波束形成和方位估计,分别可以得到波束图和波束扫描方位谱,两者十分相似,在常规波束形成中,两者甚至在形式上一样的。但两者的意义差别很大。

  • 波束图用于表示波束形成器的空域滤波性能,即给定波束形成器,看它对各方位信号的响应大小。计算波束图时,波束加权向量是固定的,通过扫描阵列的方向响应向量获得不同方向的波束响应。从波束图可以观察到各方位信号对感兴趣的方位(波束观察方向)波束输出的影响。波束图与是否存在信号无关。

  • 方位谱用于估计各方位到达信号功率的大小。利用波束扫描法计算方位谱时,加权向量是观察方向的函数,方位谱的峰值所在可以用于估计信号的方位。

2. 常规波束形成器

常规波束形成器的原理是延时加权求和,加权向量正好就是阵列方向相应向量相位的变化,即 w = a ( θ 0 ) w=a(\theta_0) w=a(θ0),因此波束响应为
B C B F ( θ ) = a H ( θ 0 ) a ( θ ) , B_{CBF}(\theta)=a^H(\theta_0)a(\theta), BCBF(θ)=aH(θ0)a(θ),
其中,波束形成时的 θ 0 \theta_0 θ0是不变的。

用于方位估计时,信号方位 θ \theta θ时固定的,波束观察方向 θ 0 \theta_0 θ0在观察区中变化,得到方位谱为
σ y 2 ( θ 0 ) = y ( θ 0 ) y H ( θ 0 ) = w H ( θ 0 ) x x H w ( θ 0 ) = σ s 2 w H ( θ 0 ) a ( θ ) a H ( θ ) w ( θ 0 ) \begin{aligned} \sigma_y^2(\theta_0)&=y(\theta_0)y^H(\theta_0)=w^H(\theta_0)xx^Hw(\theta_0)\\ &=\sigma_s^2w^H(\theta_0)a(\theta)a^H(\theta)w(\theta_0)\\ \end{aligned} σy2(θ0)=y(θ0)yH(θ0)=wH(θ0)xxHw(θ0)=σs2wH(θ0)a(θ)aH(θ)w(θ0)

python实现如下,代码中变量命名和公式中相同,波束图和波束扫描方位谱如图所示。在白噪声背景下,CBF的两幅图是相同的。

import matplotlib.pyplot as plt
import numpy as npd = np.array([15]) * np.ones([18, 1])
f = 50
lmbda = 1500 / f
N = 18
n = np.arange(0, N, 1).reshape([-1, 1])# 波束形成
theta = np.arange(-90, 90, 0.1).reshape([1, -1])
theta_0 = 10
theta = theta / 180 * np.pi
theta_0 = theta_0 / 180 * np.pia = np.exp(1j * 2 * np.pi * np.sin(theta) * n * d / lmbda)
w = np.exp(1j * 2 * np.pi * np.sin(theta_0) * n * d / lmbda)
B = np.dot(a.transpose(), np.conj(w))
B = np.abs(B) / np.max(np.abs(B))fig, ax = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(7, 2), dpi=300)
plt.subplots_adjust(wspace=0.1, hspace=0.05)ax[0].plot(theta.reshape([-1,1])*180/np.pi, 20 * np.log10(B.reshape([-1,1])), '--')# 方位估计
theta_0 = np.arange(-90, 90, 0.1).reshape([1, -1])
theta = 10
theta = theta / 180 * np.pi
theta_0 = theta_0 / 180 * np.pia = np.mat(np.exp(1j * 2 * np.pi * np.sin(theta) * n * d / lmbda))
w = np.mat(np.exp(1j * 2 * np.pi * np.sin(theta_0) * n * d / lmbda))sigma = np.transpose(np.conj(w)) * a * np.transpose(np.conj(a)) * w
sigma = np.diag(sigma)
sigma = sigma / np.max(sigma)ax[1].plot(theta_0.reshape([-1,1])*180/np.pi, 10 * np.log10(sigma))

在这里插入图片描述

3. MVDR波束形成器

最小方差无失真响应波束形成器,顾名思义有两个成分:1. 最小方差,2. 无失真,因此可以表示为
min ⁡ w w H R n w , s . t . w H a = 1 , \min_{w}\quad w^HR_nw, \quad \quad s.t.\quad w^Ha=1, wminwHRnw,s.t.wHa=1,
其中,优化目标表明为最小输出噪声方差,约束为无失真约束。实际中通常使用接收信号的协方差矩阵代替噪声协方差矩阵,此时方法也可以叫做最小功率无失真响应波束形成器(MPDR),但叫MVDR也可以。

通过求解该约束优化问题,就可以得到波束形成器的加权向量,进而得到波束输出响应。有两种思路求解该优化问题:

  1. 常规解法,通过lagrange乘子法,手动求解计算加权向量以及波束相应输出。
  2. 工具包求解,利用一些优化工具包,直接求解该优化问题得到答案——这种方法实际上解决了大部分的波束形成问题,因为很多波束形成问题都是一个目标函数,再加上很多的约束,如果工具包能求解对应的优化问题,波束输出就有了。

这里直接给出第一种方法求出来的加权向量。第二种解法在后面内容中会详细介绍,作为一种通用的波束形成方法。因为都是优化问题,波束形成在算法上几乎没有什么难题,只有工程中的问题。

scipy.optimize.minimize失败了,因为只能处理实数的问题。MATLAB的CVX工具箱是能处理复数的,不知道cvxpy怎么样。。

cvxpy好像解不出复数最优解,目标函数里可以有复数操作,但最终的值必须是实数的,而且解出来的最优解也一直是实数,肯定哪里不太对。。

w M V D R = R x − 1 a ( θ 0 ) a H ( θ 0 ) R x − 1 a ( θ 0 ) w_{MVDR}=\frac{R_x^{-1}a(\theta_0)}{a^H(\theta_0)R_x^{-1}a(\theta_0)} wMVDR=aH(θ0)Rx1a(θ0)Rx1a(θ0)
波束响应和波束输出功率,和第一部分的公式相同,即
B M V D R = w H a ( θ ) B_{MVDR}=w^Ha(\theta) BMVDR=wHa(θ)
σ M V D R ( θ 0 ) = w H ( θ 0 ) R x w ( θ 0 ) = 1 a H ( θ 0 ) R x − 1 a ( θ 0 ) \sigma_{MVDR}(\theta_0)=w^H(\theta_0)R_xw(\theta_0)=\frac{1}{a^H(\theta_0)R_x^{-1}a(\theta_0)} σMVDR(θ0)=wH(θ0)Rxw(θ0)=aH(θ0)Rx1a(θ0)1

python实现如下,代码中变量命名和公式中相同,波束图和波束扫描方位谱如图所示。从波束图可以看出,当信号方向(-10°)和波束观察方向(10°)不同时,MVDR在信号方向会形成一个凹陷,降低了信号(此时信号算是干扰)的能量。

import matplotlib.pyplot as plt
import numpy as npd = np.array([15]) * np.ones([18, 1])
f = 50
lmbda = 1500 / f
N = 18
n = np.arange(0, N, 1).reshape([-1, 1])# 信号
theta = -10
theta = theta / 180 * np.pi
x = np.exp(1j * 2 * np.pi * np.sin(theta) * n * d / lmbda)
Rx = np.mat(1000 * np.dot(x, np.transpose(np.conj(x))) + 1 * np.eye(N))# # 波束形成
theta = np.arange(-90, 90, 0.1).reshape([1, -1])
theta_0 = 10
theta = theta / 180 * np.pi
theta_0 = theta_0 / 180 * np.pia = np.mat(np.exp(1j * 2 * np.pi * np.sin(theta) * n * d / lmbda))a_theta_0 = np.mat(np.exp(1j * 2 * np.pi * np.sin(theta_0) * n * d / lmbda))
w = Rx.I * a_theta_0 / (a_theta_0.H * Rx.I * a_theta_0)B = w.H * a
B = np.abs(B) / np.max(np.abs(B))fig, ax = plt.subplots(1, 2, sharex=True, sharey=False, figsize=(7, 2), dpi=300)
plt.subplots_adjust(wspace=0.35, hspace=0.05)ax[0].plot(theta.reshape([-1,1])*180/np.pi, 20 * np.log10(B.reshape([-1,1])), '--')# 方位估计
theta_0 = np.arange(-90, 90, 0.1).reshape([1, -1])
theta_0 = theta_0 / 180 * np.pisigma = []
for i in range(theta_0.shape[1]):a_theta_0 = np.mat(np.exp(1j * 2 * np.pi * np.sin(theta_0[:, i]) * n * d / lmbda))sigma.append((1 / (a_theta_0.H * Rx.I * a_theta_0)))sigma = np.array(sigma).reshape([-1, 1])ax[1].plot(theta_0.reshape([-1,1])*180/np.pi, 10 * np.log10(sigma))

在这里插入图片描述

这篇关于Python信号处理:波束形成及目标方位估计,CBF、MVDR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377516

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目