Skocz do zawartości

Jak zrobić czujnik kierunku dźwięku?


marek1707

Pomocna odpowiedź

Tak, temat jest pytaniem. A ja.. hm.. na razie nie wiem, ale mam parę pomysłów 🙂

Najpierw jednak kilka standardowych pytań: Czy ktoś z Was robił coś takiego? Czy udało się taki czujnik zbudować? Na jakiej zasadzie pracuje? itd.. Wszelkie rozwiązania i/lub komentarze mile widziane.

W sieci jest zaprezentowanych kilka prostych rozwiązań, lecz żadne jakoś mnie nie przekonuje.

Pierwsze, to robimy mikrofon kierunkowy (np. przez umieszczenie zwykłej wkładki pojemnościowej w rurce) i obracamy go na serwie. Trochę obciachowe - moim zdaniem, no i dźwięk musi być w miarę jednostajny i na tyle długi by skaner zdążył go "zobaczyć". Acha, i na tyle głośny by przekrzyczeć warczący pod samym mikrofonem napęd:

http://www.engineersgarage.com/contribution/expert/sound-localization-and-triangulation

Drugi pomysł to "sztuczna głowa" czyli dwa mikrofony z plastikowymi uszami i prymitywna metoda porównywania amplitudy dochodzących sygnałów. Na szczęście nasz mózg robi to inaczej, bo w życiu byśmy się nie domyślili gdzie jest rozmówca:

http://hacknmod.com/hack/diy-sound-localization-sensor-with-arduino/

Żałosne...

No właśnie, trzecia metoda to analiza fazy dochodzących sygnałów. To wydaje się rokować, choć jest wymagające obliczeniowo. Wszyscy piszą, że tak działają profesjonalne rozwiązania, ale nikt(?) nie zaprezentował działającej konstrukcji. Pieniądze?

To może czwarta metoda, czyli porównywanie czasu przylotu "pierwszego uderzenia" dźwięku do każdego z mikrofonów? Czy ma jakieś oczywiste wady? Ograniczeniem jest sam charakter oczekiwanego dźwięku - musi być "wybuchowy" np. klaskanie czy stukanie. Mowa raczej odpada, choć może nie jest to kompletna dyskwalifikacja.

Wiem, że temat nie jest łatwy - inaczej byłyby oczywiste i rzeczywiście działające rozwiązania do Arduino lub samodzielnie pracujące czujniki dostępne w sklepach elektronicznych. Czy naprawdę nikt nie potrzebuje robota odwracającego się w stronę mówiącej osoby lub jadącego w stronę klaskania? Marzy mi się detektor, który zamontowany na robocie wskaże kierunek nadchodzącego dźwięku. Oczywiście kierunek w przestrzeni 3D a więc dwa kąty: azymut (lewo-prawo tj -180..+180°) i elewację (wyżej-niżej czyli 0..+90°) z jakąś sensowna rozdzielczością a nie tylko "gdzieś z lewej" lub "gdzieś z prawej". Najlepiej, żeby nie miał części ruchomych no i żeby dało się go zrobić z normalnie dostępnych, budżetowych elementów. Może się nie da, ale może jednak warto spróbować? W wolnych chwilach będę tu opisywał moje zmagania z tematem.

Link do komentarza
Share on other sites

tak na szybko to przychodzi mi do głowy konstrukcja kamery akustycznej.

http://en.wikipedia.org/wiki/Acoustic_camera

te rozwiązania obłożone są patentami jednak jeśli to projekt czysto hobbystyczny to patenty są często bardzo dobrym źródłem inspiracji, bo większość rozwiązań jest stosunkowo dobrze opisana i można je przełożyć na DIY

a z Twoich pomysłów to najciekawsza jest chyba "sztuczna głowa". Ja preferuję empiryczne podejście do problemu, dlatego proponuję zmontować układ, kilka rodzajów uszu (druk 3D?) i obserwacja sygnałów przy zmieniającym się położeniu źródła sygnału, może jakieś zależności rzucą się od razu w oczy

