声源定位系统设计(一)——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}} λmin2d2,则为远场模型,否则为近场模型,如下图所示。
在这里插入图片描述

四、窄带与宽带

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

五、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,ejωτ2,ejωτ3,...,ejωτ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Φxxw+wHΦvvw=wHΦyyw
作为一个滤波器,我们想做的便是最小化噪声的影响,即:
m i n ( w H Φ y y w ) min(w^H\Phi_{yy}w) min(wHΦyyw)
故优化问题可以表达为:
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Φyyw),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(θ)Φyy1a(θ)Φyy1a(θ)(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Φyyw=aH(θ)Φyy1a(θ)1(2)
实际中,由于自相关函数不好计算,常用协方差矩阵代替:
Φ y y ≈ R = 1 N y H y \Phi_{yy}\approx R=\frac{1}{N}y^Hy ΦyyR=N1yHy
到此,功率谱与波束形成的系数已经推导完毕。
根据这个功率谱(公式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(θ,ϕ)R1a(θ,ϕ)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,ejωτ2,ejωτ3,...,ejωτ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代码实现将讲述本篇博客中算法的代码实现以及另一种波束形成算法。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java线程join方法

    java线程join方法java线程join方法1.join方法​ join方法的作用是进行线程插队,也就是说调用了join方法的线程相对于调用它的上级线程拥有跟高的执行权。调用join方法的线程的上级线程必须等待调用join方法的线程执行完成才能继续执行。举个小例子:publicclasstestjoin{ publicstaticvoidmain(String[]args)throwsI…

  • oracle创建用户 授权表,oracle创建用户及授权创建表

    oracle创建用户 授权表,oracle创建用户及授权创建表–================================–Oracle用户、对象权限、系统权限–================================建立表空间和用户的步骤:用户建立:createuser用户名identifiedby”密码”;授权:grantcreatesessionto用户名;grantcreatetableto用户名;g…

  • 显卡机器linux 6卡挖矿,显卡挖矿是什么意思?购买显卡矿机应该注意什么?

    显卡机器linux 6卡挖矿,显卡挖矿是什么意思?购买显卡矿机应该注意什么?提到挖矿,很多人都比较感兴趣,众所周知,挖矿是除了直接交易数字货币之外,获取数字货币的唯一途径,而挖矿会根据不同的数字货币定义成不同的挖矿形式,比如说最近比较火的流动性挖矿,就是投资者抵押或锁定加密货币以换取报酬的做法,还有就是本文要说的显卡挖矿,下面小编就给大家通俗的讲解一下显卡挖矿是什么意思。显卡挖矿是什么意思?显卡挖矿其实就是用显卡去挖比特币,让显卡高负荷工作挖,淘汰了的就成了矿卡,矿卡一般…

  • 解决word转pdf后图片失真

    解决word转pdf后图片失真

  • 【翻译mos文章】Linux x86 and x86-64 系统SHMMAX最大

    【翻译mos文章】Linux x86 and x86-64 系统SHMMAX最大

  • 数据结构之哈希表(HASH)

    前言   当我们在编程过程中,往往需要对线性表进行查找操作。在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i;在有序表中查找时,我们经常使用的是二分查找,通过比较key与a[i]的大小来折半查找,直到相等时才返回索引i。最终通过索引找到我们要找的元素。   但是,这两种方法的效率都依赖于查找中比较的次数。我们有一种想法,能不能不经过比较,而是

发表回复

您的电子邮箱地址不会被公开。

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