Erkennen der Schallrichtung mit mehreren Mikrofonen


9

Zunächst habe ich einen ähnlichen Thread gesehen, der sich jedoch ein wenig von dem unterscheidet, was ich erreichen möchte. Ich baue einen Roboter, der der Person folgt, die ihn anruft. Meine Idee ist es, 3 oder 4 Mikrofone zu verwenden - dh in der folgenden Anordnung, um zu bestimmen, aus welcher Richtung der Roboter gerufen wurde:

Geben Sie hier die Bildbeschreibung ein

Wo S die Quelle ist, sind A, B und C Mikrofone. Die Idee ist, die Phasenkorrelation von Signalen zu berechnen, die von den Paaren AB, AC, BC aufgezeichnet wurden, und auf dieser Grundlage einen Vektor zu konstruieren, der unter Verwendung einer Art Triangulation auf die Quelle zeigt. Das System muss nicht einmal in Echtzeit arbeiten, da es sprachaktiviert wird - Signale von allen Mikrofonen werden gleichzeitig aufgezeichnet, Sprache wird von nur einem Mikrofon abgetastet und wenn es zur Sprachsignatur passt, wird die Phasenkorrelation berechnet der letzte Sekundenbruchteil, um die Richtung zu berechnen. Mir ist bewusst, dass dies möglicherweise nicht gut funktioniert, z. B. wenn der Roboter aus einem anderen Raum gerufen wird oder wenn mehrere Reflexionen auftreten.

Dies ist nur eine Idee, die ich hatte, aber ich habe so etwas noch nie versucht und ich habe einige Fragen, bevor ich die eigentliche Hardware konstruiere, die die Arbeit erledigt:

  1. Ist das ein typischer Weg, dies zu tun? (dh in Telefonen zur Geräuschunterdrückung verwendet?) Was sind andere mögliche Ansätze?
  2. Kann die Phasenkorrelation zwischen 3 Quellen gleichzeitig berechnet werden? (dh um die Berechnung zu beschleunigen)
  3. Ist eine Abtastrate von 22 kHz und eine Tiefe von 12 Bit für dieses System ausreichend? Ich bin besonders besorgt über die Bittiefe.
  4. Sollten die Mikrofone in getrennten Röhren platziert werden, um die Trennung zu verbessern?

1
Hier ist ein interessanter Artikel , vielleicht haben Sie ihn gesehen. Es sieht so aus, als hätte der Autor ein viertes Mikrofon über die anderen 3 gestellt, um zu verhindern, dass sich die Schallquelle über dem Array befindet. Davon abgesehen sieht es Ihrem Plan ziemlich ähnlich (zumindest für mein ungeübtes Auge).
Gast

Der allgemeine Begriff für den Phasenkorrelationsteil lautet Beamforming. Ein übliches Beamforming-System verwendet eine lineare Anordnung von Mikrofonen, und ich bin nicht sicher, ob das Sichtfeld Ihrer Mikrofone wirklich viel Triangulation zulässt.
Pscheidler

In Bezug auf die Triangulation könnten Sie zwei oder drei der Arrays in einiger Entfernung voneinander aufstellen und den Schnittpunkt der Strahlen finden. Könnte den entarteten 2-Strahl-Fall mit "Hey Roboter ..." lösen (Roboter dreht sich zu dir um) ... "Komm her!"
Gast

Eigentlich könnte das funktionieren, indem man ein weiteres Mikrofon hinzufügt. Schauen Sie sich das an , es ist eine Variation von Harrys Lösung. Das gleichseitige Dreieck wird zu einem rechtwinkligen Dreieck, und ein weiteres Mikrofon wird hinzugefügt, um ein weiteres Dreieck zu bilden. Aus jedem Dreieck werfen wir einen Strahl und nehmen den Durchschnitt dieser beiden Strahlen, um einen genauen Richtungsvektor zu erhalten. Beachten Sie die beiden "Augen" in der Demo. Sie sind so platziert, dass die durch sie laufenden Strahlen die Position triangulieren, wenn sich die Quelle direkt vor oder hinter dem Roboter befindet. Probieren Sie es mit source bei einem beliebigen y = 0 aus.
Gast

1
@FilipePinto hast du die Antworten und die Beschreibung des Problems gründlich gelesen? So kann es nicht wirklich funktionieren, da Sie nicht wissen können, wie jeder Energiepeak von jedem Mikrofon mit anderen Mikrofonen korreliert ist. Deshalb benötigen Sie eine Phasenkorrelation, einen iterativen nächstgelegenen Punkt oder einen anderen Registrierungsalgorithmus (Registrierung bezieht sich nicht auf Aufzeichnung hier, aber um ein Signal gegen ein anderes abzugleichen), um aufgezeichnete Wellenformen abzugleichen und ihre gegenseitige Verschiebung innerhalb eines bestimmten Zeitfensters zu erkennen
Max Walczak

