为了扩展穆勒的答案,
- 是否应将麦克风放在单独的管子中以改善分离?
- 不,您正在尝试确定声源的方向,添加电子管只会使声音在电子管内反弹,这是绝对不希望的。
最好的做法是使他们直立,这样他们都会收到相似的声音,唯一与他们不同的是他们的身体位置,它们会直接影响相位。6 kHz正弦波的波长为。因此,如果您要唯一地识别高达6 kHz的正弦波相位(这是人类说话的典型频率),则应该将麦克风的间距最大为5.71毫米。这是一个项目speed of soundsound frequency=343 m/s6 kHz=5.71 mm直径小于5.71毫米。不要忘记添加一个截止频率在6-10 kHz左右的低通滤波器。
编辑
我觉得这个#2问题看起来很有趣,因此我决定尝试自行解决。
- 可以以某种方式同时计算3个源之间的相位相关吗?(即为了加快计算速度)
如果您知道线性代数,那么可以想象您将麦克风放置在一个三角形中,其中每个麦克风之间的距离为4 mm,每个内角为。60°
因此,假设它们处于此配置中:
C
/ \
/ \
/ \
/ \
/ \
A - - - - - B
我会...
- 使用的命名法这是一个指向从矢量到AB¯¯¯¯¯¯¯¯AB
- 叫我的原点A
- 用毫米写所有数字
- 使用3D数学,但以2D方向结束
- 将麦克风的垂直位置设置为其实际波形。因此,这些方程式基于看起来像这样的声波。
- 根据麦克风的位置和波形计算它们的叉积,然后忽略该叉积的高度信息,并使用arctan得出信号源的实际方向。
- 调用在位置上的麦克风的输出,呼叫麦克风的输出在位置,呼叫麦克风的位置处的输出aAbBcC
因此,以下几点是正确的:
- A=(0,0,a)
- B=(4,0,b)
- C=(2,42−22−−−−−−√=23–√,c)
这给我们:
- AB¯¯¯¯¯¯¯¯=(4,0,a−b)
- AC¯¯¯¯¯¯¯¯=(2,23–√,a−c)
叉积只是AB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯
AB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯=⎛⎝⎜40a−b⎞⎠⎟×⎛⎝⎜223–√a−c⎞⎠⎟=⎛⎝⎜0⋅(a−c)−(a−b)⋅23–√(a−b)⋅2−4⋅(a−c)4⋅23–√−0⋅2⎞⎠⎟=⎛⎝⎜23–√(b−a)−2a−2b−4c83–√⎞⎠⎟
Z信息只是垃圾,对我们来说是零利率。随着输入信号的变化,交叉矢量将朝着信号源来回摆动。因此,一半时间它将直接指向光源(忽略反射和其他寄生物)。而另一半的时间它将指向与源相距180度的位置。83–√
我在说的是,可以将其简化为,然后将弧度转换为度。arctan(−2a−2b−4c23√(b−a))arctan(a+b+2c3√(a−b))
因此,最终得到的是以下等式:
arctan(a+b+2c3–√(a−b))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|=P2x+P2y−−−−−−−√=3(a−b)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语句反转。