声源定位方法_声源定位算法

声源定位方法_声源定位算法目录1.TDOA简介2.时延估计3.定位估计4.声源定位根据现有的研究成果来看,声源定位(SoundSourceLocalization,SSL)存在以下几种方法:基于最大输出功率的可控波束成形的定位方法、基于高分辨谱估计的定位方法和基于到达时延差(TimeDifferenceofArrival,TDOA)估计的定位方法,以及基于机器学习的方法。其中基于时延估计的定位方法计算量小,实时性好,实用性强等特点,我们就先介绍这种较为简单的声源定位算法。基于TDOA的方法一般

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

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

目录

1. TDOA简介

2. 时延估计

3. 定位估计

4. 声源定位


根据现有的研究成果来看,声源定位(Sound Source Localization, SSL)存在以下几种方法:基于最大输出功率的可控波束成形的定位方法、基于高分辨谱估计的定位方法和基于到达时延差(Time Difference of Arrival,TDOA)估计的定位方法,以及基于机器学习的方法。其中基于时延估计的定位方法计算量小,实时性好,实用性强等特点,我们就先介绍这种较为简单的声源定位算法。基于TDOA的方法一般分为两步,首先计算声源信号到达麦克风阵列的时间差(时延估计),然后通过麦克风阵列的几何形状建立声源定位模型并求解从而获得位置信息(定位估计)。

1. TDOA简介

