ミュラーの答えを拡張するために、
- 分離を改善するために、マイクを別々のチューブに配置する必要がありますか?
speed of soundsound frequency=343 m/s6 kHz=5.71 mm
編集する
この#2の質問は面白そうだと感じたので、自分で解決することにしました。
- どういうわけか、3つのソース間の位相相関を同時に計算できますか?(計算をスピードアップするため)
線形代数がわかっている場合は、マイクロフォンが互いに4 mm離れた三角形に配置し、各内角を想像できます。60°
それで、それらがこの構成にあると仮定しましょう:
C
/ \
/ \
/ \
/ \
/ \
A - - - - - B
します...
- から指すベクトルであるを使用しますAB¯¯¯¯¯¯¯¯AB
- 呼び出し私の原点A
- すべての数値をmmで書く
- 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つの理由は、ゼロクロッシングのためです。方向が間違った方向を向くときのために、わずかな瞬間があるかもしれません。たとえそれがあったとしても、それは時間の1%だけのためですが。したがって、1次のLPフィルターを方向にアタッチすることができます。
true_true_direction = true_true_direction*0.9+source_direction*0.1;
そして、特定の音量に反応させたい場合は、3つのマイクを合計して、それをトリガー値と比較します。マイクの平均値は、合計を3で割ったものになりますが、トリガー値を3倍に増やす場合は、3で割る必要はありません。
コードをC / C#/ C ++またはJSまたはその他としてマークする際に問題が発生したため、残念ながら、コードは私の希望に反して白地に黒になります。まあ、あなたの冒険に頑張ってください。楽しそう。
また、方向がソースから180%離れる確率が99/50%の確率で50/50です。私はそのような過ちを犯すことの達人です。ただし、これを修正するには、180度を追加する必要がある場合のifステートメントを反転するだけです。