Znajdź podobną muzykę za pomocą spektrum FFT

16

Kilka tygodni eksperymentowałem, aby znaleźć sposób na dopasowanie / znalezienie podobnych utworów w bibliotece zawierającej różne gatunki muzyczne.

Moja pierwsza próba polegała na wykryciu funkcji takich jak Tempo lub ilości basów w utworach, aby utworzyć grupy, ale nie posunąłem się za daleko z tym podejściem (wykrywanie uderzeń oparte na zmianach głośności), ponieważ na około 20% utworów Beat nie trzeba liczyć zawsze czasami 1/2 lub 1/3 z nich i nie mogłem tego wdrożyć.

Po kilku tygodniach nieudanych prób dostałem nowy pomysł, który jest opisany w dalszej części tego postu. Po prostu działa, pobierając Próbki plików spektrum, tworząc coś w rodzaju „przeciętnego spektrum” plików, aby je porównać. Pomysł był taki, że na przykład Hardstyle ma znacznie więcej basu niż przeciętna muzyka rockowa, zweryfikowałem to również, patrząc na niektóre widma w Audacity.

  • Plik 1: Pobierz pełne spektrum plików FFT (atm atm 2048, Log Amplitudes. Skalowane)
  • Zsumuj wszystkie tablice widm, weź średnie z każdego pojemnika
  • Zrób to samo z innymi plikami, zapisz wszystkie wyniki
  • Zrób listę różnic wartości FFT między plikiem 1 a innymi plikami
  • Zrób średnią różnic między plikiem 1 a plikiem X
  • Sortuj rosnąco według tych średnich
  • Piosenki o najniższej „wartości różnicy” są uważane za podobne.

Czy niektórzy z was, którzy mają dobrą wiedzę, mogą powiedzieć mi, czy byłby to właściwy / dobry sposób na wdrożenie mojego pomysłu?

gfg
źródło
1
Jeśli próbujesz wykryć tempo, możesz spróbować wyrównać sygnał, a następnie wykonać transformatę Fouriera. Częstotliwości rzędu 1 Hz nie będą obecne w zwykłym (niekwadrowanym) widmie FFT, ponieważ są odfiltrowane. Pokrewny pomysł, stosowany do wykrywania wysokości tonu, nazywa się „cepstrum”; możesz się o tym dowiedzieć, przeglądając google. Aby odróżnić pop i jazz od klasycznego, możesz spróbować wykryć dźwięki zestawu perkusyjnego, które są nieprzygotowane. Vibrato powinno być wykrywalne maszynowo. Istnieją miary dysonansu, które można obliczyć maszynowo.
1
Może powinieneś poprosić moderatorów, aby przenieśli to na dsp.SE
Dilip Sarwate
Oflagowałem swoje pytanie prośbą o przeniesienie go do DSP SE. Masz na myśli, że mogę wykryć, czy istnieje Drumkit, czy nie, aby sklasyfikować dane wejściowe? Czy możesz wyjaśnić, w jaki sposób kwadratowy sygnał prowadzi do Tempo?
3
Muzyka jest nagrywana i opanowywana w taki sposób, aby zmaksymalizować ich rozpiętość spektralną, szczególnie w dzisiejszych czasach. Nie sądzę, aby widma pełnej długości stanowiły dobre kryterium klasyfikacji muzyki.
Phonon
2
Zamiast widm powinieneś patrzeć na spektrogramy. Widma pokazują tylko zawartość częstotliwości całego utworu na raz. Spektrogramy pokazują, jak zmienia się zawartość częstotliwości w czasie.
endolith

Odpowiedzi:

17

To, co próbujesz zrobić, zostało wielokrotnie sprawdzone przez setki badaczy i jest na to sporo pracy. Sprawdź przebieg konferencji ISMIR. Nawet jeśli nie jest aktualne, przeczytaj tezę Eliasa Pampalka: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

Aby szybko zorientować Cię na właściwej drodze:

Muzyka może być podobna do wielu wymiarów: a) barwa / tekstura / gatunek; b) wzór rytmiczny; c) progresja melodii / akordu ... i wiele więcej! Z wiadomości nie wynika jasno, co chcesz zmierzyć!

  • Jeśli interesuje Cię a) funkcje, na które warto spojrzeć, to MFCC (współczynniki cepstrum częstotliwości Mel), ponieważ w pewien sposób oddają sposób działania ludzkiego słuchu (wypaczanie częstotliwości, skala logarytmiczna), ponieważ są one powiązane ze sobą (ułatwiając modelowanie) , a ponieważ mają one mniejszą wymiarowość (13 współczynników vs 2048).
  • Jeśli interesuje Cię b), spójrz na funkcję o nazwie „Wzorce fluktuacji” (Pampalk, w skrócie autokorelacja sygnału w zakresie 0,1–10 Hz w kilku pasmach); lub „Penny” Whitmana (FFT z MFCC wzdłuż osi czasu).
  • Jeśli jesteś zainteresowany c), spójrz na chromagramy. Zacznij od kodu chromagramowego Ellisa (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/), a następnie przejdź do implementacji Maucha, jeśli potrzebujesz czegoś bardziej niezawodnego (http://isophonics.net/nnls-chroma ).

To dotyczy funkcji. Teraz musisz pomyśleć o lepszym sposobie porównywania swoich piosenek, gdy zostaną one przedstawione jako sekwencja tych funkcji. Obliczanie różnic między sekwencjami między parami nie jest zbyt mądre - np. Porównanie piosenki i tego samego utworu z pewną ciszą da różnicę, podczas gdy jest dokładnie taka sama! Wolisz porównać rozkład tych funkcji; na przykład obliczyć średnią / standardowe odchylenie cech nad piosenką A i średnią / standardową odchylenie cech nad piosenką B, a następnie przyjąć dystans probabilistyczny (KL, Bhattacharyya nad nimi).

Ostatni punkt, który jednak będzie miał znaczenie później: obliczenie odległości między utworem a resztą korpusu w celu znalezienia najbliższych dopasowań jest dość nieefektywne. W przypadku dużych kolekcji techniki takie jak drzewa LSH lub drzewa Ball umożliwiają wykonywanie zapytań od najbliższych sąsiadów bez wyraźnego porównania z całym ciałem.

Nawiasem mówiąc, wykrywanie tempa to zupełnie inna sprawa. Jeśli chcesz się temu przyjrzeć, najlepszym dokumentem dotyczącym wydajności / dostępności na ten temat jest Ellis Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Jest niezwykle prosty, ale zbliżony do najnowocześniejszych algorytmów.

fenenety
źródło
Dziękuję za szczegółową odpowiedź, już wiele razy słyszałem o MFCC w tym kontekście i wydaje się rozsądne, aby nie używać nagich wyników FFT. Wydaje się dość skomplikowane do wdrożenia z moim obecnym „stanem wiedzy” i środowiskiem programistycznym (C #, wyniki FFT biblioteki basowej), ale spróbuję.
gfg