Autokorelacja w analizie audio

11

Czytam o autokorelacji , ale nie jestem pewien, czy rozumiem dokładnie, jak to działa i jakich wyników powinienem się spodziewać. Czy mam rację, że powinienem wprowadzić sygnał do funkcji prądu przemiennego i mieć okno przesuwne. Każde okno (na przykład 1024 próbek) generowałoby współczynnik między -1 a 1. Znak po prostu stwierdza, czy linia jest skierowana w górę lub w dół, a wartość określa, jak silna jest korelacja. Dla uproszczenia załóżmy, że nie mam nakładki i po prostu przesuwaj okno 1024 próbek za każdym razem. Czy w próbie 44100 otrzymam 43 współczynniki i czy muszę je wszystkie zachować?

Powiedzmy, że wykonuję to dla 200-sekundowego sygnału, co daje mi 8600 współczynników. Jak miałbym wykorzystać te współczynniki do wykrycia powtórzeń, a tym samym tempa? Czy powinienem stworzyć jakąś sieć neuronową, aby je pogrupować, czy może to przesada?

Dziękuję za wszelką pomoc.

XSL
źródło
4
1024x[1],x[2],,x[1024]i=11024(x[i])21024R[k]R[k]=i=11024kx[i]x[i+k]1024R[k]R[k]=i=11024kx[i]x[i+k]+i=1kx[1024k+i]x[i]
Hej Dilip, dzięki za pomoc. Nie wdrożyłem jeszcze funkcji AC, staram się najpierw skupić na teorii. Pierwsze równanie wydaje się być najłatwiejsze, ale czy dane trzeba wcześniej znormalizować?
XSL
1
Oto przykład: gist.github.com/255291#L62
endolit

Odpowiedzi:

23

Ideą autokorelacji jest zapewnienie miary podobieństwa między sygnałem a samym sobą przy danym opóźnieniu. Można podejść do tego na kilka sposobów, ale do celów wykrywania wysokości / tempa można potraktować to jako procedurę wyszukiwania. Innymi słowy, przechodzisz przez sygnał próbka po próbce i wykonujesz korelację między oknem odniesienia a opóźnionym oknem. Korelacja przy „opóźnieniu 0” będzie globalnym maksimum, ponieważ porównujesz odniesienie do pełnej kopii samego siebie. W miarę postępów korelacja z konieczności się zmniejszy, ale w przypadku sygnału okresowego w pewnym momencie zacznie się ponownie zwiększać, a następnie osiągnie lokalne maksimum. Odległość między „opóźnieniem 0” a pierwszym pikiem daje oszacowanie wysokości / tempa. Sposób w jaki ja

Obliczanie korelacji między próbkami może być bardzo drogie obliczeniowo przy wysokich częstotliwościach próbkowania, dlatego zwykle stosuje się podejście oparte na FFT. Biorąc FFT interesującego segmentu, mnożąc go przez jego złożony koniugat , a następnie biorąc odwrotną FFT da ci cykliczną autokorelację . W kodzie (przy użyciu numpy ):

freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))

Efektem będzie zmniejszenie ilości szumu w sygnale (który nie jest skorelowany z samym sobą) w stosunku do składowych okresowych (które z definicji są podobne do siebie). Powtórzenie autokorelacji (tj. Mnożenie sprzężone) przed podjęciem odwrotnej transformacji jeszcze bardziej zmniejszy szum. Rozważ przykład fali sinusoidalnej zmieszanej z białym szumem. Poniższy wykres przedstawia falę sinusoidalną 440 Hz, tę samą falę sinusoidalną „zepsutą” przez szum, cykliczną autokorelację fali szumowej i podwójną autokorelację:

Autokorelacja

Zwróć uwagę, jak pierwszy szczyt obu sygnałów autokorelacji znajduje się dokładnie na końcu pierwszego cyklu oryginalnego sygnału. To jest szczyt, którego szukasz, aby określić okresowość (w tym przypadku wysokość). Pierwszy sygnał autokorelacji jest nadal nieco „poruszający”, więc aby wykonać detekcję piku, konieczne byłoby pewne wygładzenie. Dwukrotna autokorelacja w dziedzinie częstotliwości osiąga to samo (i jest stosunkowo szybka). Zauważ, że przez „falisty” mam na myśli wygląd sygnału po zbliżeniu, a nie zapad, który pojawia się na środku wykresu. Druga połowa cyklicznej autokorelacji będzie zawsze odbiciem lustrzanym pierwszej połowy, więc ten typ „zanurzenia” jest typowy. Aby wyjaśnić algorytm, oto jak wyglądałby kod:

freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)

To, czy trzeba wykonać więcej niż jedną autokorelację, zależy od ilości szumu w sygnale.

Oczywiście istnieje wiele subtelnych odmian tego pomysłu i nie zamierzam się tutaj zajmować. Najbardziej wszechstronny zasięg, jaki widziałem (w kontekście wykrywania wysokości tonu), to Cyfrowe przetwarzanie sygnałów mowy Rabinera i Schafera.


