使用多个麦克风检测声音方向


9

首先,我看到了一个类似的线程,但是它与我要实现的目标有点不同。我正在构建一个机器人,它将跟随调用它的人。我的想法是使用3个或4个麦克风-即按照以下安排,以确定从哪个方向调用机器人:

在此处输入图片说明

其中S是源,A,B和C是麦克风。这个想法是要计算从AB,AC,BC对记录的信号的相位相关性,并以此为基础构造一个矢量,该矢量将使用一种三角测量指向源。该系统甚至不必实时工作,因为它将被语音激活-来自所有麦克风的信号将被同时记录,仅从一个麦克风中采样声音,如果适合语音签名,将从最后一秒的分数,以便计算方向。我知道这可能无法很好地工作,例如,当从另一个房间调用机器人或有多次反射时。

这只是我的一个主意,但我从未尝试过类似的事情,在构造可以完成此工作的实际硬件之前,我有几个问题:

  1. 这是这样做的典型方法吗?(即用于电话中以消除噪音?)还有其他可能的方法吗?
  2. 可以以某种方式同时计算3个源之间的相位相关吗?(即为了加快计算速度)
  3. 22khz的采样率和12bit的深度对于该系统是否足够?我特别担心位深度。
  4. 是否应将麦克风放在单独的管子中以改善分离?

1
这是一篇有趣的文章,也许您已经看过。看来作者最终将第四个麦克风放在其他三个麦克风之上,以便处理阵列上方的声源。除此之外,它看起来与您的计划非常相似(至少在我未经训练的人看来)。
来宾

相位相关部分的总称是Beamforming。常见的波束成形系统使用线性麦克风阵列,但我不确定麦克风的“视觉”范围是否会真正允许进行三角测量。
pscheidler '18

关于三角剖分,我想您可以将两个或三个阵列相隔一定距离并找到光束的交点。可以用“嘿机器人...”(机器人转身面对您)...“过来!”来解决两光束退化的情况。
访客

实际上,可以通过再添加一个麦克风来工作。检查一下,这是Harry解决方案的一种变体。等边三角形变为直角三角形,再添加一个麦克风以形成另一个三角形。从每个三角形投射一个光束,并取这两个光束的平均值,以获得准确的方向矢量。注意演示中的两个“眼睛”。放置它们的目的是使当光源直接位于机器人的前面或后面时,穿过它们的光束将按三角位置定位。尝试使用任何y = 0的源。
来宾

1
@FilipePinto您是否已仔细阅读问题的答案和说明?它真的不能那样工作,因为您不知道每个麦克风的每个能量峰值如何与其他麦克风相关联-这就是为什么您需要相位相关,迭代最近点或其他某种注册算法(注册不涉及录音)的原因此处,但是将一个信号与另一个信号进行匹配)以匹配记录的波形并在某个时间窗口内检测它们的相互偏移
Max Walczak

Answers:


7

为了扩展穆勒的答案,

  1. 是否应将麦克风放在单独的管子中以改善分离?
  1. 不,您正在尝试确定声源的方向,添加电子管只会使声音在电子管内反弹,这是绝对不希望的。

    最好的做法是使他们直立,这样他们都会收到相似的声音,唯一与他们不同的是他们的身体位置,它们会直接影响相位。6 kHz正弦波的波长为。因此,如果您要唯一地识别高达6 kHz的正弦波相位(这是人类说话的典型频率),则应该将麦克风的间距最大为5.71毫米。这是一个项目speed of soundsound frequency=343 m/s6 kHz=5.71 mm直径小于5.71毫米。不要忘记添加一个截止频率在6-10 kHz左右的低通滤波器。

编辑

我觉得这个#2问题看起来很有趣,因此我决定尝试自行解决。

  1. 可以以某种方式同时计算3个源之间的相位相关吗?(即为了加快计算速度)

如果您知道线性代数,那么可以想象您将麦克风放置在一个三角形中,其中每个麦克风之间的距离为4 mm,每个内角为。60°

因此,假设它们处于此配置中:

       C
      / \
     /   \
    /     \
   /       \
  /         \
 A - - - - - B

我会...

  • 使用的命名法这是一个指向从矢量到AB¯AB
  • 叫我的原点A
  • 用毫米写所有数字
  • 使用3D数学,但以2D方向结束
  • 将麦克风的垂直位置设置为其实际波形。因此,这些方程式基于看起来像这样的声波。
  • 根据麦克风的位置和波形计算它们的叉积,然后忽略该叉积的高度信息,并使用arctan得出信号源的实际方向。
  • 调用在位置上的麦克风的输出,呼叫麦克风的输出在位置,呼叫麦克风的位置处的输出aAbBcC

因此,以下几点是正确的:

  • A=(0,0,a)
  • B=(4,0,b)
  • C=(2,4222=23,c)

这给我们:

  • AB¯=(4,0,ab)
  • AC¯=(2,23,ac)

叉积只是AB¯×AC¯

