Temukan Musik serupa menggunakan FFT Spectrums

16

Saya telah bereksperimen beberapa minggu untuk menemukan cara untuk mencocokkan / menemukan Lagu yang serupa di Perpustakaan yang berisi berbagai genre Musik.

Percobaan pertama saya adalah untuk Mendeteksi Fitur seperti Tempo atau berapa banyak Bass yang ada di Lagu untuk membentuk grup, tapi saya tidak jauh dengan pendekatan ini (Volume Change Berdasarkan Deteksi Ketukan) karena pada sekitar 20% dari Beat Lagu tidak perlu dihitung selalu, kadang-kadang 1/2 atau 1/3 dari mereka dan saya tidak bisa mengimplementasikannya.

Setelah beberapa minggu gagal mencoba saya mendapat ide baru yang akan dijelaskan nanti dalam posting ini. Sederhananya bekerja dengan mengambil Sampel Spectrum File, membuat sesuatu seperti "Spektrum Rata-rata" File untuk membandingkannya. Gagasan di belakang adalah bahwa misalnya Hardstyle memiliki Bass lebih banyak daripada Musik Rock rata-rata, saya juga memverifikasi ini dengan melihat beberapa Spectrum di Audacity.

  • File 1: Ambil Spektrum FFT File lengkap (2048 Contoh Ukuran atm, Skala Amplitude).
  • Jumlah semua Arrays Spectrum, ambil Rata-rata dari setiap Bin
  • Lakukan hal yang sama pada beberapa File lain, simpan semua Hasil
  • Buat Daftar Perbedaan Nilai FFT antara File 1 dan File lainnya
  • Buat Rata-rata Perbedaan antara File 1 dan File X
  • Sortir Naik dengan Rata-Rata ini
  • Lagu dengan "Nilai Perbedaan" Terendah dianggap Serupa.

Dapatkah beberapa dari Anda yang memiliki pengetahuan yang baik memberi tahu saya apakah ini akan menjadi cara yang tepat / baik untuk mengimplementasikan Ide saya?

gfg
sumber
1
Jika Anda mencoba mendeteksi tempo, Anda mungkin ingin mencoba mengkuadratkan sinyal dan kemudian mengambil transformasi Fourier. Frekuensi pada urutan 1 Hz tidak akan hadir dalam spektrum FFT biasa (tidak diselesaikan), karena disaring. Gagasan terkait, yang digunakan untuk deteksi nada, disebut "cepstrum;" Anda dapat mengetahuinya dengan googling. Untuk membedakan pop dan jazz dari klasik, Anda bisa mencoba mendeteksi suara drum kit, yang tidak dipecat. Vibrato harus dapat dideteksi oleh mesin. Ada ukuran disonansi yang dapat dihitung dengan mesin.
1
Mungkin Anda harus meminta moderator untuk memindahkan ini ke dsp.SE
Dilip Sarwate
Saya menandai pertanyaan saya dengan permintaan untuk memindahkannya ke DSP SE. Maksud Anda, saya bisa mendeteksi apakah ada Present Drumkit atau Tidak untuk mengklasifikasikan Input? Bisakah Anda jelaskan bagaimana sinyal kuadrat mengarah ke Tempo?
3
Musik direkam dan dikuasai sedemikian rupa untuk memaksimalkan penyebaran spektral mereka, terutama hari ini. Saya tidak berpikir bahwa spektrum panjang penuh akan memberi Anda kriteria yang baik untuk mengklasifikasikan musik.
Phonon
2
Alih-alih spektrum, Anda harus melihat spektogram. Spektrum hanya menampilkan konten frekuensi seluruh lagu sekaligus. Spectrograms menunjukkan bagaimana konten frekuensi berubah seiring waktu.
endolith

Jawaban:

17

Apa yang Anda coba lakukan telah dicoba berulang kali oleh ratusan peneliti dan ada cukup banyak pekerjaan tentang ini. Periksa proses konferensi ISMIR. Bahkan jika itu tidak mutakhir, bacalah tesis Elias Pampalk: http://www.ofai.at/ ~elias.pampalk/publications/pampalk06thesis.pdf

Untuk mengarahkan Anda dengan cepat di jalur yang benar:

Musik dapat serupa menurut banyak dimensi: a) timbre / tekstur / genre; b) pola ritmis; c) progresi melodi / akord ... dan banyak lagi! Dari pesan Anda, tidak jelas apa yang ingin Anda ukur!

  • Jika Anda tertarik pada a) fitur yang mungkin ingin Anda lihat adalah MFCC (Mel Frequency Cepstrum Coefficients), karena mereka entah bagaimana menangkap cara kerja pendengaran manusia (frekuensi warping, skala log), karena mereka terkait dengan dekorasi (membuat pemodelan lebih mudah) , dan karena mereka memiliki dimensi yang lebih rendah (13 koefisien vs 2048).
  • Jika Anda tertarik pada b), lihat fitur yang disebut "Pola Fluktuasi" (Pampalk, dalam autokorelasi singkat sinyal dalam kisaran 0,1 .. 10 Hz pada beberapa pita); atau fitur "Penny" Whitman (FFT MFCC sepanjang sumbu waktu).
  • Jika Anda tertarik pada c), lihatlah chromagram. Mulailah dengan kode chromagram Ellis (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/) kemudian naik ke implementasi Mauch jika Anda memerlukan sesuatu yang lebih kuat (http://isophonics.net/nnls-chroma ).

Itu untuk fitur. Sekarang Anda harus memikirkan cara yang lebih baik untuk membandingkan lagu setelah direpresentasikan sebagai urutan fitur-fitur tersebut. Menghitung perbedaan berpasangan di antara urutan tidak terlalu pintar - misalnya: membandingkan lagu dan lagu yang sama diimbangi dengan keheningan akan menghasilkan perbedaan sementara itu persis sama! Anda lebih suka membandingkan distribusi fitur-fitur itu; misalnya menghitung deviasi rata-rata / standar dari fitur di atas lagu A dan deviasi rata-rata / standar dari fitur di atas lagu B dan kemudian mengambil jarak probabilistik (KL, Bhattacharyya atas mereka).

Poin terakhir, tetapi yang akan menjadi masalah nanti: menghitung jarak antara lagu dan seluruh korpus untuk menemukan pertandingan terdekat cukup tidak efisien. Ketika berhadapan dengan koleksi besar, teknik seperti LSH atau Ball tree memungkinkan pertanyaan tetangga terdekat dilakukan tanpa perbandingan eksplisit dengan seluruh corpus.

Selain itu, deteksi tempo adalah masalah yang sama sekali berbeda. Jika Anda ingin melihatnya, makalah kinerja / aksesibilitas terbaik untuk topik ini adalah Pelacakan Ketukan Ellis oleh Pemrograman Dinamis. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Ini sangat sederhana tetapi dekat dengan algoritma canggih.

pichenettes
sumber
Terima kasih atas Jawaban terperinci Anda, saya telah mendengar tentang MFCC beberapa kali dalam konteks ini dan tampaknya masuk akal untuk tidak menggunakan Hasil FFT yang kosong. Tampaknya cukup rumit untuk diterapkan dengan "keadaan pengetahuan" saya saat ini dan lingkungan pengembangan (C #, Hasil FFT Bass Library) tetapi saya akan mencoba.
gfg