Link do komentarza
Share on other sites

Kamera akustyczna jest fajna, lecz to trochę inna półka. Obraz dźwiękowy nakładany na video w czasie rzeczywistym jest imponujący, przyznaję i.. może do tego też kiedyś dojdę 🙂 ale na razie moim celem jest zrobienie prostego czujnika dookólnego. Na pewno nie będzie to sprzęt robiący pełną mapę pola dźwiękowego. Na pewno (przynajmniej na razie) nie będzie wykorzystywał procesorów DSP lub FPGA, bo powtarzanie takich projektów jest poza zasięgiem początkujących amatorów. Z tego m.in powodu nie będzie wykonywał jakiejś zaawansowanej dyskryminacji sygnałów, czyli separacji tych zakłócających od tych właściwych. Dlatego z pewnością słabo będzie sobie radził w środowisku o dużych zakłóceniach czyli tam, gdzie jest po prostu głośno i nasze "wołanie" - jakiekolwiek ono będzie - niewiele wystaje ponad hałasy otoczenia. To tak na początek - trzeba znać ograniczenia, żeby nie popadać w megalomanię.

Sztuczna głowa sprowadza się do pomysłu zrobienia kilku mikrofonów kierunkowych. Nie ważne czy będą to profesjonalnie kosztujące sprzęty studyjne, plastikowe uszy kupione na festiwalu mangi czy tekturowe rurki założone na mikrofon za 2zł. W najprostszym przypadku sygnały z kilku (min. 2) skierowanych w różne strony mikrofonów są wzmacniane a potem prostowane by wyznaczyć amplitudy. Procesor porównuje amplitudy i na tej podstawie wyznacza najbardziej prawdopodobny kierunek do źródła. Na pozór wydaje się proste, choć chcąc zachować dobrą rozdzielczość kątową w całej przestrzeni 360° konstrukcja bardzo się komplikuje. I to nie tylko mechanicznie - bo rośnie liczba mikrofonów, ale też projektowo. Jeżeli kierunkowość każdego z mikrofonów będzie zbyt dobra, będzie on słyszał wyłącznie dźwięk ze swojego sektora. To niedobrze, bo wtedy tracimy informację od jego tak samo kierunkowych sąsiadów i już tylko pozostaje stwierdzić, że źródło jest gdzieś w danym sektorze. Jeżeli kąty słyszenia zrobimy zbyt szerokie, różnice między amplitudami sygnałów od sąsiednich mikrofonów będą zbyt małe by dokładnie ocenić kierunek - też niedobrze. A zrobienie powtarzalnego toru kierunkowego także wymaga mnóstwa doświadczeń lub symulacji numerycznych, odpowiednich materiałów tłumiących i/lub odbijających itd.. Urządzenie wymagałoby kalibracji, bo przecież każdy tani mikrofon jest inny a czułości i wzmocnienia torów byłyby tu najważniejsze. Jakoś to do mnie nie przemawia - sztucznej głowy raczej nie zbuduję.

Za to dużo bardziej przemawia do mnie metoda TDOA (time-difference-of-arrival) i na niej spróbuję skupić się następnym razem.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

No właśnie, jak też na początku myślałem jak autorzy tego projektu. Naprawdę duży szacun za to ile pracy włożyli w opracowanie i doprowadzenie do jakiegoś działającego końca. Aż się uśmiechnąłem gdy dotarłem do schematu, bo jest to praktycznie kopia tego co mam na płytce. No nie da się tej idei zrealizować jakoś bardzo odmiennie i nikt tu Ameryki nie odkryje. U mnie był jeden stopień wzmacniacza a nie dwa (miałem szybszy układ więc GBP było większe i mogłem poszaleć ze wzmocnieniem na jednym stopniu), detektor szczytowy na diodzie, rozładowanie kondensatora opornikiem i filtr górnoprzepustowy sterujący komparatorem z histerezą. Cóż wpadłem jeszcze na pomysł automatycznej/programowej zmiany poziomu odcięcia tak, by układ dopasowywał się do poziomu hałasu w pomieszczeniu. I co? W sumie to mam mieszane uczucia. To nie działa zbyt dobrze. Owszem, można znaleźć warunki gdy jest OK, ale bardzo dużo zależy od kilku czynników:

