基于麦克风阵列的声源定位算法之GCC-PHAT

目前基于麦克风阵列的声源定位方法大致可以分为三类:

基于最大输出功率的可控波束形成技术

基于高分辨率谱图估计技术和基于声音时间差(time-delay estimation,TDE)。

基于TDE的算法核心在于对传播时延的准确估计,一般通过对麦克风间信号做互相关处理得到。进一步获得声源位置信息,可以通过简单的延时求和、几何计算或是直接利用互相关结果进行可控功率响应搜索等方法。这类算法实现相对简单,运算量小,便于实时处理,因此在实际中运用最广。

GCC-PHAT

基于广义互相关函数的时延估计算法引入了一个加权函数,对互功率谱密度进行调整,从而优化时延估计的性能。根据加权函数的不同,广义互相关函数有多种不同的变形,其中广义互相关-相位变换方法(Generalized Cross Correlation PHAse Transformation,GCC-PHAT)方法应用最为广泛。GCC-PHAT方法本身具有一定的抗噪声和抗混响能力,但是在信噪比降低和混响增强时,该算法性能急剧下降。

研究表明麦克风对的GCC-PHAT函数的最大值越大则该对麦克风的接收信号越可靠,也就是接收信号质量越高。

1、计算传播时延

广义互相关函数时延估计算法根据两个麦克风信号的互相关函数峰值来估计时延值。在声源定位系统中,麦克风阵列的每个阵元接收到的目标信号都来自于同一个声源。因此,各通道信号之间具有较强的相关性。理想情况下,通过计算每两路信号之间的相关函数,就可以确定两个麦克风观测信号之间的时延。

阵列中两个麦克风的接收信号为:

                            

其中s(t)为声源信号,n1(t)和n2(t)为环境噪声,τ1和τ2是信号从声源处传播到两个麦克风阵元的传播时间。相关参数可参见下图:

    

互相关算法经常被用来做时延估计,表示为:

代入信号模型,则有:

此时因为s(t)和n1(t)互不相关,上式可以简化为:

其中τ12=τ1-τ2,假设n1和n2是互不相关的高斯白噪声,则上式可以进一步简化为:

由相关函数的性质可知,当τ12=τ1-τ2时,Rx1x2(τ)取最大值,是两个麦克风之间的时延。

互相关函数和互功率谱的关系:

 在麦克风阵列信号处理实际模型中,由于存在混响和噪声影响,导致Rx1x2(τ)的峰值不明显,降低了时延估计的精度。为了锐化Rx1x2(τ)的峰值,可以根据信号和噪声的先验知识,在频域内对互功率谱进行加权,从而能抑制噪声和混响干扰。最后进行傅里叶逆变换,得到广义互相关函数Rx1x2(τ):

其中φ12(w)表示频域加权函数。广义互相关时延估计算法框图如下:

 

 

2、常用加权函数及其特点

 相位变换加权函数的表达式为:

由上式可知,相位变换加权函数实质上是一个白化滤波器,使得信号间的互功率谱更加平滑,从而锐化广义互相关函数。经过PHAT加权之后,Rx1x2(τ)广义互相关函数的表达式为:

可以看出,经过PHAT加权的互功率谱近似于单位冲激响应的表达式,突出了时延的峰值,能够有效抑制混响噪声,提高时延估计的精度和准确度。

 

3、互相关函数

x(n)和y(n)的互相关函数是将x(n)保持不动, y(n)左移m个样本点,两个序列逐个相乘的结果,顺序不能互换。但是,按照时域卷积的方式求互相关函数的方法计算复杂度较大,所以将在频域进行操作(FFT和IFFT),即线性卷积的FFT算法。

两个信号的互相关函数的频域等于x信号频域的共轭乘以Y信号的频域。

 

4、近场和远场

需要说明的是,GCC-PHAT算法是用在近场模型下的。

当声源足够远时,麦克风阵列的直径与声源距离相比可忽略,此时一般采用远场模型。远场模型认为声源位于无穷远处,麦克风接收到的声波为平面波,此时我们仅考虑声波的入射方向,而不考虑声源相对于麦克风阵列的的距离。

当声源的距离较近时,我们需要考虑声源相对于麦克风阵列中的距离,此时远场模型里不再适用,应当采用近场模型。近场模型认为麦克风接收到的声波为球面波。近场模型更符合实际应用情况,能提供更多的声源位置信息,提高定位的精度。

通常,判断近场和远场的经验公式为:

             

其中d为麦克风阵列的直径,λ为目标信号的波长,r为麦克风阵列和声源之间距离。
在实际的近场模型应用中,麦克风阵列所接收到的信号主要包括3部分;声源直达信号、经过墙壁或障碍物的反射信号以及环境噪声信号。

声波的波长:0.017--17米。 波长=波速/频率,波速一般是340米/秒;,人耳听到的声音的频率是20HZ--20KHZ,所以得出人耳听到的声音的波长:0.017--17米。 

0.18*0.18*2/0.017 =3.8m

SRP-PHAT

SRP-PHAT(Steered Response Power - Phase Transform) 基于相位变换加权的可控响应功率的声源定位算法。

基于麦克风阵列的声源定位方法很多,相位变换加权的可控响应功率SRP-PHAT声源定位算法在混响环境中有较强的鲁棒性,可实现真实环境中的声源定位,因此该算法得到了广泛应用。SRP-PHAT对阵型没有特定要求,因此也适用于分布式阵列,事实上很多基于分布式阵列的定位系统采用了该算法。

SRP-PHAT算法的基本原理是在假想声源位置计算所有麦克风对接收信号的相位变换加权的广义互相关GCC-PHAT函数之和,在整个声源空间寻找使SRP值最大的点即为声源位置估计SRP-PHAT对混响有较强的鲁棒性,但是在低信噪比SNR(Signal-to-NoiseRatio)环境中其定位性能较差。

SRP-PHAT算法的计算流程如下:

其中, Q 为预先设定的搜索空间。

SRP-PHAT法是一种对窄带和宽带信号均可适用的有效方法, 得到了广泛研究和应用。但是由于其全局搜索算法运算量较大,限制了该方法的实时性。

 

扩展

GCC时延估计中,信号x1和x2都采用理想模型,并没有过多考虑混响噪声,所以当混响较强时,GCC时延估计算法效果较差。而自适应最小均方算法采用麦克风信号的实际模型,通过自适应滤波产生h1(n)和h2(n),再从h1(n)和h2(n)中估计时延,可以有效抑制混响的影响。

实际模型中,第i个麦克风接收的信号xi(t)可以表示为:

其中aik表示第k条反射路径到达第i个麦克风的能量衰减,τik表示对应的时延。*表示信号卷积,hi(t)称之为房间单位冲激响应函数,从数学角度反映了房间互相的物理特性。麦克风阵列信号的实际模型见下图:

如图所示,实际模型中,麦克风接收信号不仅包括声源的直达信号和环境噪声,还包括语音信号在墙壁以及房间的其他物体之间重复反射再到达麦克风的信号,我们称之为混响。

更多地,麦克风阵列信号的理想模型参见下图:

如上图所示,在理想模型中,假设麦克风阵列的所有阵元接收到的语音信号只包含直达信号与噪声信号,噪声信号为环境噪声(高斯白噪声),并且每个麦克风之间的噪声相互独立。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…