Rozpoznawanie obiektów za pomocą dźwięku
Rozpoznawanie obiektów za pomocą dźwięku
@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".
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 367 razy
-
- Odczyt dzwieku wave.vi
- (21.11 KiB) Pobrany 408 razy
-
- Posty: 289
- Rejestracja: 01 maja 2012 14:14
- Wersja środowiska: LabVIEW 2012
- Lokalizacja: Farum
Rozpoznawanie obiektów za pomocą dźwięku
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)
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 (21.32 KiB) Przejrzano 15669 razy
Rozpoznawanie obiektów za pomocą dźwięku
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.
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.
- 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
Dlaczego?W programie ciągle badam dźwięki "a" i "e" więc ograniczyłem wielkość próbek od 150Hz w górę
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.Program bada ściężkę i zapisuje każdą częstotliwość do tablicy, z której następnie wyznacza średnią wszystkich częstotliwości
-
- Posty: 289
- Rejestracja: 01 maja 2012 14:14
- Wersja środowiska: LabVIEW 2012
- Lokalizacja: Farum
Rozpoznawanie obiektów za pomocą dźwięku
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...
Az sie prosi o zrobienie prostej maszyny stanow... Bylo by ci znacznie latwiej dokonywac ewentualnych poprawek itd. Przejrzyj forum albo gotowe przyklady w LV...
Re: Rozpoznawanie obiektów za pomocą dźwięku
jogurt_owocowy pisze:Dlaczego?W programie ciągle badam dźwięki "a" i "e" więc ograniczyłem wielkość próbek od 150Hz w górę
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.Program bada ściężkę i zapisuje każdą częstotliwość do tablicy, z której następnie wyznacza średnią wszystkich częstotliwości
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).
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...Jamal79 pisze:Czyszczenie musisz podpiac pod tablice na ktorej pracujesz, w twoim przypadku na "music2".
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.
- 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
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).
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).
Rozpoznawanie obiektów za pomocą dźwięku
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?
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?
-
- Posty: 289
- Rejestracja: 01 maja 2012 14:14
- Wersja środowiska: LabVIEW 2012
- Lokalizacja: Farum
Rozpoznawanie obiektów za pomocą dźwięku
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)
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)
- 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
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ą.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ć?
Więc teraz musisz ten pik znaleźć automatycznie. Próbowałeś funkcji Peak Detector? Wrzuć parę nagrań Twoich samogłosek, to pokombinujemy.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.
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.Niestety nie można go rozbić za pomoca Unbundle, bo jest to sygnał nie pochodzący z rozszerzenia wave, tylko bezpoślednio z mikrofonu
Rozpoznawanie obiektów za pomocą dźwięku
Zwykły mikrofon "Media-tech", podłączony bezpośrednio do PC'ta stacjonarnego.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)
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 381 razy
-
- samogloski.rar
- (483.96 KiB) Pobrany 385 razy
- 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
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.
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.png (3.28 KiB) Przejrzano 15585 razy
-
- Odczyt dzwieku wave fft.vi
- LabVIEW 2011
- (12.98 KiB) Pobrany 378 razy
Rozpoznawanie obiektów za pomocą dźwięku
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.
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
-
- ROZPOZNAWANIE PŁCI PRZEZ GŁOS.vi
- (27.57 KiB) Pobrany 385 razy
- 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
Z tej mąki chleba nie będzie (o czym się już zapewne przekonałeś próbując uruchamiać program).
Z innej beczki:
Do tego momentu się zgadza.program rejestruje dźwięk z mikrofonu, robi transformatę Fourier'a, wykrywa "pik" tonu podstawowego za pomoca Peak Detector...
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.nastepnie sprawdza zbadana częstotliwość po kolei w każdym Case Structure
Z innej beczki:
- Zamiast używać tego łańcuszka Case'ów przyglądnij się funkcji In Range and Coerce.
- 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.
Rozpoznawanie obiektów za pomocą dźwięku
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
-
- Front panel programu.png (46.51 KiB) Przejrzano 15550 razy
-
- ROZPOZNAWANIE PŁCI PRZEZ GŁOS bez case.vi
- (25.44 KiB) Pobrany 372 razy