Deteksi Lapangan Manusia Secara Real-Time

11

Saya mencoba menerapkan permainan menyanyi yang akan menganalisis input mic mentah dan memberi tahu pemain seberapa bagus dia bernyanyi. Itu perlu dilakukan secara real-time.

Saya telah menemukan banyak utas yang menanyakan pertanyaan yang sama tetapi saya masih belum selesai dengan hal itu, mungkin karena kurangnya pengalaman saya di lapangan dan latar belakang matematika yang dangkal. Saya telah menerapkan algoritma berdasarkan artikel DSPDimension situs web pergeseran pitch: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

Saya mengekstrak frekuensi dan besaran sebenarnya seperti yang dijelaskan dalam artikel, tapi saya tidak tahu menemukan frekuensi dasar dengan ini. Saya sudah mencoba untuk mendapatkan bin dengan magnitudo terbesar tetapi itu hanya memberi saya hasil yang tepat untuk sinyal nada yang lebih tinggi, tidak masalah faktor oversampling yang saya gunakan. Saya masih mendapatkan data buruk untuk sinyal freq rendah. Apakah pendekatan ini sepenuhnya salah atau saya berada di jalur yang benar tetapi hanya melewatkan sesuatu?

Terima kasih sebelumnya,

EDIT: Saya lupa menyebutkan bahwa saya hanya tertarik pada kelas pitch, jadi tidak apa-apa jika fundamentalnya hilang tetapi saya memiliki nada kuat dalam sampel.

EDIT2: Terima kasih untuk semua orang, saya baru saja menyelesaikan versi algoritma yang bekerja seperti pesona. Masalah estimasi pitch rendah adalah karena tes input saya. Ketika saya menyanyikan not itu cocok dengan benar. Juga, saya sedang mempertimbangkan semua harmonisa sekarang, bukan hanya puncak tertinggi.

Felipe Lira
sumber
Wikipedia memiliki beberapa informasi.
Emre

Jawaban:

9

Saya sudah mencoba untuk mendapatkan bin dengan magnitudo terbesar tetapi itu hanya memberi saya hasil yang tepat untuk sinyal nada yang lebih tinggi, tidak masalah faktor oversampling yang saya gunakan. Saya masih mendapatkan data buruk untuk sinyal freq rendah.

Itu karena harmonik yang lebih besar dari yang mendasar. Plot spektrum Anda dan Anda akan melihat. Metode yang lebih baik untuk menemukan fundamental yang benar adalah autokorelasi. Kemudian Anda "menggeser" bentuk gelombang melewati dirinya sendiri dan menemukan penundaan di mana bentuk gelombang sejajar dengan dirinya sendiri.

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

Apakah Anda benar-benar ingin mereka menyanyikan nada yang tepat, atau apakah boleh jika mereka menyanyikan satu oktaf di atas atau di bawah tergantung pada daftar suara mereka?

endolit
sumber
Anda benar, saya lupa menyebutkan bahwa saya hanya tertarik pada kelas pitch. Saya menggunakan situs web ini untuk menguji alat saya: seventhstring.com/tuningfork/tuningfork.html . Untuk input A (220Hz) mengembalikan E (660Hz) sebagai kelas pitch yang ditemukan. Saya melihat pada sprectum dan 220Hz memang ada, tetapi dengan magnitude lebih rendah dari 660Hz. Setelah memfilter nilai di bawah magnitudo minimum dan frekuensi tutup dalam rentang yang saya inginkan, sprectum yang saya dapatkan dari ini memiliki 4 puncak. [puncak, mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Felipe Lira
Saya baru saja membuat saya berpikir bahwa mungkin saya harus mempertimbangkan fase offset saat menghitung besarnya, seperti yang saya lakukan untuk mendapatkan frekuensi yang sebenarnya. Apakah itu masuk akal? Apa yang saya maksudkan adalah, jika saya memiliki offset fase kira-kira 90º untuk sebuah bin, "puncak" akan berada pada besaran 0 bukan?
Felipe Lira
@elipedrl: Jadi pada dasarnya Anda menulis tuner gitar. :) Seperti yang saya mengerti, mereka low-pass filter untuk membersihkan bentuk gelombang dan kemudian menghitung puncak untuk mendapatkan pitch. electronicdesign.com/article/articles/… aboutmicrocontroller.blogspot.com/2008/04/... Ada cara yang lebih baik, jika Anda mencari akurasi daripada murahnya gist.github.com/255291
endolith
@elipedrl: Fasa offset untuk bin harus tidak relevan dengan pitch. Setiap nampan adalah bilangan kompleks, dan Anda tertarik pada nilai absolut atau besarnya angka itu. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith
1
dan jika Anda kebetulan memiliki 2 FFT lebih pendek karena beberapa alasan (latensi, kuanta waktu, dll.), perhitungan fase vocoder adalah perhitungan yang lebih sedikit daripada melakukan FFT yang lebih lama lagi dan menginterpolasinya.
hotpaw2
6

Ya, menggunakan penduga frekuensi puncak untuk nada salah. Pitch adalah fenomena psikoakustik, sehingga deteksi atau estimasi pitch berbeda dari estimasi frekuensi. Ada banyak metode estimasi pitch yang diberikan dalam jawaban sebelumnya untuk pertanyaan serupa di sini. Ada lebih dari 1 untuk dipilih.

Ini satu: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 , dan lainnya: Kiat untuk meningkatkan deteksi pitch

TAMBAH # 1: Pertanyaan yang mirip dengan ini sering ditanyakan sehingga saya menulis posting blog yang lebih panjang tentang topik ini: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- frequency.html

hotpaw2
sumber
Saya memperbarui pertanyaan dengan informasi yang saya hanya tertarik pada kelas pitch. Saya sangat berharap bahwa FFT dengan pemrosesan pos sudah cukup untuk ini, saya jauh di belakang jadwal saya dan mengubah pendekatan akan sangat buruk bagi saya.
Felipe Lira
@elipedrl: FFT seharusnya berfungsi. Mendapatkan beberapa puncak dan kemudian dengan cerdas memilih salah satunya harus cukup baik. Ingat puncak yang valid akan dekat dengan (tetapi tidak persis) kelipatan bilangan bulat fundamental, sedangkan puncak palsu tidak akan. Anda harus menghindari memilih puncak palsu dan menghindari memilih harmonik ke-3, dll. Yang tidak satu oktaf dari catatan yang Anda cari.
endolith
Dimungkinkan, meskipun mungkin tidak mungkin, karena tidak ada puncak frekuensi berada pada frekuensi nada musik. Beberapa vokal pria dapat mendekati ini, hanya nada tinggi yang tersisa setelah disaring oleh forman vokal.
hotpaw2
Metode Harmonic Product Spectrum mungkin cocok untuk menemukan estimasi penyebut umum terendah terendah pada sekelompok puncak spektral, dengan memposting setelah pengerjaan hasil FFT awal.
hotpaw2