Rilevamento della direzione del suono utilizzando diversi microfoni


9

Prima di tutto, ho visto un thread simile, tuttavia è un po 'diverso da quello che sto cercando di ottenere. Sto costruendo un robot che seguirà la persona che lo chiama. La mia idea è di usare 3 o 4 microfoni, ovvero nella seguente disposizione per determinare da quale direzione è stato chiamato il robot:

inserisci qui la descrizione dell'immagine

Dove S è sorgente, A, B e C sono microfoni. L'idea è di calcolare la correlazione di fase dei segnali registrati dalle coppie AB, AC, BC e basata su quel costrutto un vettore che punterà alla sorgente usando una specie di triangolazione. Il sistema non deve nemmeno funzionare in tempo reale perché sarà attivato dalla voce: i segnali provenienti da tutti i microfoni verranno registrati contemporaneamente, la voce verrà campionata da un solo microfono e se si adatta alla firma vocale, la correlazione di fase verrà calcolata da l'ultima frazione di secondo per calcolare la direzione. Sono consapevole che questo potrebbe non funzionare troppo bene, ad esempio quando il robot viene chiamato da un'altra stanza o quando ci sono più riflessi.

Questa è solo un'idea che ho avuto, ma non ho mai provato nulla del genere e ho diverse domande prima di costruire l'hardware effettivo che farà il lavoro:

  1. È un modo tipico di farlo? (ovvero utilizzato nei telefoni per la cancellazione del rumore?) Quali sono altri approcci possibili?
  2. La correlazione di fase può essere calcolata tra 3 fonti contemporaneamente in qualche modo? (ovvero per accelerare il calcolo)
  3. La frequenza di campionamento di 22 kHz e la profondità di 12 bit sono sufficienti per questo sistema? Sono particolarmente preoccupato per la profondità del bit.
  4. I microfoni devono essere collocati in tubi separati per migliorare la separazione?

1
Ecco un articolo interessante , forse l'hai visto. Sembra che l'autore abbia finito per mettere un quarto microfono sopra l'altro 3 per gestire la sorgente sonora sopra l'array. A parte questo sembra abbastanza simile al tuo piano (almeno per il mio occhio non allenato).
Ospite il

Il termine generale per la parte di correlazione di fase è Beamforming. Un comune sistema di beamforming utilizza un array lineare di microfoni e non sono sicuro che il campo di "visione" per i tuoi microfoni consentirà davvero molta triangolazione.
pscheidler,

Per quanto riguarda la triangolazione, suppongo che potresti impostare due o tre delle matrici a una certa distanza e trovare l'intersezione delle travi. Potrebbe risolvere il caso degenerato a 2 raggi con "hey robot ..." (il robot si gira verso di te) ... "vieni qui!"
Ospite il

In realtà, potrebbe funzionare aggiungendo un altro microfono. Dai un'occhiata , è una variante della soluzione di Harry. Il triangolo equilatero diventa un triangolo rettangolo e viene aggiunto un altro microfono per formare un altro triangolo. Da ogni triangolo lanciamo un raggio e prendiamo la media di quei due raggi per ottenere un vettore di direzione accurato. Notare i due "occhi" nella demo. Sono posizionati in modo tale che i raggi che li attraversano triangolino la posizione quando la sorgente è direttamente davanti o dietro il robot. Provalo con l'origine in qualsiasi y = 0.
Ospite

1
@FilipePinto hai letto a fondo le risposte e la descrizione del problema? Non può davvero funzionare così poiché non puoi sapere come ogni picco di energia di ciascun microfono sia correlato con altri microfoni - ecco perché hai bisogno di correlazione di fase, punto iterativo più vicino o qualche altro algoritmo di registrazione (la registrazione non si riferisce alla registrazione qui, ma per far corrispondere un segnale a un altro) per abbinare le forme d'onda registrate e rilevare il loro mutuo spostamento entro un certo intervallo di tempo
Max Walczak,

Risposte:


7

Per estendere la risposta di Müller,

  1. I microfoni devono essere collocati in tubi separati per migliorare la separazione?


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

modificare

Ho sentito che questa domanda n. 2 sembrava divertente, quindi ho deciso di provare a risolverlo da solo.

  1. La correlazione di fase può essere calcolata tra 3 fonti contemporaneamente in qualche modo? (ovvero per accelerare il calcolo)

Se conosci la tua algebra lineare, puoi immaginare di aver posizionato i microfoni in un triangolo in cui ciascun microfono è a 4 mm di distanza l'uno dall'altro, facendo sì che ciascun angolo interno sia di .60°

Supponiamo quindi che siano in questa configurazione:

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

Lo farò...

  • usa la nomenclatura che è un vettore che punta da aAB¯AB
  • chiama mia origineA
  • scrivi tutti i numeri in mm
  • usa la matematica 3D ma finisci con una direzione 2D
  • imposta la posizione verticale dei microfoni sulla loro forma d'onda effettiva. Quindi, queste equazioni sono basate su un suono onda che assomigli a questo .
  • Calcola il prodotto incrociato di questi microfoni in base alla loro posizione e forma d'onda, quindi ignora le informazioni sull'altezza da questo prodotto incrociato e usa arctan per trovare la direzione effettiva della sorgente.
  • chiama l'uscita del microfono in posizione , chiama l'uscita del microfono in posizione , chiama l'uscita del microfono in posizioneaAbBcC

