Wykrywanie kierunku dźwięku za pomocą kilku mikrofonów


9

Przede wszystkim widziałem podobny wątek, jednak różni się on nieco od tego, co próbuję osiągnąć. Buduję robota, który będzie podążał za osobą, która go nazywa. Moim pomysłem jest użycie 3 lub 4 mikrofonów - tj. W następującym układzie, aby określić, z którego kierunku został wywołany robot:

wprowadź opis zdjęcia tutaj

Gdzie S jest źródłem, A, B i C są mikrofonami. Pomysł polega na obliczeniu korelacji fazowej sygnałów zarejestrowanych z par AB, AC, BC i na podstawie tej konstrukcji wektor, który będzie wskazywał na źródło przy użyciu pewnego rodzaju triangulacji. System nie musi nawet działać w czasie rzeczywistym, ponieważ zostanie aktywowany głosem - sygnały ze wszystkich mikrofonów będą nagrywane jednocześnie, głos będzie próbkowany tylko z jednego mikrofonu, a jeśli pasuje do sygnatury głosowej, korelacja faz zostanie obliczona na podstawie ostatnia część sekundy w celu obliczenia kierunku. Zdaję sobie sprawę, że może to nie działać zbyt dobrze, tj. Gdy robot jest wywoływany z innego pokoju lub gdy występuje wiele odbić.

To tylko mój pomysł, ale nigdy nie próbowałem czegoś takiego i mam kilka pytań, zanim zbuduję rzeczywisty sprzęt, który wykona zadanie:

  1. Czy to typowy sposób na zrobienie tego? (tj. używane w telefonach do eliminacji hałasu?) Jakie są inne możliwe podejścia?
  2. Czy można jakoś obliczyć korelację fazową między 3 źródłami? (tj. w celu przyspieszenia obliczeń)
  3. Czy częstotliwość próbkowania 22 kHz i głębokość 12 bitów są wystarczające dla tego systemu? Szczególnie martwi mnie głębokość bitów.
  4. Czy mikrofony powinny być umieszczone w osobnych rurkach, aby poprawić separację?

1
Oto interesujący artykuł , być może już go widziałeś. Wygląda na to, że autor ostatecznie postawił czwarty mikrofon nad pozostałymi 3, aby poradzić sobie ze źródłem dźwięku znajdującym się powyżej tablicy. Poza tym wygląda dość podobnie do twojego planu (przynajmniej dla mojego niewprawnego oka).
Gość

Ogólnym terminem dla części korelacji fazowej jest Beamforming. Wspólny system kształtowania wiązki wykorzystuje liniowy układ mikrofonów i nie jestem pewien, czy pole widzenia dla twoich mikrofonów naprawdę pozwoli na wiele triangulacji.
pscheidler

Jeśli chodzi o triangulację, myślę, że można ustawić dwie lub trzy tablice w pewnej odległości od siebie i znaleźć przecięcie wiązek. Mógł rozwiązać 2-wiązkową zdegenerowaną skrzynkę za pomocą „hej robota ...” (robot odwraca się do ciebie)… „chodź tutaj!”
Gość

Właściwie to może działać, dodając jeszcze jeden mikrofon. Sprawdź to , jest to odmiana rozwiązania Harry'ego. Trójkąt równoboczny staje się trójkątem prostokątnym i dodaje się jeszcze jeden mikrofon, aby utworzyć kolejny trójkąt. Z każdego trójkąta rzucamy wiązkę i bierzemy średnią z tych dwóch wiązek, aby uzyskać dokładny wektor kierunku. Zwróć uwagę na dwa „oczy” w demie. Są one umieszczone tak, aby przepływające przez nie wiązki triangulowały pozycję, gdy źródło znajduje się bezpośrednio przed lub za robotem. Wypróbuj ze źródłem w dowolnym y = 0.
Gość

1
@FilipePinto czy dokładnie przeczytałeś odpowiedzi i opis problemu? To nie może tak naprawdę działać, ponieważ nie możesz wiedzieć, jak każdy szczyt energii z każdego mikrofonu jest skorelowany z innymi mikrofonami - dlatego potrzebujesz korelacji faz, iteracyjnego najbliższego punktu lub innego algorytmu rejestracji (rejestracja nie odnosi się do nagrywania tutaj, ale w celu dopasowania jednego sygnału do drugiego), aby dopasować zarejestrowane przebiegi i wykryć ich wzajemne przesunięcie w określonym
Max Walczak

