Rozpoznawanie obiektów za pomocą dźwięku

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

@jogurt_owocowy Twoje rady są bezcenne. Zastosowałem się do wskazówek i wyszło wychodzi. Nie ukrywam, że Twój "mozart" mi bardzo pomógł i na jego podstawie zrobiłem coś takiego jak w załączniku. Program bada ściężkę i zapisuje każdą częstotliwość do tablicy, z której następnie wyznacza średnią wszystkich częstotliwości.

Info: W programie ciągle badam dźwięki "a" i "e" więc ograniczyłem wielkość próbek od 150Hz w górę. Żeby program wiedział kiedy ma skończyć badanie ścieżki, pobrałem długość trwania ścieżki i podzieliłem przez rozmiar ramki. Wynik dzielenia to rozmiar tablicy.

Pierwszy problem: Problemem w tej chwili jest czyszczenie tablicy. Po zmianie dźwięku na inny, program bierze pod uwage poprzednie dane. Poczytałem i dowiedziałem się, że muszę wyczyścić rejestr przesuwny, ale jak to zrobić, tego nie wiem niestety. Wstawiałem stałą liczbę na wejście, ale nic nie daje. Jakieś sugestie?

Drugi problem: Program nie pokazuje mi średniej częstotliwości z pomiarów. Gdy ręcznie ustawię ilość ramek do uśrednienia, to przy mniejszej liczbie ramek (kilka ramek mniej) wynik jest pokazywany. Czym to może być spowodowane?

W załącznikach dźwięki, program i screen "Block Diagram".
Załączniki
dzwieki.rar
(516.61 KiB) Pobrany 339 razy
Odczyt dzwieku wave.vi
(21.11 KiB) Pobrany 359 razy
Odczyt wav.png
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Jamal79 »

1. Czyszczenie tablic, zalaczam "snippeta". Adekwatny do uzytej architektury
2. Nie pokazuje ci poniewaz indycator umiesciles w "case structure" i jak przejdzie do stanu false niema zadnej indykacji z tym zwiazanej. (Jest kilka rozwiazan dla tego problemu) Wyrzuc go poza casa, wzamian umieszczajac np zmienna lokalna... (Jest kilka rozwiazan dla tego problemu)
Załączniki
czyszczenie tablic.png
czyszczenie tablic.png (21.32 KiB) Przejrzano 14933 razy
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

Wygląda na to, że nie potrafię tego zastosować do mojego programu. W załączniku zrzut ekranu Block Edit. Czy źle to połączyłem?

Druga sprawa. Wiem już czemu nie pokazuje mi średniej częstotliwości. Po ograniczeniu ramek od min. 150Hz liczba ramek się nie zgadza z rozmiarem tablicy z zapisanymi wartościami. Potrzeba np 23 ramki do uśrednienia ale kilka zostało wyrzuconych i dlatego program nie dochodzi do opcji Mean. Jakiś pomysł, żeby zmniejszyć rozmiar tablicy o ilość usuniętych ramek? W załączniku jest Case, który miał usuwać ramki i zmniejszac rozmiar tablicy ale głowiłem się pół dnia i nie mogłem dojść jak poprawnie go zrobić. Założę się, że to jest dość proste tylko ciągle mi to umyka.
Załączniki
czyszczenie i ramki 2.png
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rozpoznawanie obiektów za pomocą dźwięku

Post autor: jogurt_owocowy »

W programie ciągle badam dźwięki "a" i "e" więc ograniczyłem wielkość próbek od 150Hz w górę
Dlaczego?
Program bada ściężkę i zapisuje każdą częstotliwość do tablicy, z której następnie wyznacza średnią wszystkich częstotliwości
Sprawdź czy masz na palecie funkcję o nazwie Mean PtByPt. Wywołujesz ją w pętli podając na jej wejście wartość pojedynczego pomiaru, a na wyjściu dostajesz średnią kroczącą z określonej liczby ostatnich pomiarów.
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Jamal79 »