Quindi le seguenti cose sono vere:

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

Questo ci dà:

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

E il prodotto incrociato è semplicementeAB¯×AC¯

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

Le informazioni Z, sono solo spazzatura, zero interesse per noi. Man mano che i segnali di ingresso cambiano, il vettore incrociato oscilla avanti e indietro verso la sorgente. Quindi metà del tempo indicherà direttamente la fonte (ignorando i riflessi e altri parassiti). E l'altra metà del tempo punterà a 180 gradi di distanza dalla sorgente.83

Quello di cui sto parlando è che può essere semplificato in , quindi trasforma i radianti in gradi.arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Quindi quello che si finisce con è la seguente equazione:

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


Ma la metà delle volte le informazioni sono letteralmente sbagliate al 100%, quindi come ... dovresti ... renderle corrette al 100% delle volte?

Bene, se sta conducendo , la fonte non può essere più vicina a B.ab

In altre parole, basta fare qualcosa di semplice come questo:

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

E forse vuoi solo reagire se la sorgente sonora proviene da un angolo verticale specifico, se le persone parlano sopra i microfoni => 0 cambio di fase => non fare nulla. Le persone parlano in orizzontale accanto ad esso => ​​alcuni cambiamenti di fase => reagiscono.

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

Quindi potresti voler impostare quella soglia su qualcosa di basso, come 0,1 o 0,01. Non ne sono del tutto sicuro, dipende dal volume e dalla frequenza e dai parassiti, provalo tu stesso.

Un altro motivo per quando usare l'equazione del valore assoluto è per zero incroci, potrebbe esserci un leggero momento in cui la direzione punterà nella direzione sbagliata. Anche se sarà solo per l'1% delle volte, anche solo quello. Quindi potresti voler collegare un filtro LP del primo ordine alla direzione.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

E se vuoi reagire a un volume specifico, somma i 3 microfoni e confrontali con un valore di trigger. Il valore medio dei microfoni sarebbe la loro somma divisa per 3, ma non è necessario dividere per 3 se si aumenta il valore di trigger per un fattore 3.


Sto riscontrando problemi con la marcatura del codice come C / C # / C ++ o JS o qualsiasi altro, quindi purtroppo il codice sarà nero su bianco, contro i miei desideri. Oh bene, buona fortuna per la tua impresa. Sembra divertente.

Inoltre c'è una probabilità del 50/50 che la direzione sia lontana 180% dal 99% delle volte. Sono un maestro nel fare simili errori. Una correzione per questo sarebbe però di invertire le istruzioni if ​​per quando aggiungere 180 gradi.


Mi chiedo se la cosa della fase sia davvero necessaria, o se ogni microfono può semplicemente cercare qualche caratteristica identificabile. Se tutti i microfoni sentono "hey robot", allora non potrebbero allineare l'inizio di quel suono "bah" e ignorare la fase? Quindi non dovresti aver bisogno di mettere i microfoni così vicini tra loro ...
Ospite

1
@HarrySvensson, capisco cosa intendi. Stavo pensando si potrebbe usare qualcosa come il vostro approccio, ad eccezione di , e sarebbe un numero di millisecondi da quando il primo microfono sentito il rumore. Ci ho giocato qui , ma non si allinea perfettamente quando la sorgente, un microfono e il centro del robot non sono tutti in linea. Penso che potrebbe essere "ok", controlla. L'errore non è così grave quando la fonte è lontana dai microfoni. Sono sicuro che potrebbe essere corretto, ma la matematica mi sfugge. b cabc
Ospite il

1
Non sono sicuro di aver mai visto evidenziare il codice lavorare qui su SE.DSP. Fammi controllare con la Teacher's Lounge e vedere cosa dicono. Sembra che qualcuno abbia chiesto a Meta qualche tempo fa, ma nessuna azione è stata intrapresa: dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
Per favore, vai e vota quel post su Meta.DSP. Ho aggiunto il tag <kbd> feature-request </kbd> che dovrebbe almeno vedere un po 'di coinvolgimento, ma abbiamo bisogno dei voti. Se il sito Chemistry.SE è abilitato, dovremmo assolutamente! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
@endolith Hai ragione, ora ho rimosso quella parte. Grazie.
Harry Svensson,

4
  1. Sì, sembra ragionevole e tipico.
  2. Puoi anche usare contemporaneamente i tre segnali del microfono (non passare alla "deviazione" attraverso le tue correlazioni a tre coppie). Cerca "MUSIC" e "ESPRIT" nelle applicazioni della direzione di arrivo.
  3. Molto probabilmente lo è. Non stai puntando su un'alta qualità audio, stai puntando su buone proprietà di correlazione corss e alcuni bit qua e là probabilmente non faranno o romperanno il sistema. Una frequenza di campionamento più elevata come il molto comune 44,1 kHz o 48 kHz, d'altra parte, raddoppierebbe istantaneamente la precisione angolare, molto probabilmente, sulla stessa lunghezza osservativa.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.