声源定位系统设计(一)——MVDR波束形成算法「建议收藏」

声源定位系统设计(一)——MVDR波束形成算法「建议收藏」本篇博客希望通过通俗的方式讲清一些简单经典声源定位的方法,并能够按照这种方法自制一个声源定位系统。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

声源定位系统设计(一)——MVDR算法

下一篇:声源定位系统设计(二)——MUSIC算法以及Python代码实现将讲述本篇博客中算法的代码实现以及另一种波束形成算法。

本篇博客希望通过通俗的方式讲清一些简单经典声源定位的方法,并能够按照这种方法自制一个声源定位系统。

一、声源定位、波束形成

首先,声源定位一定是一个阵列信号处理的系统,因为只有一个麦克风接收声音我们是不可能得到声音的方向信息的。利用麦克风阵列可以实现声源到达方向估计(direction-of-arrival estimation),也称为DOA估计。DOA估计的其中一种方法是计算到达不同阵元间的时间差来进行处理的,这一篇博客主要讲的也就是这一种方法中的一个经典算法:MVDR。
而波束形成又是什么呢?在进行声源定位的时候其实也进行了波束形成的过程。波束形成就是令该系统对某些方向的声波具有所需相应的过程。通俗的讲就是说,DOA只是找到了声源来的方向,而波束形成就是进一步把这一个方向的声音从麦克风接收到的声音中滤出来,所以,波束形成也可称为一种空间滤波器。

二、麦克风阵列

麦克风阵列的形式多种多样,我们可以设计成不同样式,在算法层面只需要改变参数即可。常见的阵列有线阵、圆阵、矩形阵、空间阵等等,阵的形状也顾名思义。需要注意的是,对于线阵,我们得不到除阵所在平面之外的信息,所以我们只能估计一个一维的角度,如图:
在这里插入图片描述
除了这个平面以外的信息我们无从得知。
而对于平面阵或空间阵来说,我们能够得到更高维的信息。下文将从线阵和圆阵两种阵型来展开分析,其他阵型方法类似。

三、远场与近场

根据声源和麦克风阵列距离的远近,可将声场模型分为两种:近场模型和远场模型。近场模型将声波看成球面波,它考虑麦克风阵元接收信号间的幅度差;远场模型则将声波看成平面波,它忽略各阵元接收信号间的幅度差,近似认为各接收信号之间是简单的时延关系。显然远场模型是对实际模型的简化,极大地简化了处理难度。一般语音增强方法就是基于远场模型。
近场模型和远场模型的划分没有绝对的标准,一般认为声源离麦克风阵列中心参考点的距离远大于信号波长时为远场;反之,则为近场。设均匀线性阵列相邻阵元之间的距离(又称阵列孔径)为D=n*d,n为阵列间距个数,一般是M-1;声源最高频率语音的波长(即声源的最小波长)为λmin,如果声源到阵列中心的距离大于 2 d 2 λ m i n \frac{2d^2}{\lambda_{min}} λmin​2d2​,则为远场模型,否则为近场模型,如下图所示。
在这里插入图片描述

四、窄带与宽带

顾名思义,窄带就是单一频率或者频宽很窄的信号,而宽带就频带很宽的信号,相对来说,我们实际信号都是宽带的。

五、MVDR

MVDR是一个自适应波束形成算法,按照波束形成的思想,我们想要去获得声源方向(即声强最强方向)的声音,而抑制其他方向的声音。
下来就是算法具体实现部分了。我分讨论均匀线阵然后迁移至圆阵。

1、均匀线阵

