Saya perlu mendeteksi nada (mengukur frekuensi sinyal) saat para musisi memutar musik, memberikan peringatan jika mereka tidak selaras, tetapi musik kebetulan terlalu cepat untuk FFT (Fast Fourier Transform).
Di bawah ini saya mencoba memberikan deskripsi teknis tentang masalah tersebut.
Musisi memutar musik pada 90-140 bpm. Ini berarti bahwa ada 90-140 kelompok catatan setiap menit, hingga 8 (lebih sering, hingga 4) catatan dalam setiap kelompok (60/140/8 = 0,0536 dtk, 60/90/4 = 0,167 dtk), yang adalah, catatan dapat berubah pada tingkat 6-19 catatan per detik.
Musik menggunakan skala logaritmik (lihat gambar terlampir): rentang antara, katakanlah, 440Hz dan 880Hz dibagi menjadi 12 catatan, hanya 7 yang digunakan untuk melodi. (Pada dasarnya, mereka hanya menggunakan tombol putih pada piano; ketika mereka ingin menggeser frekuensi awal, mereka menggunakan beberapa tombol hitam dan tidak menggunakan beberapa tombol putih.) Artinya, frekuensi setiap nada selanjutnya dikalikan dengan 2 ^ (1/12) = 1.05946.
Untuk membuat segalanya lebih rumit, frekuensi A (La) dapat bervariasi dari 438 hingga 446 Hz. Instrumen dawai secara teori dapat disetel, sedangkan instrumen angin bergantung pada suhu dan kelembaban udara, sehingga frekuensi kebetulan dinegosiasikan kembali oleh para musisi selama pemeriksaan suara.
Kadang-kadang musisi dan vokalis membuat kesalahan dalam frekuensi, mereka menyebutnya "tidak selaras". Mereka menginginkan perangkat yang akan memberitahu mereka tentang "kesalahan tidak selaras". Mereka memiliki tuner, tetapi tuner membutuhkan memainkan suara yang sama selama sekitar 1 detik sebelum mereka mulai menunjukkan apa pun. Ini berfungsi untuk penyetelan, tetapi tidak berfungsi saat musik dimainkan.
Kemungkinan besar, tuner melakukan FFT, dan karena formula menunggu 1 detik untuk mendapatkan resolusi 1Hz.
Untuk A = 440Hz, perbedaan frekuensi antara dua not adalah 440 * 0,05946 = 26,16 Hz, untuk mendapatkan resolusi frekuensi itu, kita harus menggunakan waktu akuisisi 0,038 detik, yaitu, pada tempo = 196bpm FFT hanya dapat membedakan dua Catatan, pada 98 bpm ia mampu mengatakan kesalahan out-of-tune 50% asalkan mulai akuisisi pada saat pitch berubah. Jika kami membiarkan perubahan pitch selama periode akuisisi, kami mendapatkan 49 bpm, yang terlalu lambat. Selain itu, sangat diinginkan untuk lebih tepat tentang frekuensi, katakanlah, mendeteksi kesalahan out-of-tune 25% atau 12%.
Apakah ada cara untuk mengukur frekuensi (deteksi nada) lebih baik daripada FFT, yaitu, dengan resolusi yang lebih baik dalam waktu akuisisi yang lebih sedikit? (Setidaknya 2 kali lebih baik, idealnya, 8-16 kali lebih baik.) Sebagai gantinya, saya tidak perlu membedakan antara not oktaf yang berbeda, misalnya 440 dan 880 dapat dikenali sebagai A. Saya tidak memerlukan linearitas FFT output, skala logaritmik akan lebih baik. (Mungkin, lebih banyak trade-off yang mungkin, hanya tidak ada yang terlintas di pikiran saya saat ini.)
Ini gambar yang sangat bagus:
sumber
Jawaban:
" Apakah ada cara untuk mengukur frekuensi (mendeteksi nada) lebih baik daripada FFT, yaitu dengan resolusi yang lebih baik dalam waktu akuisisi yang lebih sedikit? "
ya ada. atau sedang. ada beberapa cara yang lebih baik untuk melakukan deteksi pitch musikal secara real time yang jauh, jauh lebih baik daripada menjalankan FFT.
pertimbangkan :
Fungsi Perbedaan Magnitude Rata-rata (AMDF)
Fungsi Perbedaan Kuadrat Rata-rata (ASDF)
Fungsi Autokorelasi (AF)
perhatikan bahwa saya bermain cepat dan longgar dengan batas penjumlahan.
perhatikan juga tidak ada asumsi tentang bentuk gelombang atau zero-crossing atau threshold crossing lainnya. satu-satunya asumsi adalah ketika lagk kira-kira suatu periode (atau dua periode atau beberapa bilangan bulat lainnya dari panjang periode), x [ n ] sangat mirip x [ n - k ] . jadi satu-satunya asumsi adalah pitch yang terkait dengan frekuensi dasar dari fungsi periodik atau hampir periodik (apa yang saya suka menyebutnya "quasi-periodic").
favorit saya adalah ASDF (dan itu adalah rahasia dagang terselubung yang baru saja saya umumkan kepada semua orang, tetapi orang-orang di comp.dsp sudah tahu itu). ini semua adalah domain waktu, AMDF dan ASDF terlihat sangat mirip dan ASDF terlihat seperti versi AF yang terbalik. Anda mencari nulls dalam AMDF atau ASDF atau puncak AF yang akan sesuai dengan panjang periode potensial dari input kuasi-periodik.
berikut adalah beberapa trik lainnya:
Anda selalu dapat mengkorelasikan yang terbaruN sampel terhadap beberapa N sampel ditunda oleh k . dengan cara itu Anda berurusan dengan data terbaru yang mungkin ada dalam aplikasi waktu nyata.
Anda tidak perlu menghitung korelasi untuk setiap jeda integerk . sebenarnya, karena Anda suka log-frequency, jarak untuk lebih besark mungkin lebih besar dari jarak untuk yang lebih kecil k .
ketika null potensial (AM_F) atau puncak (AF) ditemukan, Anda dapat menghitung korelasi untuk nilai integer yang berdekatan darik .
antara nilai integer yang berdekatank , Anda dapat melakukan interpolasi untuk menentukan lokasi puncak ke presisi sampel fraksional. saya tidak akan memberi tahu Anda caranya. Gunakan imajinasimu.
seluruh trik (dan ini adalah saus rahasia di mana rahasia dagang dan paten IVL berlaku) adalah untuk memilih puncak yang benar atau nol ketika ada banyak kandidat. memilih puncak yang salah atau nol akan menghasilkan "kesalahan oktaf". Aku tidak akan memberitahumu bagaimana melakukan itu. Gunakan imajinasimu.
kirimi saya email dan kami bisa mendiskusikan persyaratan kontrak jika Anda ingin saya mendesain detektor pitch kick-ass. jauh lebih baik daripada YIN, yang, menurut saya, bekerja seperti sampah.
sumber
Saya sudah menjawab pertanyaan Anda di sini: /programming/33667275/fast-frequency-measurement/33678202#33678202
Namun, secara ringkas, dalam keadaan tertentu, Anda dapat menginterpolasi hasil FFT ke resolusi yang lebih baik dari jarak bin FFT, sehingga memungkinkan Anda menggunakan jendela data yang lebih pendek untuk resolusi waktu yang lebih baik.
Tetapi frekuensi FFT bukan frekuensi nada. Dan untuk beberapa instrumen musik (yang menghasilkan sedikit nada inharmonik), tidak ada fungsi auto-korelasi (atau kerabatnya seperti AMDF). Itu karena nada adalah fenomena psikoakustik.
sumber