Odpowiedzi:


7

Aby rozszerzyć odpowiedź Müllera,

  1. Czy mikrofony powinny być umieszczone w osobnych rurkach, aby poprawić separację?
  1. Nie, próbujesz określić kierunek źródła, dodanie lamp spowoduje, że dźwięk odbije się tylko wewnątrz lampy, co zdecydowanie nie jest pożądane.

    Najlepszym rozwiązaniem byłoby skierowanie ich twarzą do góry, w ten sposób wszyscy otrzymają podobny dźwięk, a jedyne, co jest w nich wyjątkowe, to ich fizyczne rozmieszczenie, które będzie miało bezpośredni wpływ na fazę. Fala sinusoidalna 6 kHz ma długość fali wynoszącąspeed of soundsound frequency=343 m/s6 kHz=5.71 mm. Jeśli więc chcesz jednoznacznie zidentyfikować fazy fal sinusoidalnych do 6 kHz, które są typowymi częstotliwościami dla mówienia przez człowieka, powinieneś umieścić mikrofony w odległości co najwyżej 5,71 mm od siebie. Oto jeden element, który ma średnicę mniejszą niż 5,71 mm. Nie zapomnij dodać filtra dolnoprzepustowego o częstotliwości odcięcia około 6-10 kHz.

Edytować

Czułem, że to pytanie nr 2 wygląda fajnie, więc postanowiłem spróbować rozwiązać je samodzielnie.

  1. Czy można jakoś obliczyć korelację fazową między 3 źródłami? (tj. w celu przyspieszenia obliczeń)

Jeśli znasz algebrę liniową, możesz sobie wyobrazić, że umieściłeś mikrofony w trójkącie, w którym każdy mikrofon znajduje się 4 mm od siebie, co daje kąty wewnętrzne .60°

Załóżmy więc, że są w tej konfiguracji:

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

Będę...

  • użyj nomenklatury która jest wektorem wskazującym od doAB¯AB
  • nazwać moim pochodzeniemA
  • napisz wszystkie liczby w mm
  • używaj matematyki 3D, ale skończyć z kierunkiem 2D
  • ustaw pozycję mikrofonów w pionie na ich rzeczywistą formę fali. Więc równania te są oparte na dźwięk fal, który wygląda mniej więcej tak to .
  • Oblicz iloczyn krzyżowy tych mikrofonów na podstawie ich położenia i kształtu fali, a następnie zignoruj ​​informacje o wysokości z tego iloczynu krzyżowego i użyj arctan, aby ustalić rzeczywisty kierunek źródła.
  • zadzwonić wyjścia mikrofonu w pozycji , połączenie wyjściu mikrofonu w położeniu , połączenie wyjściu mikrofonu w pozycjiaAbBcC

Tak więc następujące rzeczy są prawdziwe:

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

To daje nam:

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

A produktem krzyżowym jest po prostuAB¯×AC¯

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

Informacja o Z, to tylko śmieci, które nas nie interesują. Gdy zmieniają się sygnały wejściowe, wektor krzyżowy będzie się wahał do przodu i do tyłu w kierunku źródła. Połowa czasu będzie więc wskazywała prosto na źródło (ignorując odbicia i inne pasożyty). A przez drugą połowę czasu będzie wskazywać 180 stopni od źródła.83

Mówię o który można uprościć do , a następnie obróć radiany w stopniach.arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Tak więc otrzymujesz następujące równanie:

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


Ale w połowie przypadków informacja jest dosłownie w 100% błędna, więc jak ... należy to zrobić w 100%?

Cóż, jeśli prowadzi , to źródło nie może być bliżej B.ab

Innymi słowy, po prostu zrób coś takiego:

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

Być może chcesz zareagować tylko wtedy, gdy źródło dźwięku wychodzi z określonego kąta pionowego, jeśli ludzie rozmawiają nad mikrofonem => zmiana fazy 0 => nic nie rób. Ludzie rozmawiają obok niego poziomo => zmiana fazy => reakcja.

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