a. Stałe czasowe filtrów. Tak jak piszą autorzy bardzo dużo czasu trzeba poświęcić strojeniu układu tj. wyrównaniu wzmocnień i/lub doborowi mikrofonów, eksperymentalnemu ustawieniu optymalnych czasów narastania/opadania układów RC. Po pierwsze same pasma wzmacniaczy - bo wcale nie jest oczywiste czy lepsze jest szersze czy węższe, czy lepiej przenosić niższe częstotliwości (jak zrobili) czy też wyższe (jak było u mnie: 1-4kHz). Po tym idzie prymitywny detektor ze swoim ograniczonym czasem narastania no i wreszcie komparator który jest sercem urządzenia. To tam następuje wykrycie (bądź nie) poziomu uznawanego za krytyczny i zgłoszenie sygnału do procesora. A gdy już wszystko wydaje się działać, to..

b. Sygnały akustyczne są bardzo "przypadkowe". Chłopaki zrezygnowali z rozpoznawania kierunku mówiącej osoby bo zauważyli, że mowa nie zawiera wystarczająco ostrych zboczy amplitudy. Nawet sam początek słowa jest rozmyty a potem to już raczej jest równo a przynajmniej nie na tyle ostro, by wyróżnić i pewnie wykryć czas dotarcia. Z moich doświadczeń wynika, że nawet dźwięki które z definicji są krótkie i raczej "wybuchowe", są bardzo różne. Mam nagranych kilkadziesiąt różnych klaśnięć i chociaż bardzo się starałem, każde jest inne. Oczywiście, można wśród nich znaleźć podobnie, szybko narastające i z takimi prosty układ detektora sobie radzi, ale 70% to wolno lub schodkowo narastające piramidki, których czas wykrycia będzie bardzo zależał od amplitudy. Na nieszczęście my tego w ogóle nie słyszymy i wydaje się, że każdy "klask" jest taki sam. Powodem tego jest prawie kompletna nieczułość naszego ucha na fazę sygnałów. Stromy sygnał zawiera dużo składowych częstotliwościowych i gdybyśmy rozłożyli klaśnięcie na jego widmo, to rzeczywiście będzie to bardzo powtarzalne. Niestety przy składaniu tego w różnych fazach ostateczny kształt w dziedzinie czasu może być diametralnie różny - dotyczy w szczególności najbardziej interesującego fragmentu czyli czoła impulsu.

Chyba nie ma sensu opisywać dokładniej moich eksperymentów z układem wzmacniacza/detektora/komparatora. O ile oscylogram w skali czasowej 50ms/dz (jak pokazali na zdjęciu) jest fajny i stromy, to rozciągnięcie go do potrzebnej skali (np. 100us/dz) pokazuje, że sygnały są prawie płaskie i naprawdę trzeba dużo szczęścia i precyzji by coś dało się powtarzalnie wykryć. Na filmie ołówek raz pokazuje kierunek a raz nie. W sumie nie widzimy dokładnie z której strony klaszczą a próby operatora kamery były zupełnie nieudane. A czasy trzeba wyznaczać naprawdę krótkie. Mój zestaw pomiarowy jest złożony z 4 mikrofonów umieszczonych na ramce w kształcie czworościanu foremnego o boku 10cm - planuję pełne 3D 🙂 Nie chciałem, żeby czujnik był zbyt wielki, ale taka długość bazy pomiarowej oznacza czas przelotu dźwięku rzędu 300us no i konieczność pomiaru z rozdzielczością lepszą niż 10us. Dla procesora z timerami nie jest to problem i gdyby sygnały były od razu cyfrowe, układ byłby skończony. Niestety tak nie jest, a długi i strojony potencjometrami tor analogowy nie napawa optymizmem. Od wczoraj przestawiłem się więc na alternatywną metodę pomiaru przesunięcia czasu. Wymaga dużo liczenia, ale o tym następnym razem 🙂

