it-swarm-id.com

Detak per menit dari input audio real-time

Saya ingin menulis aplikasi C # sederhana untuk memonitor audio line-in dan memberi saya ketukan saat ini (rata-rata bergulir) per menit.

Saya telah melihat artikel gamedev ini , dan itu sama sekali tidak membantu. Saya melewati dan mencoba menerapkan apa yang dia lakukan tetapi tidak berhasil.

Saya tahu harus ada banyak solusi untuk ini, karena banyak perangkat lunak DJ yang melakukannya, tetapi saya tidak beruntung menemukan perpustakaan open-source atau instruksi untuk melakukannya sendiri.

42
Karl

Hitung powerspectrum dengan jendela geser FFT: Ambil 1024 sampel: 

double[] signal = stream.Take(1024);

Feed itu ke algoritma FFT: 

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

Anda akan mendapatkan bagian nyata dan bagian imajiner. JANGAN buang bagian imajiner. Lakukan hal yang sama ke bagian nyata sebagai imajiner. Meskipun benar bahwa bagian imajiner adalah pi/2 dari fase dengan nyata, itu masih mengandung 50% dari informasi spektrum.

EDIT:

Hitung kekuatan sebagai lawan dari amplitudo sehingga Anda memiliki angka tinggi ketika itu keras dan mendekati nol ketika tenang:

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

Demikian pula untuk bagian imajiner.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

Sekarang Anda memiliki spektrum daya untuk 1024 sampel terakhir. Di mana bagian pertama dari spektrum adalah frekuensi rendah dan bagian terakhir dari spektrum adalah frekuensi tinggi .

Jika Anda ingin menemukan BPM dalam musik populer, Anda mungkin harus fokus pada bass. Anda dapat mengambil intensitas bass dengan menjumlahkan bagian bawah dari spektrum daya. Angka yang digunakan tergantung pada frekuensi pengambilan sampel:

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

Sekarang lakukan hal yang sama lagi tetapi pindahkan jendela 256 sampel sebelum Anda menghitung spektrum baru. Sekarang Anda berakhir dengan menghitung bassIntensity untuk setiap 256 sampel. 

Ini adalah input yang baik untuk analisis BPM Anda. Ketika bass tenang, Anda tidak memiliki irama dan ketika itu keras Anda memiliki irama. 

Semoga berhasil!

26
Hallgrim

Ada proyek luar biasa yang disebut Dancing Monkeys, yang secara prosedural menghasilkan langkah-langkah tarian DDR dari musik. Sebagian besar dari apa yang dilakukannya didasarkan pada analisis beat (tentu saja sangat akurat), dan makalah proyek mereka masuk ke banyak detail menggambarkan berbagai algoritma deteksi beat dan kesesuaian mereka dengan tugas. Mereka termasuk referensi ke makalah asli untuk masing-masing algoritma. Mereka juga menerbitkan kode matlab untuk solusi mereka. Saya yakin bahwa di antara mereka Anda dapat menemukan apa yang Anda butuhkan.

Semua tersedia di sini: http://monket.net/dancing-monkeys-v2/Main_Page

15
Nick Johnson

Bukannya saya memiliki petunjuk bagaimana menerapkan ini, tetapi dari perspektif rekayasa audio Anda harus memfilter terlebih dahulu. Hit drum bass akan menjadi yang pertama untuk memeriksa. Filter low pass yang memberi Anda apa pun di bawah sekitar 200Hz akan memberi Anda gambaran yang cukup jelas tentang drum bass. Gerbang mungkin juga diperlukan untuk membersihkan segala kekacauan dari instrumen lain dengan harmonisa yang rendah.

Selanjutnya yang akan diperiksa adalah snare hits. Anda harus EQ yang ini. "Retak" dari snare adalah sekitar 1.5kHz dari memori, tetapi Anda harus benar-benar melakukan gerbang yang satu ini.

Tantangan selanjutnya adalah membuat algoritma untuk ketukan yang funky. Bagaimana Anda menemukan secara sistematis ketukan 1? Saya kira Anda akan melacak ketukan sebelumnya dan menggunakan pola yang cocok dengan sesuatu atau lainnya. Jadi, Anda mungkin perlu beberapa batang untuk menemukan irama dengan akurat. Lalu ada masalah waktu seperti 4/4, 3/4, 6/8, wow, saya tidak bisa membayangkan apa yang harus dilakukan untuk melakukan ini secara akurat! Saya yakin itu akan bernilai uang serius untuk perusahaan perangkat keras/perangkat lunak audio.

8
Dan Harper

Ini bukan masalah yang mudah. Saya akan mencoba memberi Anda gambaran saja.

Yang bisa Anda lakukan adalah sesuatu seperti yang berikut:

  1. Hitung rata-rata (root-mean-square) kenyaringan sinyal di atas blok, katakanlah, 5 milidetik. (Karena belum pernah melakukan ini sebelumnya, saya tidak tahu apa ukuran blok yang baik.)
  2. Ambil transformasi Fourier dari sinyal "diblokir", menggunakan algoritma FFT.
  3. Temukan komponen dalam sinyal transformasi yang memiliki magnitudo terbesar.

Transformasi Fourier pada dasarnya adalah cara menghitung kekuatan semua frekuensi yang ada dalam sinyal. Jika Anda melakukannya di atas sinyal "diblokir", frekuensi ketukan mudah-mudahan akan menjadi yang terkuat.

Mungkin Anda perlu menerapkan filter terlebih dahulu, untuk fokus pada frekuensi tertentu (seperti bass) yang biasanya berisi sebagian besar informasi tentang BPM.

6
Thomas

Saya menemukan perpustakaan ini yang tampaknya memiliki implementasi yang cukup solid untuk mendeteksi Beats per Minute . http://soundtouchdotnet.codeplex.com/

Ini didasarkan pada http://www.surina.net/soundtouch/index.html yang digunakan dalam beberapa proyek DJ http://www.surina.net/soundtouch/applications.html

5
eandersson

Pertama-tama, apa yang Hallgrim hasilkan bukanlah fungsi kepadatan spektral daya. Periode berkala statistik dalam sinyal apa pun dapat ditunjukkan melalui fungsi autokorelasi. Transformasi fourier dari sinyal autokorelasi adalah kepadatan spektral daya. Puncak yang dominan di PSD selain pada 0 Hz akan sesuai dengan periodisitas efektif dalam sinyal (dalam Hz) ... 

1
pete

Saya akan merekomendasikan memeriksa perpustakaan audio BASS dan bungkus BASS.NET. Ini memiliki kelas BPMCounter bawaan. 

Detail untuk fungsi spesifik ini dapat ditemukan di http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm .

0
Matt Williams

Cara mudah untuk melakukannya adalah membuat pengguna mengetuk tombol seirama dengan irama, dan menghitung jumlah ketukan dibagi waktu.

0
Lucius Kwok