首先说明一下,我们假设入射信号为窄带信号。
在这里插入图片描述
如图,均匀线阵间距为d,入射角为 θ i \theta_i θi​,那么该阵列接收到的信号一般表示为:
X ( t ) = A S ( t ) + N ( t ) X(t)=AS(t)+N(t) X(t)=AS(t)+N(t)
我们先给出了公式,然后再来解释:
X即为接收到的信号,他是时间的函数,读者应该也能够猜出,N是加性噪声。在这里,S是第一个麦克风接收到的原始信号,而A被称为阵列流型向量,有时也被称为导向向量,顾名思义,他与入射方向有关。设阵列中一共有M个麦克风,则:
A = [ 1 , e − j ω τ 2 , e − j ω τ 3 , . . . , e − j ω τ M ] A=[1,e^{-j\omega\tau_2},e^{-j\omega\tau_3},…,e^{-j\omega\tau_M}] A=[1,e−jωτ2​,e−jωτ3​,...,e−jωτM​]
这个公式有信号处理基础的小伙伴应该不难理解,其中 τ \tau τ为信号入射的时间差, ω \omega ω为信号的角频率。
根据几何关系,易知,均匀线阵中 τ n = n d s i n θ c \tau_n=\frac{ndsin\theta}{c} τn​=cndsinθ​,c为波速,这里取声速340。
对于多声源的情况,S与A变变成了矩阵,假设有N个声源:
在这里插入图片描述
更一般地,如果是宽带的情况,那就对应不同频率, ω \omega ω有不同的取值。
以上便是麦克风的输出模型,我们将其变换到频域:
y ( ω ) = a s ( ω ) + v ( ω ) y(\omega)=as(\omega)+v(\omega) y(ω)=as(ω)+v(ω)
设计一个滤波器 w ( ω ) w(\omega) w(ω),令:
z ( ω ) = w H ( ω ) y ( ω ) z(\omega)=w^H(\omega)y(\omega) z(ω)=wH(ω)y(ω)
令 a s = x as=x as=x,则 z = w H x + w H v z=w^Hx+w^Hv z=wHx+wHv,由于讨论窄带,我们省去 ω \omega ω
从频域来看,我们希望所需要的方向( θ \theta θ)的信号无失真地完整输出,那么要限制: w H a ( θ ) = 1 w^Ha(\theta)=1 wHa(θ)=1
又令自相关函数:
Φ x x = E [ x x H ] \Phi_{xx}=E[xx^H] Φxx​=E[xxH]
根据自相关函数的性质可得:
Φ y y = Φ x x + Φ v v \Phi_{yy}=\Phi_{xx}+\Phi_{vv} Φyy​=Φxx​+Φvv​
Φ z z = w H Φ x x w + w H Φ v v w = w H Φ y y w \Phi_{zz}=w^H\Phi_{xx}w+w^H\Phi_{vv}w=w^H\Phi_{yy}w Φzz​=wHΦxx​w+wHΦvv​w=wHΦyy​w
作为一个滤波器,我们想做的便是最小化噪声的影响,即:
m i n ( w H Φ y y w ) min(w^H\Phi_{yy}w) min(wHΦyy​w)
故优化问题可以表达为:
m i n ( w H Φ y y w ) , s . t . w H a ( θ ) = 1 min(w^H\Phi_{yy}w),s.t.w^Ha(\theta)=1 min(wHΦyy​w),s.t.wHa(θ)=1
通过拉格朗日乘子法解该优化问题可得:
w = Φ y y − 1 a ( θ ) a H ( θ ) Φ y y − 1 a ( θ ) (1) w=\frac{\Phi_{yy}^{-1}a(\theta)}{a^H(\theta)\Phi_{yy}^{-1}a(\theta)}\tag1 w=aH(θ)Φyy−1​a(θ)Φyy−1​a(θ)​(1)
而其功率谱可表示为:
P ( θ ) = w H Φ y y w = 1 a H ( θ ) Φ y y − 1 a ( θ ) (2) P(\theta)=w^H\Phi_{yy}w=\frac{1}{a^H(\theta)\Phi_{yy}^{-1}a(\theta)}\tag2 P(θ)=wHΦyy​w=aH(θ)Φyy−1​a(θ)1​(2)
实际中,由于自相关函数不好计算,常用协方差矩阵代替:
Φ y y ≈ R = 1 N y H y \Phi_{yy}\approx R=\frac{1}{N}y^Hy Φyy​≈R=N1​yHy
到此,功率谱与波束形成的系数已经推导完毕。
根据这个功率谱(公式2),我们可以通过扫描遍历空间所有的 θ \theta θ来找到功率最强的方向,即为声源方向,同时可以根据公式(1)提取出声源方向的信号。

2、圆阵

