Détection de la direction du son à l'aide de plusieurs microphones

9

Tout d'abord, j'ai vu un fil similaire, mais il est un peu différent de ce que j'essaie de réaliser. Je construis un robot qui suivra la personne qui l'appelle. Mon idée est d'utiliser 3 ou 4 microphones - c'est-à-dire dans la disposition suivante afin de déterminer de quelle direction le robot a été appelé:

entrez la description de l'image ici

Où S est la source, A, B et C sont des microphones. L'idée est de calculer la corrélation de phase des signaux enregistrés à partir des paires AB, AC, BC et à partir de cette construction un vecteur qui pointera vers la source en utilisant une sorte de triangulation. Le système n'a même pas à fonctionner en temps réel car il sera activé par la voix - les signaux de tous les microphones seront enregistrés simultanément, la voix sera échantillonnée à partir d'un seul microphone et si elle correspond à la signature vocale, la corrélation de phase sera calculée à partir de la dernière fraction de seconde afin de calculer la direction. Je suis conscient que cela pourrait ne pas fonctionner trop bien, c'est-à-dire lorsque le robot est appelé d'une autre pièce ou lorsqu'il y a plusieurs réflexions.

Ce n'est qu'une idée que j'ai eue, mais je n'ai jamais rien tenté de tel et j'ai plusieurs questions avant de construire le matériel réel qui fera le travail:

  1. Est-ce une façon typique de procéder? (c'est-à-dire utilisé dans les téléphones pour la suppression du bruit?) Quelles sont les autres approches possibles?
  2. La corrélation de phase peut-elle être calculée entre 3 sources simultanément d'une manière ou d'une autre? (c'est-à-dire afin d'accélérer le calcul)
  3. La fréquence d'échantillonnage de 22 kHz et la profondeur de 12 bits sont-elles suffisantes pour ce système? Je suis particulièrement préoccupé par la profondeur de bits.
  4. Les microphones doivent-ils être placés dans des tubes séparés afin d'améliorer la séparation?
Max Walczak
la source
1
Voici un article intéressant , vous l'avez peut-être vu. Il semble que l'auteur ait fini par mettre un quatrième micro au-dessus des 3 autres afin de gérer la source sonore au-dessus du réseau. En dehors de cela, cela ressemble assez à votre plan (à mon avis, du moins).
Invité le
Le terme général pour la partie de corrélation de phase est Beamforming. Un système de formation de faisceaux commun utilise un réseau linéaire de microphones, et je ne suis pas sûr que le champ de "vision" de vos microphones permettra vraiment beaucoup de triangulation.
pscheidler
En ce qui concerne la triangulation, je suppose que vous pouvez configurer deux ou trois des tableaux à une certaine distance l'un de l'autre et trouver l'intersection des faisceaux. Pourrait résoudre le cas dégénéré à 2 faisceaux avec "hey robot ..." (le robot se tourne vers vous) ... "venez ici!"
Invité du
En fait, cela pourrait fonctionner en ajoutant un micro de plus. Regardez ça , c'est une variante de la solution d'Harry. Le triangle équilatéral devient un triangle rectangle et un micro supplémentaire est ajouté pour former un autre triangle. De chaque triangle, nous projetons un faisceau et prenons la moyenne de ces deux faisceaux pour obtenir un vecteur de direction précis. Remarquez les deux "yeux" dans la démo. Ils sont placés de sorte que les faisceaux qui les traversent triangulent la position lorsque la source est directement devant ou derrière le robot. Essayez-le avec la source à tout y = 0.
Invité le
1
@FilipePinto avez-vous lu attentivement les réponses et la description du problème? Cela ne peut pas vraiment fonctionner comme ça car vous ne pouvez pas savoir comment chaque pic d'énergie de chaque microphone est corrélé avec d'autres microphones - c'est pourquoi vous avez besoin d'une corrélation de phase, du point le plus proche itératif ou d'un autre algorithme d'enregistrement (l'enregistrement ne fait pas référence à l'enregistrement ici, mais pour faire correspondre un signal à un autre) pour faire correspondre les formes d'onde enregistrées et détecter leur décalage mutuel dans une certaine période de temps
Max Walczak

Réponses:

7

Pour étendre la réponse de Müller,

  1. Les microphones doivent-ils être placés dans des tubes séparés afin d'améliorer la séparation?
  1. Non, vous essayez d'identifier la direction de la source, l'ajout de tubes ne fera que faire rebondir le son à l'intérieur du tube, ce qui n'est certainement pas souhaité.

    La meilleure façon de procéder serait de les faire face directement, de cette façon, ils recevront tous un son similaire et la seule chose qui est unique à leur sujet est leur placement physique qui affectera directement la phase. Une onde sinusoïdale de 6 kHz a une longueur d'onde de speed of soundsound frequency=343 m/s6 kHz=5.71 mm. Donc, si vous souhaitez identifier de manière unique les phases des ondes sinusoïdales jusqu'à 6 kHz, qui sont les fréquences typiques de la conversation humaine, vous devez espacer les microphones d'au plus 5,71 mm. Voici unarticledont le diamètre est inférieur à 5,71 mm. N'oubliez pas d'ajouter un filtre passe-bas avec une fréquence de coupure à environ 6-10 kHz.

Éditer

J'ai senti que cette question n ° 2 avait l'air amusante, alors j'ai décidé d'essayer de la résoudre par moi-même.

  1. La corrélation de phase peut-elle être calculée entre 3 sources simultanément d'une manière ou d'une autre? (c'est-à-dire afin d'accélérer le calcul)

60° .

Supposons donc qu'ils sont dans cette configuration:

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

Je vais...

  • AB¯AB
  • A mon origine
  • écrire tous les nombres en mm
  • utiliser les mathématiques 3D mais se retrouver avec une direction 2D
  • réglez la position verticale des microphones sur leur forme d'onde réelle. Donc, ces équations sont basées sur une onde sonore qui ressemble à ceci .
  • Calculez le produit croisé de ces microphones en fonction de leur position et de leur forme d'onde, puis ignorez les informations de hauteur de ce produit croisé et utilisez arctan pour trouver la direction réelle de la source.
  • aAbBcC

Donc, les choses suivantes sont vraies:

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

Cela nous donne:

  • 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)

