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