首先介绍下TDOA的概念,如图所示,假设我们在空间中有一个声源(记为s(t),其在空间的位置为S)两个麦克风(记为m1和m2,它们在空间的位置分别为M1M2,接收到的信号为x1(t)和x2(t)

声源定位方法_声源定位算法

那么麦克风m1和m2收到的信号分别为:

声源定位方法_声源定位算法

声源定位方法_声源定位算法

其中τ1和τ2分别是声源到达两个麦克风的延迟时间,n1(t)和n2(t)为加性噪声。那么声源信号到达两个麦克风的TDOA为

声源定位方法_声源定位算法

τ1和τ2可以通过下式计算

声源定位方法_声源定位算法

其中c是声速。一般情况下,我们选择一个麦克风的信号作为参考信号,例如我们把M2作为参考信号,那么τ2=0。在麦克风阵列几何形状已知的情况下,声源定位问题变为对时延的估计问题。

2. 时延估计

时延估计常用的有很多种比如使用广义互相关函数(Generalized Cross Correlation, GCC)估计时延,或者使用倒谱分析进行时延估计等,这里介绍常用的基于广义互相关函数时延估计方法。

 

互相关函数我们以前已经介绍过了,而广义互相关函数是为了减少噪声和混响在实际环境中的影响,在互功率谱域使用加权函数加权,然后经过IFFT运算后找到峰值估计时延,其流程如下图所示:

 

声源定位方法_声源定位算法

广义GCC计算公式为:

声源定位方法_声源定位算法

其中Ψ12为频域加权函数,常用的有如下几种

声源定位方法_声源定位算法

Gx1x2(ω)为互频谱,其计算公式为:

 

声源定位方法_声源定位算法

最后我们就可以通过式(8)估计语音信号到达两个麦克风的时延了。

声源定位方法_声源定位算法

3. 定位估计

如果要确定出声源在二维平面内的位置坐标,都至少需要三个麦克风。对于两个麦克风的情况,我们只能计算到达角(Direction of Arrival, DOA)。在介绍如何定位估计前需要先区分下近场(near-field)和远场(far-field),假设声速波长为λ,麦克风之间的距离为d(有的地方称为孔径,aperture),那么声源与麦克风之间的距离r大于2d2/λ时,符合远场模型,反之则为近场模型。对于远场模型来说,声源到达麦克风阵列的波形视为平面波,如下图所示:

声源定位方法_声源定位算法

此时根据麦克风阵列的几何关系,我们有

声源定位方法_声源定位算法

进而可以求出,声源相对麦克风阵列的角度

声源定位方法_声源定位算法

对于近场模型来说,声源到达麦克风阵列的波形视为球面波,如下图所示:

声源定位方法_声源定位算法

近场模型需要三个麦克风,我们假设τ12,τ13分别为第二和第三个麦克风与第一个麦克风的时延,那么

声源定位方法_声源定位算法

根据麦克风阵列的几何关系,我们得到

声源定位方法_声源定位算法

其中τ12,τ13通过时延估计得到,因此可以求解公式(11)到(13)的方程组,进而使用正弦定理可以得到θ2和θ3。

4. 声源定位

在麦克风孔径不大的情况下,一般都符合远场模型(不信读者可自己算一下),因此这里应用远场模型进行声源定位。声源位置在大约在45度角,麦克风之间的距离为0.15m,48 kHz的采样率,使用gcc-phat进行时延估计,结果如下图所示(代码和数据还是在公众号菜单More->Code里面)。

声源定位方法_声源定位算法

 

可以看到大体上方向还是被正确估计到,想必聪明的读者已经发现了声源定位的一些数据可以进行VAD结果的判定。这里的Demo比较简单,采用的是单源自由场模型,真实情况下需要考虑更多的问题,比如房间的混响,噪声,声源个数等问题。另外gcc-phat只能用于双麦克风阵列,如果你有多个麦克风,可以使用Spatial Linear Prediction Method 方法去利用麦克风之间的冗余信息获得更为精确的定位结果。此外波束成形(Beam forming, BF)和声源定位联系比较密切,因为时延和BF所要求的导向量等价,因此也有基于BF的声源定位算法。最后提一下机器学习/深度学习的定位方法,前面的流程还是不变,只是最后通过最大值估计时延的这一步换成了使用机器学习模型来估计时延,即模型输入为gcc-phat,输出结果为时延。然后根据这个时延进行声源定位。


参考文献:

[1]. https://www.canalu.tv/video/inria/time_difference_of_arrival_tdoa.33273

[2]. Springer, Micrphone Array Processing,2008


声源定位方法_声源定位算法

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

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

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


相关推荐

  • ITOP4412 RFID RC522模块

    ITOP4412 RFID RC522模块RC522是高度集成的非接触式读写卡芯片。此发送模块利用调制和解调原理,并将它们完全集成到各种非接触式通信方法和协议中。可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。该模块有64字节的发送和接收FIFO缓冲区。本次使用的模块如下(图从网上剪切)iTop4412提供RFID模块驱动,而且手中有该模块,只是一直没有使用过,所以找出来调试一番。该模块可使用S…

    2022年7月14日
    16
  • 数据流图DFD画法「建议收藏」

    数据流图DFD画法「建议收藏」数据流图(DFD-DataFlowDiagram)让系统分析者弄清楚“做什么”的问题,其重要性就不言而喻了。那么我们怎么画数据流图呢?数据流图与系统流程图又有什么区别呢?步骤1数据流图里包含的内容数据流图描述的是系统的逻辑模型,图中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。因为数据流图是逻辑系统的图形表示,即使不是专业的计算机技术人员

    2022年6月21日
    39
  • SecureCRT 命令行备注「建议收藏」

    SecureCRT 命令行备注「建议收藏」>查出某个域名绑定的IPnslookupapi.kaixin001.comNon-authoritativeanswer:Name:a.kaixin001.comAddresses:220.181.100.243,220.181.100.244,220.181.100.242,220.181.100.245,220.181.100.241,220…

    2022年10月21日
    0
  • Pytorch搭建DenseNet[通俗易懂]

    Pytorch搭建DenseNet[通俗易懂]文章目录DenseNet与ResNeXtDenseNet网络的搭建Growth_rateTransitionLayerBottleneck定义网络小测试问题1训练与测试可视化网络结构DenseNet与ResNeXt首先回顾一下DenseNet的结构,DenseNet的每一层都都与前面层相连,实现了特征重用。下图表示一个DenseBlock如图所示,在一个DenseBlock中,第i层的…

    2022年9月29日
    0
  • vector insert用法 C++「建议收藏」

    vector insert用法 C++「建议收藏」#include#includeusingnamespacestd;intmain(){vectorv(3);v[0]=2;//v[0]是第0个元素v[1]=7;v[2]=9;v.insert(v.begin(),8);//在最前面插入新元素。v.insert(v.begin()+

    2022年6月17日
    77
  • goland激活服务器(注册激活)

    (goland激活服务器)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html23LNPMIJZT-eyJsaWNlbnNlSWQi…

    2022年3月29日
    267

发表回复

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

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