Saya mencoba untuk menulis sebuah algoritma yang secara otomatis akan membagi potongan audio dengan rekaman panggilan burung. Data input saya adalah file gelombang berdurasi 1 menit dan pada output saya ingin mendapatkan panggilan terpisah untuk analisis lebih lanjut. Masalahnya adalah bahwa rasio signal-to-noise cukup mengerikan karena kondisi lingkungan dan kualitas mikrofon yang buruk (sampel mono, 8 kHz).
Saya akan sangat berterima kasih atas saran tentang bagaimana untuk melangkah lebih jauh dengan pengurangan kebisingan.
Berikut adalah contoh input saya, rekaman audio satu menit dalam format gelombang: http://goo.gl/16fG8P
Seperti inilah sinyalnya:
Penyaringan band-pass, di mana saya hanya menyimpan apa pun di antara 1500 - 2500 Hz, memang memperbaiki situasi, tetapi masih jauh dari harapan. Dalam spektrum ini masih banyak noise hadir.
Saya juga merencanakan energi rata-rata jangka panjang (lebih dari interval 32 sampel) dan menghapus beberapa klik darinya. Inilah hasilnya:
Dengan semua noise yang tersisa saya harus menetapkan ambang batas yang sangat rendah untuk algoritma deteksi awal untuk memilih 10 detik terakhir panggilan burung. Masalahnya adalah jika saya men-tweak sedemikian rupa maka dalam rekaman berikutnya saya bisa mendapatkan banyak positif palsu.
Filter moving average membantu sedikit dengan kebisingan angin. Ada ide lain? Saya sedang berpikir tentang "Pengurangan Spektral", tetapi di sini sepertinya saya saya punya masalah ayam dan telur - untuk menemukan daerah hanya kebisingan saya harus segmen audio dan untuk segmen audio saya perlu menghilangkan kebisingan. Apakah Anda tahu ada perpustakaan yang memiliki algoritma ini atau beberapa implementasi dalam pseudo-code? Methinks Audacity menggunakan metode seperti itu untuk menghilangkan noise. Ini sangat efektif, tetapi diserahkan kepada pengguna untuk menandai area hanya noise.
Saya menulis dalam Python dan ini adalah proyek open-source gratis.
Terima kasih sudah membaca!
sumber
Jawaban:
Pada akhirnya apa yang telah terbukti menjadi solusi terbaik adalah deteksi onset berdasarkan frekuensi tinggi atau kandungan energi. Sebelum bisa bekerja saya harus menggunakan filter high-pass untuk memotong 1 kHz pertama, karena mengandung terlalu banyak noise.
Setelah saya memiliki area noise-only, saya dapat menggunakan profilnya untuk mengurangi noise dari sisa sampel.
Satu perpustakaan yang saya temukan sangat berguna adalah Aubio . Ini memiliki serangkaian contoh yang baik dan menyediakan banyak algoritma untuk dipilih untuk deteksi onset.
sumber
Saya tidak tahu banyak tentang pengurangan noise audio tetapi setelah pengurangan noise yang cepat dan kotor dari pass-band yang difilter (sekitar 1500-3000 hz) saya mendapatkan ini:
https://dl.dropboxusercontent.com/u/98395391/signal_denoised.wav
Saya pikir itu terdengar sedikit lebih baik dari sinyal yang disaring dan asli.
Dengan filter Wiener sederhana saya mendapatkan hasil yang sangat mirip.
sumber