Antworten:


7

Um Müllers Antwort zu erweitern,

  1. Sollten die Mikrofone in getrennten Röhren platziert werden, um die Trennung zu verbessern?
  1. Nein, Sie versuchen, die Richtung der Quelle zu bestimmen. Wenn Sie Röhren hinzufügen, wird der Ton nur innerhalb der Röhre reflektiert, was definitiv nicht erwünscht ist.

    Die beste Vorgehensweise wäre, sie direkt nach oben zu richten. Auf diese Weise erhalten sie alle einen ähnlichen Klang. Das einzige, was an ihnen einzigartig ist, sind ihre physischen Platzierungen, die sich direkt auf die Phase auswirken. Eine 6-kHz-Sinuswelle hat eine Wellenlänge von . Wenn Sie also die Phasen von Sinuswellen bis zu 6 kHz eindeutig identifizieren möchten, die die typischen Frequenzen für menschliches Sprechen sind, sollten Sie die Mikrofone höchstens 5,71 mm voneinander entfernt platzieren. Hier ist ein Artikelspeed of soundsound frequency=343 m/s6 kHz=5.71 mmdas hat einen Durchmesser von weniger als 5,71 mm. Vergessen Sie nicht, einen Tiefpassfilter mit einer Grenzfrequenz von etwa 6-10 kHz hinzuzufügen.

Bearbeiten

Ich hatte das Gefühl, dass diese Frage Nr. 2 Spaß machte, und beschloss, sie selbst zu lösen.

  1. Kann die Phasenkorrelation zwischen 3 Quellen gleichzeitig berechnet werden? (dh um die Berechnung zu beschleunigen)

Wenn Sie Ihre lineare Algebra kennen, können Sie sich vorstellen, dass Sie die Mikrofone in einem Dreieck platziert haben, in dem jedes Mikrofon 4 mm voneinander entfernt ist und jeder Innenwinkel .60°

Nehmen wir also an, sie befinden sich in dieser Konfiguration:

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

Ich werde...

  • Verwenden Sie die Nomenklatur , einen Vektor, der von nachAB¯AB
  • nenne meine HerkunftA
  • Schreiben Sie alle Zahlen in mm
  • Verwenden Sie 3D-Mathematik, erhalten Sie jedoch eine 2D-Richtung
  • Stellen Sie die vertikale Position der Mikrofone auf ihre tatsächliche Wellenform ein. So diese Gleichungen auf einer soliden Basis sind so etwas wie das aussieht Welle dies .
  • Berechnen Sie das Kreuzprodukt dieser Mikrofone anhand ihrer Position und Wellenform, ignorieren Sie dann die Höheninformationen dieses Kreuzprodukts und verwenden Sie Arctan, um die tatsächliche Richtung der Quelle zu ermitteln.
  • Rufen Sie den Ausgang des Mikrofons an Position , nennen Sie den Ausgang des Mikrofons an Position , rufen Sie den Ausgang des Mikrofons an PositionaAbBcC

Folgende Dinge sind also wahr:

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

Dies gibt uns:

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

Und das Kreuzprodukt ist einfachAB¯×AC¯

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

Die Z-Information ist nur Junk, für uns kein Interesse. Wenn sich die Eingangssignale ändern, schwingt der Kreuzvektor zur Quelle hin und her. Die Hälfte der Zeit zeigt es also direkt auf die Quelle (ohne Berücksichtigung von Reflexionen und anderen Parasiten). Und die andere Hälfte der Zeit zeigt es 180 Grad von der Quelle entfernt.83

Ich spreche von das zu vereinfacht werden kann und drehen Sie dann das Bogenmaß in Grad.arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Am Ende haben Sie also die folgende Gleichung:

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


Aber die Hälfte der Zeit sind die Informationen buchstäblich 100% falsch, also wie ... sollte man ... es 100% der Zeit richtig machen?

Nun , wenn ist führendes , dann kann die Quelle nicht näher an B seinab

Mit anderen Worten, machen Sie einfach etwas wie dieses:

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;
  }
}

Und vielleicht möchten Sie nur reagieren, wenn die Schallquelle aus einem bestimmten vertikalen Winkel kommt, wenn Menschen über den Mikrofonen sprechen => 0 Phasenwechsel => nichts tun. Die Leute reden horizontal daneben => etwas Phasenwechsel => reagieren.

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

