Strona 2 z 3

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

: 03 cze 2013 22:51
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".

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

: 04 cze 2013 11:22
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)

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

: 05 cze 2013 18:48
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.

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

: 05 cze 2013 20:59
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.

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

: 06 cze 2013 08:17
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...

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

: 06 cze 2013 16:21
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?

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

: 06 cze 2013 18:01
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).

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

: 10 cze 2013 19:17
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?

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

: 11 cze 2013 09:20
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)

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

: 11 cze 2013 15:49
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.

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

: 11 cze 2013 17:47
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ć.

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

: 13 cze 2013 12:25
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.

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

: 14 cze 2013 18:04
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.

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

: 14 cze 2013 23:07
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.

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

: 17 cze 2013 15:46
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.