Link do komentarza
Share on other sites

Jak dla mnie tylko z przesunięciem czasu możesz do czegoś dojść.

Wyciągnąłeś może te dane do komputera? Możesz podrzucić kilka .wavów czy coś? Sam algorytm do obliczania jest banalnie prosty i dla krótkich próbek (typu 1000 sampli) powinien być szybki nawet na małej atmedze.

Link do komentarza
Share on other sites

Ależ ja wcale nie odrzucam czasowej metody TDOA. Wręcz przeciwnie: napisałem przecież, że pracuję nad alternatywnym sposobem pomiaru opóźnień. I znów - nie jest to jakaś praca naukowa tylko normalne tworzenie nowego projektu, schematu, płytki czy kodu programu.

Rzeczywiście, metoda korelacyjna którą obecnie się posługuję jest pojęciowo prosta.

Wziąłem małą ATmegę 644 pracującą na 20MHz i podłączyłem do niej 4 mikrofony. Mój statyw ma je tak rozmieszczone, że tworzą czworościan foremny o boku 10cm. Wygląda to jak trójkąt równoboczny w podstawie i słupek o wysokości ok. 8cm. W każdym z 4 wierzchołków siedzi tani mikrofon, potem jest prosty wzmacniacz o wzmocnieniu ok. 150 i taki sygnał trafia do ADC. Bryła ma 6 krawędzi tworzących 6 baz pomiarowych. Czas przelotu dźwięku na drodze 10cm to ok. 300us i z takimi czasami muszę się liczyć. ADC procesora pracuje obecnie z podzielnikiem 32 i puszczony jest na pełną prędkość. Bawię się dla uproszczenia tylko dwoma kanałami, tak więc każdy z 2 mikrofonów jest próbkowany z częstotliwością 20MHz/32/13/2=24kHz. Próbki z każdego kanału są zapamiętywane w buforach kołowych o długości 256, ale jeden kanał jest wyróżniony. Na nim liczę na bieżąco ogólną głośność (RMS) pomieszczenia (nareszcie żadnych komparatorów itp wynalazków) a przekroczenie pewnego progu (na razie stałego) energii powoduje wyzwolenie pomiaru. Polega on na złapaniu jeszcze kilkudziesięciu próbek (bo przecież sygnały do innych kanałów mogły dojść z opóźnieniem), zatrzymaniu procesu przetwarzania ADC i wykonaniu paru obliczeń 🙂

W praktyce sprowadza się to do odszukania miejsca wystąpienia wzorca (złapanego własnie do bufora kanału wzorcowego) we wszystkich innych buforach czyli - do policzenia przebiegu funkcji korelacji. Potem odszukuję jej maksimum i to jest miejsce gdzie wzorzec najlepiej pasuje do przebiegów z innych kanałów. Ponieważ znam miejsce "dopasowania" to wiem jakie opóźnienie - dodatnie lub ujemne - mają kanały względem siebie. Metoda jest praktycznie niezawodna. Mogę chrząkać, ziewać, klaskać lub po prostu mówić. Jedyną trudnością są czyste i ciągłe przebiegi okresowe typu gwizdanie - no, ale na to nie ma rady. Korelacja ma wtedy swoje wysokie maksima co okres takiej fali. ATmega wyznacza czas opóźnienia całkiem szybko tylko, że.. metoda korelacyjna ma u swoich podstaw jeszcze jedno poważne ograniczenie: jest nim dokładność wyznaczonego przesunięcia ograniczona do jednej próbki. Bo przecież wzorzec może najlepiej pasować do sygnału z innego kanału tylko w danym miejscu albo w następnym - co próbkę. W moim przypadku kwantem czasu jest 1/24kHz=41.6us. To nie jest rewelacyjna rozdzielczość biorąc pod uwagę, że cały czas jaki chcemy zmierzyć to -300..+300us. Mam teraz kilka wyjść:

1. Podkręcić ADC - specyfikacja firmowa podaje max 1MHz czyli mogę zrobić co najwyżej 2 razy szybciej niż teraz, a przecież i tak próbkuję tylko 2 kanały. Przy docelowo czterech nie będzie już wcale lepiej nawet po podkręceniu ADC na maksa.

2. Wydłużyć bazy pomiarowe czyli zwiększyć mój czworościan - tego nie chcę robić ze względów praktycznych, czujnik nie powinien być zbyt duży.

3. Zmienić procesor na taki z szybszym ADC.

4. Przejść na FPGA i w ogóle zapomnieć o kłopotach z szybkością czegokolwiek.

Na razie wybrałem piątą opcję, polegającą na precyzowaniu wyników. Otóż w otoczeniu maksimum funkcji korelacji interpoluję ją wielomianem kwadratowym. Nie jest to może najszczęśliwsze rozwiązanie (powinien być filtr FIR okienkowany funkcją sinc), ale działa od pierwszego odpalenia. Dostaję jedną cyfrę znaczącą wyniku więcej (bo reszty nie liczę - nie są wiarygodne) tj. zamiast trafienia wzorcem w próbkę nr. 57 mam teraz 57.4 co daje mi już rozdzielczość kątową na poziomie ok. 5 stopni przy naprawdę niezłej powtarzalności.

Teraz to wystarczy już tylko włączyć 2 pozostałe kanały, policzyć czasy TDOA dla pozostałych 5 baz pomiarowych, wyznaczyć z istniejących 20 trójek takich 16 które nie leżą na jednej płaszczyźnie (czyli odpadają wszystkie 4 ściany mojej bryły - bo te nie dają jednoznacznego wektora kierunku w przestrzeni 3D) i już można zacząć myśleć o uśrednianiu wyniku końcowego oraz przeliczeniu go z wektora na kąty deklinacji i rektascencji (lub jak kto woli azymutu i podniesienia?).

Taki algorytm napisałem sobie zawczasu na PC i jakoś działa, więc tu obaw już nie mam. Najpierw liczę rzeczywisty czas dotarcia dźwięku z oddalonego źródła do moich mikrofonów, potem obliczam czasy TDOA, zaszumiam je dla lepszego efektu 🙂 a potem robię obliczenia odwrotne: dla 16 trójek baz rozwiązuję 16 układów równań kierunkowych i dostaję 16 wektorów z których większość - jeśli nie wszystkie - pokazują prawie ten sam kierunek w przestrzeni. Na koniec przeliczenie na kąty i mam pierwotne wskazanie mojego źródła.

To na razie tyle 🙂 Dzięki za odzew, jeśli macie jakieś fajne pomysły, piszcie. Ja dorzucę kolejne 3 grosze, gdy dojdę do wypisania przez ATmegę dwóch prawidłowych kątów wynikowych.

Link do komentarza
Share on other sites

Witam, czy jest możliwość podejrzeć kod programu, staram się zrobić coś podobnego, ale na STM32 i jestem ciekawy jak próbkowany jest sygnał ? W sensie, jak udaje się zachować prędkość pomiaru i działanie całego programu. Bardzo chciałbym coś takiego wykonać, ale wiadomo po swojemu 🙂 Dlatego na razie szukam inspiracji jak się do tego zabrać.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.