Możesz więc ustawić ten próg na coś niskiego, na przykład 0,1 lub 0,01. Nie jestem do końca pewien, zależy od głośności i częstotliwości oraz pasożytów, sprawdź to sam.

Innym powodem, dla którego należy zastosować równanie wartości bezwzględnej, jest przejście przez zero, może wystąpić moment, w którym kierunek wskaże niewłaściwy kierunek. Choć będzie to tylko 1% czasu, jeśli nawet to. Możesz więc dołączyć filtr LP pierwszego rzędu do kierunku.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

A jeśli chcesz zareagować na określoną głośność, po prostu zsumuj 3 mikrofony razem i porównaj to z pewną wartością wyzwalania. Średnia wartość mikrofonów byłaby ich sumą podzieloną przez 3, ale nie musisz dzielić przez 3, jeśli zwiększysz wartość wyzwalania o współczynnik 3.


Mam problemy z oznaczeniem kodu jako C / C # / C ++ lub JS lub innego, więc niestety kod będzie czarno-biały, wbrew moim życzeniom. No cóż, powodzenia w twoim przedsięwzięciu. Brzmi zabawnie.

Istnieje również szansa 50/50, że kierunek będzie oddalony o 180% od źródła w 99% przypadków. Jestem mistrzem w popełnianiu takich błędów. Korekcją tego byłoby po prostu odwrócenie instrukcji if, kiedy należy dodać 180 stopni.


Zastanawiam się, czy faza jest naprawdę konieczna, czy też każdy mikrofon może po prostu znaleźć jakąś możliwą do zidentyfikowania funkcję. Jeśli wszystkie mikrofony usłyszą „hej robota”, to czy nie mogą wyrównać początku dźwięku „bah” i zignorować fazę? Więc nie powinieneś umieszczać mikrofonów tak blisko siebie ...
Gość

1
@HarrySvensson, rozumiem, co masz na myśli. Myślałem, że możesz użyć czegoś takiego jak twoje podejście, z wyjątkiem tego, że , i byłyby liczbą milisekund od pierwszego dźwięku, jaki usłyszał mikrofon. Bawiłem się nim tutaj , ale nie jest idealnie ustawiony, gdy źródło, mikrofon i środek robota nie są w jednej linii. Myślę, że może być „w porządku”, sprawdź to. Błąd nie jest taki zły, gdy źródło jest dalekie od mikrofonów. Jestem pewien, że można to poprawić, ale matematyka mi ucieka. abc
Gość

1
Nie jestem pewien, czy kiedykolwiek widziałem podświetlanie kodu działające tutaj na SE.DSP. Pozwól, że sprawdzę w Salonie Nauczyciela i zobaczę, co mówią. Wygląda na to, że ktoś zapytał Metę jakiś czas temu, ale nie podjęto żadnych działań: dsp.meta.stackexchange.com/questions/133/...
Peter K.

1
Proszę przejść do recenzji tego postu na Meta.DSP. Dodałem tag <kbd> prośba o funkcję </kbd>, która powinna przynajmniej zobaczyć jakieś zaangażowanie, ale potrzebujemy głosów. Jeśli strona Chemistry.SE ma to włączone, zdecydowanie powinniśmy! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
@endolith Masz rację, teraz usunąłem tę część. Dziękuję Ci.
Harry Svensson

4
  1. Tak, wydaje się to rozsądne i typowe.
  2. Równie dobrze możesz używać trzech sygnałów mikrofonowych jednocześnie (nie przechodząc przez „objazd” przez korelacje trzech par). Poszukaj „MUSIC” i „ESPRIT” w aplikacjach kierunkowych.
  3. Bardzo prawdopodobne, że tak. Nie dążysz do wysokiej jakości dźwięku, dążysz do dobrych właściwości korelacji corsa, a kilka bitów tu i tam prawdopodobnie nie stworzy ani nie złamie systemu. Z drugiej strony wyższa częstotliwość próbkowania, jak bardzo powszechny 44,1 kHz lub 48 kHz, natychmiast podwoiłaby precyzję kątową, najprawdopodobniej przy tej samej długości obserwacji.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.