AB¯×AC¯=(40ab)×(223ac)=(0(ac)(ab)23(ab)24(ac)42302)=(23(ba)2a2b4c83)

Z信息只是垃圾,对我们来说是零利率。随着输入信号的变化,交叉矢量将朝着信号源来回摆动。因此,一半时间它将直接指向光源(忽略反射和其他寄生物)。而另一半的时间它将指向与源相距180度的位置。83

我在说的是,可以将其简化为,然后将弧度转换为度。arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

因此,最终得到的是以下等式:

arctan(a+b+2c3(ab))180π


但是有一半的时间信息实际上是100%错误的,那么如何.....应该100%地使它正确?

好吧,如果领先于,那么源就不可能更接近B。ab

换句话说,只需将以下内容简化即可:

source_direction=atan2(a+b+2c,\sqrt{3}*(a-b))*180/pi;
if(a>b){
   if(b>c){//a>b>c
     possible_center_direction=240; //A is closest, then B, last C
   }else if(a>c){//a>c>b
     possible_center_direction=180; //A is closest, then C last B
   }else{//c>a>b
     possible_center_direction=120; //C is closest, then A last B
   }
}else{
   if(c>b){//c>b>a
     possible_center_direction=60; //C is closest, then B, last A
   }else if(a>c){//b>a>c
     possible_center_direction=300; //B is closest, then A, last C
   }else{//b>c>a
     possible_center_direction=0; //B is closest, then C, last A
   }
}

//if the source is out of bounds, then rotate it by 180 degrees.
if((possible_center_direction+60)<source_direction){
  if(source_direction<(possible_center_direction-60)){
    source_direction=(source_direction+180)%360;
  }
}

也许您只想在声源是来自特定垂直角度的情况下做出反应,如果人们在麦克风上方讲话=> 0相变=>什么也不做。人们在它旁边水平交谈=>一些相变=>反应。

|P|=Px2+Py2=3(ab)2+(a+b+2c)2

因此,您可能需要将该阈值设置为较低的值,例如0.1或0.01。我不太确定,取决于音量,频率和寄生虫,请自己进行测试。

何时使用绝对值方程式的另一个原因是过零,当方向指向错误的方向时可能会稍有力矩。即使只有1%的时间,即使是这样。因此,您可能需要将一阶LP滤波器附加到该方向。

true_true_direction = true_true_direction*0.9+source_direction*0.1;

而且,如果您想对特定的音量做出反应,只需将3个麦克风加在一起,然后将其与某个触发值进行比较即可。麦克风的平均值将是它们的总和除以3,但是如果将触发值增加3倍,则不需要除以3。


我在将代码标记为C / C#/ C ++或JS或任何其他代码时遇到问题,因此可悲的是,代码违反了我的意愿。哦,祝你生意顺利。听起来很有趣。

另外,有50/50的可能性,即99%的时间方向与源之间的距离为180。我是犯此类错误的大师。不过,对此的更正只是将应添加180度时的if语句反转。


我想知道阶段的事情是否真的必要,或者每个麦克风是否只能寻找一些可识别的功能。如果所有麦克风都听到“嘿机器人”的声音,那么他们是否无法将“ bah”声音的开始对齐并忽略相位?那么您不需要将麦克风放得如此靠近……
Guest,

1
@HarrySvensson,我明白你的意思了。我以为您可以使用类似的方法,但自从第一个麦克风听到声音以来,,和会是毫秒数。我在这里玩了一下,但是当信号源,麦克风和机器人的中心不在一条直线上时,它并不能完美对齐。我认为可能“还可以”,请检查一下。当信号源远离麦克风时,错误也不会那么严重。我敢肯定它可以纠正,但是数学使我无所适从。abc
来宾

1
不知道我是否曾经在SE.DSP上看到过突出显示代码的地方。让我在老师休息室检查一下,看看他们怎么说。就像有人问长相上元,前一段时间,但没有采取任何行动:dsp.meta.stackexchange.com/questions/133/...
彼得·K.

1
请去更新在Meta.DSP上的帖子。我添加了标签<kbd> feature-request </ kbd>,该标签至少应该参与其中,但是我们需要投票。如果Chemistry.SE网站启用了该功能,则我们绝对应该!:-) dsp.meta.stackexchange.com/questions/133/...
彼得·K.

1
@endolith您是正确的,我现在删除了该部分。谢谢。
哈里·斯文森

4
  1. 是的,这是合理且典型的。
  2. 您也可以一次使用三个麦克风信号(而不是通过三个对相关进行“绕行”操作)。在到达方向应用程序中查找“ MUSIC”和“ ESPRIT”。
  3. 很有可能。您并不是要追求高音质,而是要拥有良好的相关性,而在这里和那里的一些地方可能不会破坏系统。另一方面,较高的采样率,例如非常常见的44.1 kHz或48 kHz,很可能会在相同的观察长度上立即使角度精度加倍。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.