83

arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Donc, vous vous retrouvez avec l'équation suivante:

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


Mais la moitié du temps, les informations sont littéralement erronées à 100%, alors comment ... faut-il ... faire les choses correctement à 100%?

ab , la source ne peut pas être plus proche de B.

En d'autres termes, faites simplement quelque chose de simple comme ceci:

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

Et peut-être que vous ne voulez réagir que si la source sonore provient d'un angle vertical spécifique, si les gens parlent au-dessus des microphones => 0 changement de phase => ne faites rien. Les gens parlent horizontalement à côté => un changement de phase => réagissent.

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

Donc, vous voudrez peut-être définir ce seuil à quelque chose de bas, comme 0,1 ou 0,01. Je ne suis pas tout à fait sûr, cela dépend du volume et de la fréquence et des parasites, testez-le vous-même.

Une autre raison pour laquelle utiliser l'équation de la valeur absolue est pour les passages à zéro, il peut y avoir un léger moment où la direction pointera dans la mauvaise direction. Bien que ce ne soit que pour 1% du temps, même si cela. Donc, vous voudrez peut-être attacher un filtre LP de premier ordre à la direction.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

Et si vous voulez réagir à un volume spécifique, additionnez simplement les 3 microphones ensemble et comparez cela à une valeur de déclenchement. La valeur moyenne des microphones serait leur somme divisée par 3, mais vous n'avez pas besoin de diviser par 3 si vous augmentez la valeur de déclenchement d'un facteur 3.


J'ai des problèmes avec le marquage du code comme C / C # / C ++ ou JS ou tout autre, donc malheureusement le code sera noir sur blanc, contre mes souhaits. Eh bien, bonne chance dans votre aventure. Ça a l'air amusant.

Il y a également 50% de chances que la direction soit à 180% de la source 99% du temps. Je suis passé maître dans ces erreurs. Une correction serait cependant d'inverser simplement les instructions if pour quand 180 degrés devraient être ajoutés.

Harry Svensson
la source
Je me demande si la phase est vraiment nécessaire, ou si chaque micro peut simplement rechercher une fonction identifiable. Si tous les micros entendent "hey robot", ne pourraient-ils pas aligner le début de ce son "bah" et ignorer la phase? Alors vous ne devriez pas avoir besoin de placer les micros si près l'un de l'autre ...
Invité le
1
abc
1
Je ne suis pas sûr d'avoir jamais vu le surlignage de code fonctionner ici sur SE.DSP. Laissez-moi vérifier avec le salon des enseignants et voir ce qu'ils disent. On dirait que quelqu'un a posé une question sur Meta il y a quelque temps, mais aucune mesure n'a été prise: dsp.meta.stackexchange.com/questions/133/…
Peter K.
1
Veuillez aller voter vers le haut sur ce post sur Meta.DSP. J'ai ajouté la balise <kbd> feature-request </kbd> qui devrait au moins voir un certain engagement, mais nous avons besoin des votes. Si le site Chemistry.SE l'a activé, nous devrions certainement! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.
1
@endolith Vous avez raison, j'ai maintenant supprimé cette partie. Je vous remercie.
Harry Svensson
4
  1. Oui, cela semble raisonnable et typique.
  2. Vous pouvez tout aussi bien utiliser les trois signaux de microphone à la fois (sans faire le "détour" à travers vos trois corrélations de paires). Recherchez "MUSIC" et "ESPRIT" dans les applications de direction d'arrivée.
  3. C'est très probable. Vous ne visez pas une qualité audio élevée, vous visez de bonnes propriétés de corrélation corses, et quelques bits ici et là ne feront ou ne casseront probablement pas le système. Un taux d'échantillonnage plus élevé comme le très commun 44,1 kHz ou 48 kHz, d'autre part, doublerait instantanément la précision angulaire, très probablement, sur la même longueur d'observation.
Marcus Müller
la source