Czyszczenie musisz podpiac pod tablice na ktorej pracujesz, w twoim przypadku na "music2".

Az sie prosi o zrobienie prostej maszyny stanow... Bylo by ci znacznie latwiej dokonywac ewentualnych poprawek itd. Przejrzyj forum albo gotowe przyklady w LV...
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Re: Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

jogurt_owocowy pisze:
W programie ciągle badam dźwięki "a" i "e" więc ograniczyłem wielkość próbek od 150Hz w górę
Dlaczego?
Program bada ściężkę i zapisuje każdą częstotliwość do tablicy, z której następnie wyznacza średnią wszystkich częstotliwości
Sprawdź czy masz na palecie funkcję o nazwie Mean PtByPt. Wywołujesz ją w pętli podając na jej wejście wartość pojedynczego pomiaru, a na wyjściu dostajesz średnią kroczącą z określonej liczby ostatnich pomiarów.

1. Ponieważ funkcja Mean bierze pod uwage wszystkie elementy tabeli, a że w 4-sekundowej ścieżce trafia się 25% ramek, które są niepożądane (wartość ich to poniżej 150Hz), wynik odbiega od wartości rzeczywistej w sposób znaczny.

2. Nie posiadam Mean PtByPt. Używam LV 2010 a ta opcja jest dostępna od następnej wersji (2011).

Jamal79 pisze:Czyszczenie musisz podpiac pod tablice na ktorej pracujesz, w twoim przypadku na "music2".
Właściwie to nawet nie jest potrzebna bo stała na wejściu Shift Reg. zeruje mi tablicę. Gapa ze mnie, bo pod żarówą wszystko widać i wynik jest poprawny. Tylko wykres mi pokazuje poprzednie wartości, dlatego sam się wprowadziłem w błąd i jeszcze was przy okazji...

I takie małe sprostowanie. Nagrałem nie dźwięk "a" tylko "h".

Pytanie kolejne. Czy da się wyrzucić z tablicy elementy w zależności od wartości? W programie znów biorę od uwagę wszystkie próbki, ale chciałbym ograniczyć je z dołu i góry powiedzmy, żeby wszystko się mieściło w granicach <150Hz ; 2 500Hz>. Próbowałem wcześniej niedopuszczać próbek z poza zakresu do zapisania w tablicy, lecz jest troche roboty z tym. Łatwiej by było wyrzucić zbędne z już utworzonej tablicy. Zastanawiałem się nad użyciem funkcji Delete From Array, ale tam tylko określam, który element chcę usunąć, a nie o jakiej wartości chce go usunąć. Jakieś pomysły?
Ostatnio zmieniony 06 cze 2013 17:24 przez Darrell, łącznie zmieniany 1 raz.
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rozpoznawanie obiektów za pomocą dźwięku

Post autor: jogurt_owocowy »

Nie zauważyłem, że ciągle się bawisz gitarą.
Jeśli jednak nic się nie zmieniło i docelowo chcesz rozpoznawać płeć mówcy, to już teraz przesiądź się na mowę - oszczędzisz sobie niemiłych niespodzianek. Wynikną one z tego, że najprawdopodobniej nie uda Ci się zmierzyć częstotliwości tonu krtaniowego za pomocą (używanej w "mozarcie") funkcji Extract Single Tone Information. Ta mierzy częstotliwość najmocniejszej składowej widma, czyli nie tej, która Cię interesuje (patrz obrazek na poprzedniej stronie).
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

Wziąłem się teraz za rozpoznawanie samogłosek "e", "o", "a". Sygnał przepuszczam przez FFT Power Spectrum And PSD. Na wykresie widać "pik" pomiędzy 100Hz a 150Hz. Wydaje mi się, że o tą częstotliwośc chodziło? Czytałem, że autokorelacja poprawia właściwości sygnału, tzn. potrafi usunąć część zbędnych szumów i zostawić sygnał dominujący. Jak to się przekłada na LabVIEW? Czy w tym przypadku można używać takiej funkcji? I czy w ogóle potrzeba jej używać?