在这里插入图片描述
其实道理都相同,推导过程这里略去,对于二维圆阵,我们要估计的就是 θ \theta θ和 ϕ \phi ϕ两个,那么公式就拓展变成了:
P ( θ , ϕ ) = 1 a H ( θ , ϕ ) R − 1 a ( θ , ϕ ) (3) P(\theta,\phi)=\frac{1}{a^H(\theta,\phi)R^{-1}a(\theta,\phi)}\tag3 P(θ,ϕ)=aH(θ,ϕ)R−1a(θ,ϕ)1​(3)
同理,这里的a也就是在 θ , ϕ \theta,\phi θ,ϕ这个方向上的阵列流型向量,公式相同:
A = [ 1 , e − j ω τ 2 , e − j ω τ 3 , . . . , e − j ω τ M ] A=[1,e^{-j\omega\tau_2},e^{-j\omega\tau_3},…,e^{-j\omega\tau_M}] A=[1,e−jωτ2​,e−jωτ3​,...,e−jωτM​]
只是这里时延的计算不一样了。
事实上,我们可以固定一点O,计算所有麦克风距离O点的距离,把这个距离上的时延作为该麦克风的时延(反正都是相对的值,O点选哪都没关系)。自然地,我们选O为坐标原点,那么在直角坐标系下:
τ = k ⃗ H r ⃗ \tau=\vec k^H\vec r τ=k
H
r

其中 k ⃗ \vec k k
为声音到达的方向的单位向量, r ⃗ \vec r r
为该阵的位置向量。
后面的计算想必大家就都会了~

六、总结

本篇博客讲述了一些声源定位的基本概念以及经典MVDR波束形成算法。其他一些基础的波束形成算法与MVDR也有相近的地方,在下一篇博客中,我将讲述另一种波束形成算法——MUSIC算法以及这两种算法的Python代码实现方式。

下一篇:声源定位系统设计(二)——MUSIC算法以及Python代码实现将讲述本篇博客中算法的代码实现以及另一种波束形成算法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190663.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm怎么创建虚拟环境_pycharm选择运行环境

    pycharm怎么创建虚拟环境_pycharm选择运行环境配置虚拟环境的必要性1、保持项目的独立性。为每一个项目建立一个独立的运行环境,不与其他项目之间产生环境冲突。(比如其他项目加载或删除依赖环境软件时,互不影响)通俗一点就是,每人一个单间,大家在自己的房间内可以各干各的。2、提升项目开机加载速度。在独立性的前提下,虚拟环境可以选择继承已有的公共环境中的依赖包,也可以完全新建一个空间,也可以将自己的依赖环境共享给其他项目。总之,保证每个项目的虚…

    2022年8月28日
  • C语言 排序算法_C语言中三大经典的排序算法

    C语言 排序算法_C语言中三大经典的排序算法文章目录前言一、插入排序1.1直接插入排序1.2希尔排序二、使用步骤1.引入库2.读入数据总结前言常见的排序算法如下:一、插入排序1.1直接插入排序基本思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。实际中我们玩扑克牌时,就用了插入排序的思想:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],a

    2022年10月30日
  • 给Android程序猿的六个建议

    给Android程序猿的六个建议

    2022年2月1日
  • 基于回归分析的房价预测模型_房价模型基本原理

    基于回归分析的房价预测模型_房价模型基本原理回归模型与房价预测

    2022年4月21日
  • touchstart,touchmove,touchend触摸事件的小小实践心得

    近段时间使用html5开发一个公司内部应用,而触摸事件必然是移动应用中所必须的,刚开始以为移动设备上或许也会支持鼠标事件,原来是不支持的,好在webkit内核的移动浏览器支持touch事件,并且打包成

    2021年12月27日
  • 【单调队列】数据结构之单调队列详解

    【单调队列】数据结构之单调队列详解单调队列1.初步认识单调队列是一个数据结构,并不是STL里面的内容。单调队列为何说单调,因为是队列中的元素始终保持着单增或者单减的特性。(注意始终保持这四个字)简单的sort排序就可以让一个序列有序了,为何又多此一举多出来个单调队列实现类似的功能呢?其实单调队列不只是做到了排序,还可以实现一个功能:在每次加入或者删除元素时都保持序列里的元素有序,即队首元素始终是最小值或者最大值,这个功能非常重要,单调队列我们就是使用的这个功能。举个例子:我们依次加入5个元素,分别为5,8,2,4,1那么我们假

    2022年6月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号