Mendeteksi drum bpm dalam file .wav yang bising

12

Saya mencari algoritme untuk menyelesaikan masalah berikut: Diberi tangkapan suara .wav yang berisik (sedikit suara angin + gesekan pada mikrofon), bagaimana cara mendeteksi BPM dari ketukan drum lembut?

Saya telah mencoba googling subjek, tetapi hasilnya cukup buruk, karena jumlah tinggi perangkat lunak terkait mp3 untuk kedua analisis dan generasi id sidik jari. Tidak ada dari mereka yang memberikan informasi tentang bagaimana cara melakukannya.

Saya mengetahui algoritma untuk menghilangkan noise, tapi itu masih membuat saya kesulitan mendeteksi BPM. Dan tergantung pada bagaimana masalah BPM diselesaikan, ada kemungkinan bahwa saya bahkan tidak perlu denoise (karena drum cenderung berada di frekuensi yang lebih rendah dan kebisingan lebih tinggi, low-pass sederhana mungkin cukup pra-pemrosesan).

Alex K
sumber
1
Ini terdengar mirip dengan masalah deteksi dengkuran saya .
Daniel R Hicks

Jawaban:

13

Salah satu metode yang bekerja jika ada ketukan drum yang relatif kuat adalah dengan mengambil besarnya STFT dari bentuk gelombang, dan kemudian secara otomatis menghubungkannya hanya dalam dimensi waktu. Puncak fungsi auto-korelasi akan menjadi irama, atau bagian dari itu.

Ini sama dengan memecah sinyal menjadi banyak pita frekuensi yang berbeda, menemukan amplop masing-masing, menginkorelasikan masing-masing amplop, dan kemudian menjumlahkannya. Kebisingan dan bagian-bagian lain dari musik dirata-rata oleh operasi korelasi silang.

Ini karena ketukan drum menghasilkan suara berumur pendek di banyak frekuensi (garis vertikal), sementara bagian musik lainnya berumur panjang hanya pada beberapa frekuensi (garis horizontal), dan kebisingan berumur panjang tetapi acak di semua frekuensi. Anda dapat melihat pengulangan beat jika Anda melihat STFT:

masukkan deskripsi gambar di sini

Saya datang dengan ini untuk proyek sekolah untuk menemukan nilai BPM tunggal untuk seluruh file musik, tetapi bisa disesuaikan dengan aliran audio dengan mengubah BPM juga. Anda perlu memproses potongan yang setidaknya dua kali selama periode BPM yang Anda cari.

endolit
sumber
FFT adalah teknik yang umumnya berguna untuk menemukan sinyal periodik. Mungkin ada sedikit trickiness jika sinyalnya tidak seserius yang Anda inginkan: drummer dapat mempercepat atau memperlambat selama lagu - sengaja atau tidak - dan ini bisa mengacaukan dengan hasil FFT dalam domain frekuensi.
Rethunk
1
@Rethunk: Jika BPM berubah seiring waktu, Anda harus melakukan ini dalam potongan, dan menemukan BPM untuk masing-masing.
Endolith
Perhatikan bahwa ketukan biasanya dikaitkan dengan musik, dan Anda juga melihat bagian lain dari musik dalam gambar ini: garis horizontal, yang mengubah ketinggian pada irama. Jadi pada dasarnya ada tiga kontribusi energi: ketukan (vertikal), not (horizontal) dan noise (sisa).
MSalters
@ MSalters: Catatan juga dapat berkorelasi,
endolith
4

Korelasi otomatis tentu merupakan metode dasar yang bagus untuk itu. Ada beberapa hal yang dapat Anda lakukan untuk berpotensi meningkatkan ini lebih lanjut:

  1. Jika Anda mengetahui spektrum frekuensi drum Anda, bandpass saring sinyal sehingga hanya frekuensi yang relevan dengan drum tetap. Tergantung pada drum, ini bisa sangat sempit dan harus menghilangkan sebagian besar kebisingan.
  2. Kemudian hitung amplop domain waktu dari sinyal ("puncak lossy" adalah cara termudah untuk melakukan ini) dengan konstanta waktu yang secara kasar cocok dengan panjang ketukan drum.
  3. Kemudian lakukan korelasi-otomatis
Hilmar
sumber