Druga sprawa. Przeniosłem się do badania dzwięku z mikrofonu. Po FFT wyraźnie widać "pik" przy dowolnym słowie i w dodatku jest on na swoim miejscu. Problemem jes tu tylko dalsze badanie tego sygnału. Niestety nie można go rozbić za pomoca Unbundle, bo jest to sygnał nie pochodzący z rozszerzenia wave, tylko bezpoślednio z mikrofonu (właściwie to nie wiem jak nazwać ten sygnał, skonwertowany sygnał analogowy na cyfrowy?). Pomyślałem więc, że możnaby go przekonwertować w programie i potem dopiero badać? Co o tym myslicie?
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Jamal79 »

A jaki masz sprzet?? Mikrofon, wzmacniacz?? Czy poprostu podpieles zwykly mikrofon ze sluchawkami pod PC'ta??

Jak masz taka mozliwosc podkrec czulosc na nizszych poziomach. MUsisz jeszcze wiedziec, ze zaklucenia pochdzace z otoczenia to w wiekszosci 63-250Hz. (Wentylacja, drgania scian, rozmowa prowadzona w drugim pokoju itd.) Ludzki umysl odcina sie od tych zakresow, ale mikrofon to wylapuje. (powinien)
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rozpoznawanie obiektów za pomocą dźwięku

Post autor: jogurt_owocowy »

Wziąłem się teraz za rozpoznawanie samogłosek "e", "o", "a". Sygnał przepuszczam przez FFT Power Spectrum And PSD (...) Czytałem, że autokorelacja poprawia właściwości sygnału (...) czy w ogóle potrzeba jej używać?
Dobrze kombinujesz. Wiele algorytmów estymujących częstotliwość tonu krtaniowego jest opartych właśnie na autokorelacji, ale myślę, że lepiej będzie, jak pójdziesz możliwie prostą ścieżką.
Przeniosłem się do badania dzwięku z mikrofonu. Po FFT wyraźnie widać "pik" przy dowolnym słowie i w dodatku jest on na swoim miejscu. Problemem jes tu tylko dalsze badanie tego sygnału.
Więc teraz musisz ten pik znaleźć automatycznie. Próbowałeś funkcji Peak Detector? Wrzuć parę nagrań Twoich samogłosek, to pokombinujemy.
Niestety nie można go rozbić za pomoca Unbundle, bo jest to sygnał nie pochodzący z rozszerzenia wave, tylko bezpoślednio z mikrofonu
Zarówno funkcja Sound File Read Simple czytająca sygnał z pliku, jak i Sound Input Read (z mikrofonu) na wyjściu zwraca sygnały w postaci typu waveform. Żeby się dobrać do jego poszczególnych komponentów wykorzystaj funkcję Get Waveform Components.
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

Jamal79 pisze:A jaki masz sprzet?? Mikrofon, wzmacniacz?? Czy poprostu podpieles zwykly mikrofon ze sluchawkami pod PC'ta??

Jak masz taka mozliwosc podkrec czulosc na nizszych poziomach. MUsisz jeszcze wiedziec, ze zaklucenia pochdzace z otoczenia to w wiekszosci 63-250Hz. (Wentylacja, drgania scian, rozmowa prowadzona w drugim pokoju itd.) Ludzki umysl odcina sie od tych zakresow, ale mikrofon to wylapuje. (powinien)
Zwykły mikrofon "Media-tech", podłączony bezpośrednio do PC'ta stacjonarnego.
Obrazek

Kartę dźwiękowa mam zintegrowaną na płycie. Zakłócenia - tak wiem, że mikrofon łapie wszystko z otoczenia ale nie mam możliwości podkręcić czułości mica.

W załączniku paczka moich samogłosek i prosty vi który pokazuje 'pik' przy odczytaniu dźwięku. Można zaobserwować jakieś drobne "piki" wcześniej, lecz planuję je zignorować.
Załączniki
Odczyt dzwieku wave fft.vi
(91.71 KiB) Pobrany 330 razy
samogloski.rar
(483.96 KiB) Pobrany 334 razy
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rozpoznawanie obiektów za pomocą dźwięku

