Aby rozszerzyć odpowiedź Müllera,
- Czy mikrofony powinny być umieszczone w osobnych rurkach, aby poprawić separację?
- 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.
- 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,42−22−−−−−−√=23–√,c)
To daje nam:
- AB¯¯¯¯¯¯¯¯=(4,0,a−b)
- AC¯¯¯¯¯¯¯¯=(2,23–√,a−c)
A produktem krzyżowym jest po prostuAB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯
AB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯=⎛⎝⎜40a−b⎞⎠⎟×⎛⎝⎜223–√a−c⎞⎠⎟=⎛⎝⎜0⋅(a−c)−(a−b)⋅23–√(a−b)⋅2−4⋅(a−c)4⋅23–√−0⋅2⎞⎠⎟=⎛⎝⎜23–√(b−a)−2a−2b−4c83–√⎞⎠⎟
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(−2a−2b−4c23√(b−a))arctan(a+b+2c3√(a−b))
Tak więc otrzymujesz następujące równanie:
arctan(a+b+2c3–√(a−b))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|=P2x+P2y−−−−−−−√=3(a−b)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.