Przetwarzanie obrazu i dźwięku – zadanie 3
Transkrypt
Przetwarzanie obrazu i dźwięku – zadanie 3
Przetwarzanie obrazu i dźwięku – zadanie 3 Mateusz Grotek 186816 1 Paweł Tarasiuk 186875 Cel Realizacja zadania polega na stworzeniu aplikacji pozwalającej na wczytanie dźwięku z pliku *.wav i wykrycie częstotliwości podstawowej w kolejnych chwilach czasowych. Rozpoznane wysokości dźwięku należy zaprezentować w postaci liczbowej (w Hz) oraz generując pojedynczy ton o tej samej czÄstotliwości. W przypadku nagrań zawierających fragment linii melodycznej złołżony z wielu następujących po sobie dźwięków wynik powinien stanowić listę częstotliwości wraz z listą czasów trwania poszczególnych dźwięków i powinien również zostać zaprezentowany w postaci dźwiękowej (ciągu tonów o odpowiedniej wysokości i czasie trwania). Podczas testowania należy wykorzystać przykładowe dźwięki zamieszczone w zasobach przedmiotu. Do zaliczenia zadania konieczne jest zaimplementowanie jednej metody w dziedzinie czasu oraz jednej metody w dziedzinie częstotliwości, zgodnie z wariantami przydzielonymi przez prowadzącego. Zostały nam przydzielone następujące warianty zadania: (T2) Analiza sygnału w przestrzeni fazowej (F2) Analiza cepstralna 2 Wprowadzenie Postawiony problem polega na przeanalizowaniu różnych sposobów wykrywania częstotliwości podstawowej dźwięku. Częstotliwość podstawowa dźwięku to dość skomplikowane pojęcie. Niektóre definicje uznają za częstotliwość podstawową najniższą częstotliwość występującą w spektrum dźwięku. Inne podają, że jest to odwrotność okresu sygnału, po którym sygnał się powtarza. Powyższe dwie definicje są powiązane, ale tylko w przypadku idealnym. Czasem w sygnale może pojawić się na przykład bardzo słaba niska częstotliwość, której normalnie nie uznalibyśmy za częstotliwość podstawową. Poza tym inna grupa definicji uznaje za częstotliwość podstawową to co ludzie słyszą jako częstotliwość podstawową podczas słuchania dźwięku. W tym ostatnim przypadku występują ciekawe zależności psychologiczne, na przykład częstotliwość podstawowa w sensie psychologicznym może w ogóle nie występować w spektrum dźwięku – wystarczy, że występuje taki układ harmonicznych, jak gdyby ta częstotliwość podstawowa tam była. Wybrane dwa warianty są dość interesujące, gdyż wykorzystują pewne dodatkowe pojęcia poza spektrum. Pierwsza z metod jest metodą w dziedzinie czasu. Metody te posługują się samym sygnałem zapisanym na przykład w pliku dźwiękowym i nie przechodzą 1 do dziedziny częstotliwości. Metoda analizy w przestrzeni fazowej polega po prostu na dopasowaniu pewnego skończonego ciągu punktów do innego skończonego ciągu punktów, przy czym kolejność punktów musi być zachowana, a także muszą być zachowane odległości między nimi. Na przykład możemy wybrać punkty odległe od siebie o < 1,1,3,5 >, co oznacza, że jeśli x0 jest pierwszym punktem, to możemy utworzyć ciąg < x0 , x1 , x4 , x9 >. Ciąg ten następnie porównujemy do innego ciągu zaczynającego się w innym miejscu, na przykład w x1 1. W takim wypadku porównywane są następujące pary punktów: < x0 , x1 1 >, < x1 , x1 2 >, < x4 , x1 5 >, < x9 , x20 >. Jeśli sygnał jest okresowy, to w pewnym momencie znajdziemy taki zestaw identycznych par. Jeśli będziemy przesuwać takie okno od punktu początkowego w kierunku rosnącego czasu, to pierwszy odnaleziony identyczny punkt stanowić będzie okres sygnału. Metoda ta nie jest wolna od błędów. Po pierwsze musimy zawsze uwzględnić pewną niedokładność związaną z próbkowaniem sygnału i innymi czynnikami. Wartości punktów nie muszą być dokładnie identyczne, ale mogą różnić się o pewną małą liczbę. Uwzględniając ten czynnik jesteśmy w stanie poprawić wyniki osiągane przez metodę. Drugim sposobem poprawy jakości wyników jest zwiększenie ilości sprawdzanych punktów. Podsumowując, metoda analizy przestrzeni fazowej bazuje na rozumieniu częstotliwości podstawowej jako okresu sygału. Jeśli chodzi o analizę cepstralną to jest to metoda w dziedzinie częstotliwości bazująca na pojęciu cepstrum. Cepstrum jest to (w jednym z wariantów użytych przez nas) odwrotne przekształcenie Fouriera z modułu przekształcenia Fouriera. Są także inne definicje cepstrum, klasyczna to kwadrat odwrotnego przekształcenia Fouriera z logarytmu kwadratu sygnału, ale można także spotkać się z użyciem prostego zamiast odwrotnego przekształcenia Fouriera w drugim etapie obliczeń (np. w treści zadania). Wszystkim tym przekształceniom przyświeca podobna idea, a mianowicie liczą one okresowość spektrum. Okresowość występuje w spektrum ze względu na istnienie w nim harmonicznych określonych dźwięków. Dlatego metoda ta ma zastosowanie tylko i wyłącznie przy analizowaniu dźwięków naturalnych, lub podobnych do naturalnych. Ciekawą rzeczą jest, że gdy jako sygnał podamy tylko ton podstawowy bez harmonicznych, to metoda ta zawiedzie, choć wydawałoby się, że ton jest najprostszym dźwiękiem dla którego można wskazać częstotliwość podstawową – jest ona przecież równa częstotliwości tonu. 3 Implementacja Zadanie zostało zaimplementowane w języku Smalltalk, używając implementacji Squeak, z użyciem maszyny wirtualnej Cog. Użycie Coga pozwoliło poprawić szybkość działania aplikacji, ze względu na stosowany w nim kompilator JIT. Do wyświetlania wykresów użyty został zaimplementowany przez jednego z nas do innych celów pakiet MGPlotting, będący wolnym oprogramowaniem. Klasy aplikacji znajdują sie w pakiecie SoundProcessing. Aplikację można uruchomić wysyłając komunikaty: SoundProcessor new open. Zostało zaimplementowane szybkie przekształcenie Fouriera. 2 fastFourierTransformFrom: aNumber1 size: aNumber2 on: aSoundBuffer withCoefficients: coefficients aNumber2 = 1 ifTrue: [^ self]. self fastFourierTransformFrom: aNumber1 size: aNumber2 // 2 on: aSoundBuffer withCoefficients: coefficients. self fastFourierTransformFrom: aNumber1 + (aNumber2 // 2) size: aNumber2 // 2 on: aSoundBuffer withCoefficients: coefficients. 0 to: aNumber2 // 2 - 1 do: [:index| self butterflyForFirstIndex: aNumber1 + index secondIndex: aNumber1 + (aNumber2 // 2) + index on: aSoundBuffer coefficient: (coefficients forSize: aNumber2 power: index). ] Rysunek 1: Kod FFT Cepstrum zostało zaimplementowane w poniższy sposób. Wstępne testy pokazały, że tak zaimplementowane cepstrum dobrze spełnia swoje zadanie wykrywania częstotliwości podstawowej. Jak widać, zostało uwzględnione obcinanie wyników transformat do połowy, celem usunięcia zduplikowanych elementów, które normalnie występują. cepstrum |converter cepstrum| converter := self converter. self reset. cepstrum := self asFrequencyDomainSamples abs halfWindow asTimeDomainSamples abs halfWindow. self converter: converter. ^ cepstrum Rysunek 2: Kod Cepstrum 3 4 Wyniki Zostało przedstawionych kilka plików audio do wykonania testów. plik artificial/easy/100Hz.wav anal. prz. faz. 100,00 Hz artificial/easy/150Hz.wav 150,00 Hz artificial/easy/225Hz.wav 225,00 Hz artificial/med/303Hz.wav 27,54 Hz artificial/diff/250Hz.wav brak natural/viola/369Hz.wav brak natural/flute/443Hz.wav brak anal. ceps. 104,25 Hz 1130,76 100,45 103,76 1025,58 ... 86,3 Hz 160,36 Hz 193,42 Hz ... 226,15 Hz 1260,00 Hz 225,00 Hz ... 304,13 Hz 302,05 Hz 304,13 Hz ... 14700,00 1260,00 2100,00 ... 22050,00 367,50 22050,00 370,58 ... 4900,00 436,63 441,00 445,45 ... skuteczność 58% 49% 56% 100% 18% 88% 93% Tabela 1: Wyniki Podsumowując: metoda analizy przestrzeni fazowej okazała się w 100% skuteczna w przypadku próbek z grupy easy, dała błędny wynik dla próbki med i brak wyniku dla próbki diff oraz nagrań instrumentów. Analiza cepstralna daje bardziej złożone wyniki, które dostarczają znacznie więcej informacji o próbce. Metoda ta dała błędny wynik dla próbki typu diff (tylko dla 18% iteracji oknem przesuwnym została wskazana właściwa częstotliwośc), lecz przy wszystkich pozostałych próbkach wskazała wartościowe wyniki. W przypadku dźwięków z grupy easy właściwy wynik wystąpił dla 54% iteracji, w przypadku med: dla 100% oraz w przypadku viola: dla 90% iteracji. Próbki do powyższej 4 tabeli wybrane zostały w taki sposób, aby uniknąć testowania tego samego wiele razy. Niektóre pary próbek skutkowałyby tak naprawdę takim samym przebiegiem algorytmu (tyle że przy innej częstotliwości, co nie robi istotnej różnicy), więc zamieszczanie ich wszystkich byłoby redundantne. Z powyższej tabeli widać, że metoda analizy fazowej jest metodą dokładną, jednakże nei sprawdza się w wypadku złożonych dźwięków. Dla odmiany, metoda cepstrum nie sprawdza się dla dźwięków prostych, ale za to świetnie działa dla dźwięków posiadających wiele harmonicznych w spektrum, na przykład dla dźwięków z naturalnych instrumentów. Dlatego też warto stosować obie metody. 5 Dyskusja Problem wykrywania częstotliwości podstawowej okazuje się trudniejszy niż mogłoby się z początku wydawać. Dla plików w katalogu diff nie udało się wykryć częstotliwości podstawowej, choć obserwując te pliki na wykresie można ją zaobserwować. Zgodnie z nazwami katalogów, plik w katalogu diff były najtrudniejsze do rozpoznania, w katalog med średnio-trudne, a w katalogu easy łatwe. Dźwięki naturalne zaliczylibyśmy do dźwięków średnio-trudnych, gdyż metoda cepstrum radzi sobie z nimi całkiem dobrze. Metoda analizy w przestrzeni fazowej dobrze nadaje się do prostych dźwięków. Dla skomplikowanych metoda cepstrum daje lepsze wyniki. Jednak zaletą metody analizy przestrzeni fazowej jest prostota implementacji. 5