Pengenalan nada cepat

8

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 df=1/T 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:

Perhatikan frekuensi yang ditautkan dari Wikipedia

18446744073709551615
sumber
lukisan yang bagus. mereka harus membalikkannya sehingga simbol clef (dan staf musik) menghadap ke kanan. tetapi kemudian semua frekuensi dan periode dan angka MIDI akan terbalik.
robert bristow-johnson
Ini kedengarannya seperti Anda memerlukan deteksi pitch polifonik daripada deteksi monofonik (yaitu satu not pada satu waktu). Apakah itu benar?
Jazzmaniac
@Jazzmaniac Polyphonic pasti akan menjadi nilai tambah, yaitu, monofonik akan menjadi batasan. Jika saya bisa menggunakan FFT, saya akan menampilkan beberapa puncak pada diagram frekuensi-waktu 2D. Di sisi lain, jika saya mengerti dengan benar, instrumen angin monofonik, dan biola cukup dekat dengan itu.
18446744073709551615
Instrumen angin pasti bekerja dengan algoritma pendeteksian monofonik. Instrumen dawai (dengan lebih dari satu dawai) rumit tetapi, dan sebagian besar jika tidak semua detektor monofonik menghasilkan hasil yang tidak dapat diandalkan atau bahkan tidak dapat digunakan dengan adanya nada yang membusuk dari dawai yang tidak sepenuhnya diredam, dawai yang terbuka beresonansi atau hanya crosstalk dari mikrofon. Yang mengatakan, deteksi polifonik sulit. Namun, karena Anda tidak benar-benar membutuhkan deteksi not yang akurat tetapi hanya deteksi in-tune yang akurat, Anda mungkin akan menemukan algoritma yang cocok. Namun itu bukan detektor pitch monofonik.
Jazzmaniac
Ini mungkin menjelaskan downvote jawaban RBJ, atau seseorang mungkin telah tersinggung dari promosi penjualannya yang agak tidak objektif. Bagaimanapun, jangan langsung naik kapalnya. Ada opsi lain untuk apa yang Anda inginkan, dan kemungkinan besar juga lebih baik.
Jazzmaniac

Jawaban:

9

" 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)

Qx[k]=n|x[n]x[nk]|

Fungsi Perbedaan Kuadrat Rata-rata (ASDF)

Qx[k]=n(x[n]x[nk])2

Fungsi Autokorelasi (AF)

Rx[k]=nx[n]x[nk]

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[nk]. 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:

  1. Anda selalu dapat mengkorelasikan yang terbaru N sampel terhadap beberapa N sampel ditunda oleh k. dengan cara itu Anda berurusan dengan data terbaru yang mungkin ada dalam aplikasi waktu nyata.

  2. Anda tidak perlu menghitung korelasi untuk setiap jeda integer k. sebenarnya, karena Anda suka log-frequency, jarak untuk lebih besark mungkin lebih besar dari jarak untuk yang lebih kecil k.

  3. ketika null potensial (AM_F) atau puncak (AF) ditemukan, Anda dapat menghitung korelasi untuk nilai integer yang berdekatan dari k.

  4. antara nilai integer yang berdekatan k, Anda dapat melakukan interpolasi untuk menentukan lokasi puncak ke presisi sampel fraksional. saya tidak akan memberi tahu Anda caranya. Gunakan imajinasimu.

  5. 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.

robert bristow-johnson
sumber
1
Sebuah komentar tentang down-voting akan dihargai. Jika ada yang salah, saya ingin tahu itu. Jawaban ini tidak memberikan resep, tetapi setidaknya ada daftar apa yang harus dibaca (well, itu tidak terdengar sebagai bacaan yang mudah, tetapi itu adalah sesuatu yang lebih baik daripada tidak sama sekali). Tolong jangan hapus jawaban ini.
18446744073709551615
1
siapa yang akan menghapus jawabannya? saya?
robert bristow-johnson
3

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.

hotpaw2
sumber
dua catatan: jika Anda ingin deteksi pitch Anda menjadi " cepat ", saya tidak akan merekomendasikan melakukannya di domain frekuensi (kecuali jika Anda melakukan hal-hal yang agak multi-tingkat dengan beberapa FFT. Alasan mengapa Anda bahkan tidak dapat mulai menggunakan FFT sampai Anda mendapatkan semua sampel. untuk FFT dengan panjang yang layak (untuk mendapatkan resolusi yang memadai pada nada rendah), Anda sudah menunggu, katakanlah, 0,1 detik. nada (dan kenyaringan) adalah ukuran-ukuran psikoakustik yang kadang-kadang berkorelasi baik dengan sifat-sifat fisik seperti titik (dan kekuatan). untuk lonceng, tom, Anda akan mendapatkan nada, tetapi itu mungkin tidak berarti hal yang benar.
robert bristow-johnson
tetapi saya hanya menjalankan skrip matlab kecil saya pada rekaman hit tom dan terdengar bagi saya bahwa pitch yang dikembalikan akan menjadi nilai nota yang masuk akal.
robert bristow-johnson