複数のマイクを使用して音の方向を検出する


9

まず、似たようなスレッドを見たことがありますが、私が達成しようとしているスレッドとは少し異なります。呼ぶ人に追従するロボットを構築しています。私のアイデアは、3つまたは4つのマイクを使用することです。つまり、ロボットが呼び出された方向を決定するために、次の配置で使用します。

ここに画像の説明を入力してください

Sが音源の場合、A、B、Cはマイクです。アイデアは、AB、AC、BCのペアから記録された信号の位相相関を計算し、それに基づいて、一種の三角測量を使用してソースを指すベクトルを作成します。音声でアクティブ化されるため、システムはリアルタイムで動作する必要さえありません-すべてのマイクからの信号が同時に記録され、音声は1つのマイクのみからサンプリングされ、音声シグネチャに適合する場合、位相相関は方向を計算するための秒の最後の端数。ロボットが別の部屋から呼び出された場合や、複数の反射がある場合、これはうまく機能しない可能性があることを認識しています。

これは単なるアイデアですが、このようなことを試みたことは一度もありません。実際に機能するハードウェアを構築する前に、いくつか質問があります。

  1. これはこれを行う典型的な方法ですか?(すなわち、ノイズキャンセルのために電話で使用されますか?)他に可能なアプローチは何ですか?
  2. どういうわけか、3つのソース間の位相相関を同時に計算できますか?(計算をスピードアップするため)
  3. このシステムには、22kHzのサンプルレートと12ビットの深さで十分ですか?特にビット深度が気になります。
  4. 分離を改善するために、マイクを別々のチューブに配置する必要がありますか?

1
ここに興味深い記事があります。作者は、アレイの上にある音源に対処するために、他の3つのマイクの上に4つ目のマイクを配置したようです。それ以外は、あなたの計画にかなり似ています(少なくとも私の訓練されていない目にとって)。
ユーザーレビュー

位相相関部分の一般用語はビームフォーミングです。一般的なビームフォーミングシステムはマイクの線形配列を使用します。マイクの「視野」のフィールドが実際に多くの三角測量を可能にするかどうかはわかりません。
pscheidler 2018

三角測量については、2つまたは3つのアレイを少し距離をおいて設定し、ビームの交点を見つけることができると思います。「ねえロボット...」(ロボットがあなたの方を向く)...「ここに来て!」
ユーザーレビュー

実際には、もう1つのマイクを追加することで機能します。これを確認してください。これはハリーのソリューションのバリエーションです。正三角形が直角三角形になり、マイクがもう1つ追加されて別の三角形が形成されます。各三角形からビームをキャストし、これら2つのビームの平均をとって、正確な方向ベクトルを取得します。デモの2つの「目」に注目してください。それらが配置されているのは、光源がロボットの正面または背後にある場合、それらを通過するビームが三角測量の位置になるようにするためです。y = 0のソースで試してください。
ユーザーレビュー

1
@FilipePintoは、問題の回答と説明を完全に読みましたか?各マイクロフォンからの各エネルギーピークが他のマイクロフォンとどのように相関しているかを知ることができないため、それは実際にはそのように機能することはできません。そのため、位相相関、反復最近傍点、または他のいくつかの登録アルゴリズムが必要です(登録は録音を意味しません)ここでは、1つの信号を別の信号と照合します)、記録された波形を照合し、ある時間枠内でそれらの相互シフトを検出します
Max Walczak

回答:


7

ミュラーの答えを拡張するために、

  1. 分離を改善するために、マイクを別々のチューブに配置する必要がありますか?


  1. speed of soundsound frequency=343 m/s6 kHz=5.71 mm

編集する

この#2の質問は面白そうだと感じたので、自分で解決することにしました。

  1. どういうわけか、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,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つの理由は、ゼロクロッシングのためです。方向が間違った方向を向くときのために、わずかな瞬間があるかもしれません。たとえそれがあったとしても、それは時間の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ステートメントを反転するだけです。


フェーズが本当に必要なのか、それとも各マイクが識別可能な機能を探すことができるのか。すべてのマイクに「ちょっとロボット」と聞こえたら、その「バ」という音の始まりを揃えてフェーズを無視できないでしょうか。そうすれば、マイクを近づけて配置する必要はありません...
ゲスト

1
@HarrySvensson、私はあなたの意味を理解しています。最初のマイクが音を聞いてから、、が数ミリ秒になることを除い、あなたはあなたのアプローチのようなものを使うことができると思っていました。ここで遊んでみましたが、ソース、マイク、ロボットの中心がすべて揃っていないと完全に整列しません。「大丈夫」かもしれませんが、チェックしてみてください。ソースがマイクから遠い場合、エラーはそれほど悪くありません。きっと修正できると思いますが、数学は私から逃げ出します。b cabc
ユーザーレビュー

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. 3つのマイク信号を同時に使用することもできます(3つのペアの相関を「迂回」しないでください)。到着方向アプリケーションで「MUSIC」と「ESPRIT」を探します。
  3. たぶんそうです。あなたは高音質を目指しているわけではなく、良い相関関係のプロパティを目指しているので、ここの数ビットでシステムが壊れたり壊れたりすることはおそらくありません。一方、非常に一般的な44.1 kHzまたは48 kHzのような高いサンプリングレートでは、同じ観測長で角度精度が瞬時に2倍になります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.