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实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参