Trova musica simile usando gli spettri FFT


16

Ho sperimentato alcune settimane per trovare un modo per abbinare / trovare brani simili in una libreria contenente diversi generi di musica.

Il mio primo tentativo è stato di rilevare funzioni come il tempo o la quantità di bassi presente nelle canzoni per formare gruppi, ma non sono andato molto lontano con questo approccio (rilevamento delle variazioni del volume in base al volume) poiché su circa il 20% delle canzoni non è necessario contare sempre, a volte 1/2 o 1/3 di loro e non potevo implementarlo.

Dopo alcune settimane di tentativi falliti, ho avuto una nuova idea che verrà descritta più avanti in questo post. In poche parole, funziona prendendo campioni di file di spettro, creando qualcosa di simile a uno "spettro medio" di file per confrontarli. L'idea alla base era che, ad esempio, Hardstyle ha molti più bassi rispetto alla musica rock media, l'ho verificato anche guardando alcuni spettri in Audacity.

  • File 1: Acquisisci spettro FFT file completo (2048 Dimensione campione atm, Registro ampiezze ridimensionato)
  • Somma tutte le matrici di spettro, prendi le medie di ogni bin
  • Fai lo stesso alcuni altri file, archivia tutti i risultati
  • Crea un elenco di differenze di valori FFT tra il file 1 e altri file
  • Calcola la media delle differenze tra il file 1 e il file X
  • Ordinamento crescente in base a queste medie
  • I brani con il "Valore di differenza" più basso sono considerati simili.

Alcuni di voi che hanno una buona conoscenza possono dirmi se questo sarebbe il modo giusto / buono per attuare la mia idea?


1
Se stai provando a rilevare il tempo, potresti voler provare a quadrare il segnale e poi prendere una trasformata di Fourier. Le frequenze dell'ordine di 1 Hz non saranno presenti in uno spettro FFT ordinario (non quadrato), perché filtrate. Un'idea correlata, utilizzata per il rilevamento del tono, è chiamata "cepstrum;" puoi scoprirlo su Google. Per differenziare il pop e il jazz dalla classica, potresti provare a rilevare i suoni di una batteria, che non sono amplificati. Il vibrato deve essere rilevabile dalla macchina. Ci sono misure di dissonanza che possono essere calcolate automaticamente.

1
Forse dovresti chiedere ai moderatori di spostarlo su dsp.SE
Dilip Sarwate il

Ho contrassegnato la mia domanda con la richiesta di spostarla su DSP di SE. Vuoi dire che potrei rilevare se esiste un Drumkit presente o non classificare l'ingresso? Puoi spiegare come il segnale quadrato porta al Tempo?

3
La musica è registrata e padroneggiata in modo tale da massimizzare la loro diffusione spettrale, specialmente in questi giorni. Non credo che gli spettri a lunghezza intera ti daranno un buon criterio per classificare la musica.
Phonon

2
Invece di spettri, dovresti guardare gli spettrogrammi. Gli spettri mostrano solo il contenuto in frequenza dell'intero brano in una sola volta. Gli spettrogrammi mostrano come il contenuto di frequenza cambia nel tempo.
endolito il

Risposte:


17

Ciò che stai cercando di fare è stato ripetutamente testato da centinaia di ricercatori e al riguardo c'è un gran numero di lavori. Controlla gli atti della conferenza ISMIR. Anche se non è aggiornato, leggi la tesi di Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

Per orientarti rapidamente sulla strada giusta:

La musica può essere simile in base a molte dimensioni: a) timbro / trama / genere; b) pattern ritmico; c) progressione melodia / accordo ... e altro! Dal tuo messaggio non è chiaro cosa vuoi misurare!

  • Se siete interessati a) le caratteristiche che potreste voler vedere sono MFCC (coefficienti di cepstrum di frequenza di mel), poiché in qualche modo catturano il modo in cui funziona l'udito umano (warping di frequenza, scala di registro), poiché sono decorrelati (facilitando la modellazione) e poiché presentano una dimensionalità inferiore (13 coefficienti contro 2048).
  • Se sei interessato a b), guarda una funzione chiamata "Fluttuation Patterns" (Pampalk, in breve autocorrelazione del segnale nell'intervallo 0,1 .. 10 Hz su alcune bande); o le funzionalità "Penny" di Whitman (FFT dell'MFCC lungo l'asse temporale).
  • Se sei interessato a c), guarda i cromagrammi. Inizia con il codice cromagramma di Ellis (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/) quindi passa all'implementazione di Mauch se hai bisogno di qualcosa di più robusto (http://isophonics.net/nnls-chroma ).

Questo è per le caratteristiche. Ora dovrai pensare a un modo migliore per confrontare le tue canzoni una volta che sono state rappresentate come una sequenza di quelle caratteristiche. Il calcolo delle differenze a coppie tra le sequenze non è molto intelligente - ad esempio: confrontare una canzone e la stessa canzone compensata da un po 'di silenzio produrrà una differenza mentre è esattamente la stessa! Preferiresti confrontare la distribuzione di quelle funzionalità; ad esempio calcolare la deviazione media / standard delle caratteristiche rispetto al brano A e la deviazione media / standard delle funzioni rispetto al brano B e quindi prendere una distanza probabilistica (KL, Bhattacharyya rispetto a quelli).

Ultimo punto, ma che importerà in seguito: calcolare la distanza tra una canzone e il resto del corpus per trovare le partite più vicine è abbastanza inefficiente. Quando si ha a che fare con collezioni di grandi dimensioni, tecniche come LSH o Ball tree consentono l'esecuzione di tali query dei vicini più vicini senza un confronto esplicito con l'intero corpus.

A parte questo, il rilevamento del tempo è una questione completamente diversa. Se vuoi esaminarlo, il miglior documento sulle prestazioni / accessibilità sull'argomento è il Beat Tracking di Ellis di Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . È incredibilmente semplice ma è vicino agli algoritmi all'avanguardia.


Grazie per la risposta dettagliata, ho già sentito parlare più volte di MFCC in questo contesto e sembra ragionevole non usare risultati FFT nudi. Sembra piuttosto complesso da implementare con il mio attuale "stato di conoscenza" e l'ambiente di sviluppo (C #, i risultati FFT della Bass Library) ma ci proverò.
gfg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.