Post autor: jogurt_owocowy »

Prosta detekcja częstotliwości pierwszego prążka w załączniku.
Do szukania prążków widma jest użyta funkcja Peak Detector, która szuka maksimów o amplitudzie równej co najmniej 10% amplitudy najmocniejszego prążka. Następnie indeksy maksimów są przeliczane na częstotliwość, a na końcu z tablicy wybierane jest pierwsze z nich.

Pozdrawiam.
Załączniki
detecting fundamental speech frequency in fft spectrum
detecting fundamental speech frequency in fft spectrum
detecting fundamental speech frequency in fft spectrum.png (3.28 KiB) Przejrzano 14849 razy
Odczyt dzwieku wave fft.vi
LabVIEW 2011
(12.98 KiB) Pobrany 341 razy
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

Zrobiłem troszkę inaczej. Powiedz mi tylko czy tak jak ja zrobiłem jest źle?

Opowiem co po kolei... program rejestruje dźwięk z mikrofonu, robi transformatę Fourier'a, wykrywa "pik" tonu podstawowego za pomoca Peak Detector, nastepnie sprawdza zbadana częstotliwość po kolei w każdym Case Structure i zapala lampki o cechach głosu zarejestrowanego przez mikrofon.

Edit. Chyba widzę błąd: program nie wykryje błędu gdy będzie ponad 300 Hz. Troche źle to zrobiłem, ale poprawię.

Edit 2. Zamieniłem na samym końcu "Or" na "And" i "Greater?" na "Less?" i chyba powinno być dobrze.
Załączniki
PROGRAM GOTOWY.png
ROZPOZNAWANIE PŁCI PRZEZ GŁOS.vi
(27.57 KiB) Pobrany 349 razy
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rozpoznawanie obiektów za pomocą dźwięku

Post autor: jogurt_owocowy »

Z tej mąki chleba nie będzie (o czym się już zapewne przekonałeś próbując uruchamiać program).
program rejestruje dźwięk z mikrofonu, robi transformatę Fourier'a, wykrywa "pik" tonu podstawowego za pomoca Peak Detector...
Do tego momentu się zgadza.
nastepnie sprawdza zbadana częstotliwość po kolei w każdym Case Structure
Nic nie sprawdzi, dopóki nie zatrzymasz pętli akwizycji przyciskiem Stop mic. Dopiero po jego naciśnięciu ostatnia wartość zwrócona przez Peak Detector wyjdzie z pętli i pójdzie do Case'ów. Ta wartość nie częstotliwością piku, tylko jego indeksem do tablicy wejściowej. Jak przeliczyć indeks na częstotliwość - patrz przykład powyżej.

Z innej beczki:
  1. Zamiast używać tego łańcuszka Case'ów przyglądnij się funkcji In Range and Coerce.
  2. Sound Input Stop możesz wyrzucić poza pętlę (zaraz przed Sound Input Clear) - zrobisz sobie w pętli miejsce na analizę sygnału i logikę diodek.
Darrell
Posty: 19
Rejestracja: 25 maja 2013 13:56
Wersja środowiska: LabVIEW 2010

Rozpoznawanie obiektów za pomocą dźwięku

Post autor: Darrell »

Zrobiłem podobnie jak w przykładzie. Usunąłem tylko mnożenie magnitude z df, bo program pokazywał mi strasznie małe wartości - 0,8xxx 0,7xxx. Co dziwniejsze program wychwytuje mój ton krtaniowy, sprawdziłem dwie inne osoby i program poprawnie odczytuje wartości częstotliwości.
Załączniki
Block Diagram porgramu.png
Front panel programu.png
Front panel programu.png (46.51 KiB) Przejrzano 14814 razy
ROZPOZNAWANIE PŁCI PRZEZ GŁOS bez case.vi
(25.44 KiB) Pobrany 325 razy
ODPOWIEDZ