Teraz, czy autokorelacja będzie wystarczająca do wykrycia tempa. Odpowiedź brzmi: tak i nie. Możesz uzyskać informacje o tempie (w zależności od sygnału źródłowego), ale może być trudno zrozumieć, co to znaczy we wszystkich przypadkach. Na przykład, oto wykres dwóch pętli breakbeat, a następnie wykres cyklicznej autokorelacji całej sekwencji:

Autokorelacja Breakbeat

Dla odniesienia, oto odpowiedni dźwięk:

Rzeczywiście, w środku znajduje się ładny skok odpowiadający punktowi pętli, ale powstał z przetworzenia dość długiego segmentu. Ponadto, jeśli nie byłby to dokładny egzemplarz (np. Gdyby było w nim oprzyrządowanie), kolec nie byłby tak czysty. Autokorelacja z pewnością będzie przydatna w wykrywaniu tempa, ale prawdopodobnie sama w sobie nie będzie wystarczająca dla złożonego materiału źródłowego. Na przykład, nawet jeśli znajdziesz skok, skąd wiesz, czy jest to pełny takt, ćwierćnuta, półnuta, czy coś innego? W tym przypadku jest wystarczająco jasne, że jest to pełna miara, ale nie zawsze tak będzie. Proponuję bawić się przy użyciu prądu przemiennego na prostszych sygnałach, dopóki wewnętrzne funkcje nie staną się jasne, a następnie zadać kolejne pytanie o wykrywanie tempa w ogóle (ponieważ jest to „większy”

Datageist
źródło
2
Poczekaj, czy to autokorelacja samego sygnału audio? Z pewnością nie jest to bardzo przydatne do wykrywania tempa czegokolwiek poza cyfrowymi pętlami. Autokorelacja niektórych obwiedni RMS powinna ogólnie działać znacznie lepiej, najlepiej dla osobno dla wielu pasm częstotliwości.
leftaroundabout 10.1011
1
Autokorelacja STFT w kierunku czasu działa całkiem dobrze, o ile muzyka ma jakiś rytm. Jest to w zasadzie to samo, co przeprowadzanie autokorelacji wielu pasm częstotliwości, a następnie ich sumowanie.
endolith,
2
@leftroundabout Racja, oprócz samej autokorelacji należy wykonać wiele czynności w celu wykrycia tempa (wstępne, końcowe przetwarzanie). Odpowiadam głównie na pierwsze zdanie pytania PO (tj. „Jak działa autokorelacja”), a następnie sugeruję, aby zadał kolejne pytanie o wykrywanie tempa, ponieważ w grę wchodzą inne procesy.
Datageist
@endolith, co masz tutaj na myśli Autocorrelation of the STFT in the time direction? W szczególności część dotycząca czasu
popctrl
1
@popctrl Znaczenie do obliczenia autokorelacji każdego wiersza STFT
endolith
3

Wygląda na to, że chcesz użyć autokorelacji do wykrywania beatów. Możesz to zrobić, ale sugeruję, aby znacznie obniżyć jakość dźwięku. Szukasz sygnału między 1 a 3 Hz (60 uderzeń na minutę do 180 uderzeń na minutę), więc nie potrzebujesz ani nie chcesz rozdzielczości 44100 Hz. Prawidłowo obliczona i znormalizowana autokorelacja wynosi 1,0 przy opóźnieniu 0 (sygnał doskonale koreluje ze sobą). W przypadku sygnału okresowego prąd przemienny spada poniżej zera, a następnie wraca do wartości szczytowej z opóźnieniem odpowiadającym częstotliwości podstawowej, z mniejszymi pikami przy harmonicznych. Musisz wybrać rozsądny zakres, w którym chcesz wyszukać ten szczyt. W przypadku szumu autokorelacja spada i w zasadzie jest płaska w zygzakach wokół zera. Zasadniczo, jeśli masz szczyt> 0,5 w znormalizowanym ac, masz okresowy sygnał.

Rachunek
źródło
1

Automatyczna korelacja jest po prostu korelacją krzyżową sygnału z samym sobą. Łatwym sposobem na obliczenie tego jest splot pierwotnego sygnału z wersją sygnału z odwróconym czasem. Jeśli masz sygnał o długości 1000 próbek, wówczas jego autokorelacja ma niezerowe próbki z 1999 r. (2 * N-1). Tylko 1000 z tych próbek jest unikatowych, ponieważ autokorelacja (dla sygnału rzeczywistego) jest zawsze symetryczna w czasie, tj. Ac [n] = ac [-n].

Sygnały ciągłe należy podzielić na segmenty skończone. Jest to podobne do transformacji Fouriera: technicznie musisz zintegrować od -inf do + inf, ale rozbicie go na segmenty (z nakładaniem się i / lub okienkowaniem w razie potrzeby) również daje przydatne wyniki. Wybór długości, kształtu i zakładki okna zależy od zastosowania.

Hilmar
źródło