Vielleicht möchten Sie diesen Schwellenwert auf einen niedrigen Wert einstellen, z. B. 0,1 oder 0,01. Ich bin mir nicht ganz sicher, hängt von der Lautstärke und Frequenz und den Parasiten ab, testen Sie es selbst.

Ein weiterer Grund für die Verwendung der Absolutwertgleichung sind Nulldurchgänge. Es kann einen kleinen Moment geben, in dem die Richtung in die falsche Richtung zeigt. Obwohl es nur für 1% der Zeit sein wird, wenn auch das. Vielleicht möchten Sie der Richtung einen LP-Filter erster Ordnung hinzufügen.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

Und wenn Sie auf eine bestimmte Lautstärke reagieren möchten, addieren Sie einfach die 3 Mikrofone und vergleichen Sie diese mit einem Triggerwert. Der Mittelwert der Mikrofone wäre ihre Summe geteilt durch 3, aber Sie müssen nicht durch 3 teilen, wenn Sie den Triggerwert um einen Faktor 3 erhöhen.


Ich habe Probleme, den Code als C / C # / C ++ oder JS oder einen anderen zu markieren. Leider wird der Code entgegen meinen Wünschen schwarz auf weiß sein. Na ja, viel Glück bei Ihrem Vorhaben. Klingt lustig.

Es besteht auch eine 50/50-Chance, dass die Richtung 99% der Zeit 180 von der Quelle entfernt ist. Ich bin ein Meister darin, solche Fehler zu machen. Eine Korrektur hierfür wäre jedoch, einfach die if-Anweisungen umzukehren, wenn 180 Grad hinzugefügt werden sollen.


Ich frage mich, ob die Phasensache wirklich notwendig ist oder ob jedes Mikrofon nur nach einem identifizierbaren Merkmal suchen kann. Wenn alle Mikrofone "Hey Robot" hören, können sie dann nicht den Beginn dieses "Bah" -Sounds ausrichten und die Phase ignorieren? Dann sollten Sie die Mikrofone nicht so nahe beieinander platzieren müssen ...
Gast

1
@ HarrySvensson, ich verstehe was du meinst. Ich dachte, Sie könnten so etwas wie Ihren Ansatz verwenden, außer dass , und einige Millisekunden dauern würden, seit das erste Mikrofon den Ton hörte. Ich habe hier damit herumgespielt , aber es passt nicht perfekt zusammen, wenn die Quelle, ein Mikrofon und die Mitte des Roboters nicht alle in einer Linie liegen. Ich denke, es könnte "okay" sein, schau es dir an. Der Fehler ist nicht so schlimm, wenn die Quelle weit von Mikrofonen entfernt ist. Ich bin sicher, es könnte korrigiert werden, aber die Mathematik entgeht mir. b cabc
Gast

1
Ich bin mir nicht sicher, ob ich jemals Code-Hervorhebungen gesehen habe, die hier auf SE.DSP funktionieren. Lassen Sie mich in der Teacher's Lounge nachsehen, was sie sagen. Sieht so aus, als hätte jemand vor einiger Zeit auf Meta gefragt, aber es wurden keine Maßnahmen ergriffen: dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
Bitte gehen Sie und stimmen Sie diesen Beitrag auf Meta.DSP. Ich habe das Tag <kbd> Feature-Anfrage </ kbd> hinzugefügt, das zumindest ein gewisses Engagement sehen sollte, aber wir brauchen die Stimmen. Wenn die Chemistry.SE-Site es aktiviert hat, sollten wir es auf jeden Fall tun! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
@endolith Du bist richtig, ich habe diesen Teil jetzt entfernt. Danke.
Harry Svensson

4
  1. Ja, das fühlt sich vernünftig und typisch an.
  2. Sie können genauso gut die drei Mikrofonsignale gleichzeitig verwenden (ohne den "Umweg" durch Ihre drei Paarkorrelationen zu gehen). Suchen Sie in Anwendungen für die Ankunftsrichtung nach "MUSIC" und "ESPRIT".
  3. Sehr wahrscheinlich ist es. Sie streben keine hohe Audioqualität an, Sie streben gute Corss-Korrelationseigenschaften an, und ein paar Bits hier und da werden das System wahrscheinlich nicht beschädigen oder beschädigen. Eine höhere Abtastrate wie die sehr üblichen 44,1 kHz oder 48 kHz würde andererseits die Winkelgenauigkeit bei gleicher Beobachtungslänge sehr wahrscheinlich sofort verdoppeln.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.