Saya sedang mengerjakan program penyetelan piano dan sebagian darinya membutuhkan deteksi nada waktu-nyata. Berikut adalah skema yang saya miliki sejauh ini yang bekerja sampai batas tertentu tetapi mungkin bisa menggunakan beberapa penyempurnaan.
Saya merekam audio PCM mono, 44.1kHz, 16-bit dalam potongan 2 ^ 14 sampel. Saya menggabungkan 4 sampel terakhir ke dalam buffer 2 ^ 16 panjang, menerapkan jendela Hann ke buffer dan menjalankan FFT di atasnya. Lalu, saya menimbun hasil FFT dalam dua resolusi. Pertama, saya menimbun menjadi 200 ember dan kemudian menjalankan algoritma deteksi pitch HPS di rincian ini. Saya tidak perlu mendapatkan frekuensi yang tepat di sini, saya hanya ingin dekat. Lalu, saya menautkan ke 12000 bucket yang memberi saya resolusi 1 sen dari 10Hz ke 10kHz. Setelah saya tahu perkiraan frekuensi dari algoritma HPS 200 bin, saya mencari rentang case 12000 bin untuk mencari puncak untuk mendapatkan frekuensi yang lebih tepat.
Ini sepertinya berfungsi baik untuk not di tengah keyboard. Apa yang terjadi dengan not rendah adalah sekitar 1,5 detik identifikasi salah not sebagai biasanya parsial ke-2 atau ke-3 dari not asli dan kemudian identifikasi yang benar dari not tersebut.
Di semua plot spektral yang saya buat untuk melihat apa yang terjadi, ada lebih banyak lebar ke puncak yang saya harapkan. Lebar ini secara visual agak konsisten dari 200 nampan hingga 12000 nampan. Saya akan mengharapkan puncaknya menjadi lebih sempit dalam case 200 bin.
Jadi, pemrosesan sinyal adalah hal baru bagi saya sehingga mungkin ada hal-hal yang merupakan masalah yang saya tidak akan pikirkan untuk ditanyakan tetapi dalam hal pertanyaan spesifik, apakah ukuran sampel cukup untuk tugas ini? Apakah Hann pilihan jendela yang tepat? Haruskah saya memuluskan data juga sebelum FFT? Seberapa sensitifkah HPS terhadap jumlah sampah? Saya berpikir bahwa jika saya menggunakan banyak sampah maka ketidakharmonisan mungkin tidak membuat sebagian tumpang tindih dengan fundamental mereka dengan pendekatan sederhana algoritma HPS untuk membagi dengan 2, 3, 4, dll.
Jawaban:
Mirip dengan utas ini:
Apakah ada algoritma untuk mencari frekuensi tanpa DFT atau FFT?
FFT bukanlah cara efisien untuk membangun tuner. Metode yang lebih baik (dan lebih murah) termasuk korelasi-otomatis, loop terkunci bertahap dan loop loop tertunda, dll.
Salah satu contoh adalah dengan menggunakan pelacakan maxima dan minima lokal untuk mengasah sekitar pada frekuensi dasar dan kemudian menggunakan osilator lokal dan loop terkunci fase untuk melacak frekuensi ini dengan tepat. Ini dapat melacak fundamental bergerak selama penyetelan dengan cepat, terus-menerus, dan dengan akurasi tinggi bahkan jika frekuensinya rendah dan jika fundamentalnya lemah.
sumber
Pencarian untuk 'perangkat lunak penyetelan piano' atau item serupa akan menghasilkan banyak hit - beberapa bagus, beberapa tidak begitu baik.
Setiap jenis alat musik memiliki karakteristik akustik / fisik / lingkungan yang unik yang memengaruhi suaranya. Dan itu bisa menjadi rumit, seperti yang disarankan oleh ribuan buku dan penelitian (misalnya: nada suara, karakteristik serangan / peluruhan, inharmonisitas, dll.).
Deteksi pitch sendiri merupakan bidang yang luas jangkauannya. Berikut ini hanyalah sebagian kecil dari apa yang tersedia: ikhtisar artikel 1 dan tumpukan pos pertukaran dan ikhtisar artikel 2
Adapun pertanyaan spesifik Anda: 1) ukuran sampel Anda tampak seperti berlebihan - tergantung pada SNR dan stabilitas bentuk gelombang, Anda bisa mendapatkan akurasi frekuensi tinggi menggunakan metode lain menggunakan lebih sedikit siklus. (beberapa metode berbasis FFT). Dan Anda mungkin menangkap serangan / pembusukan dengan waktu sampel yang panjang, 2) jendela apa pun selain persegi panjang akan memperluas lebar balok di domain frekuensi, tetapi itu tidak berarti Anda tidak boleh menggunakannya - Hann tampaknya sama dengan HPS , dari apa yang saya lihat, 3) seperti disebutkan dalam tautan pertama di atas, HPS tidak berfungsi dengan baik pada frekuensi rendah, dan ketidakarmonisan akan memengaruhi Anda pada string yang lebih rendah. Adapun metode keseluruhan Anda, tanpa harus menulis banyak halaman, saya hanya bisa mengatakan bahwa saya akan melakukannya secara berbeda, tergantung pada rentang frekuensi dan harmonik yang saya hadapi.
sumber
Jawaban lain menyarankan PLL. Saya pikir Anda harus menjauh dari PLL: kebanyakan literatur tentang pelacakan pitch berfokus pada korelasi-otomatis (mencari "YIN Pitch Tracking" - YIN adalah algoritma pelacakan pitch modern berdasarkan korelasi-otomatis) dan FFT. Saya percaya PLL lebih cocok untuk melacak fluktuasi kecil dalam frekuensi, seperti dengan radio.
Korelasi otomatis adalah tempat yang baik untuk memulai. Cepat, efisien, dan akurat. Namun, ada trik untuk membuat FFT sangat akurat dan cepat (sebagian besar teknik yang menggunakan FFT hanya melihat besarnya, tetapi Anda juga dapat menggunakan informasi fase), jadi jika Anda terbiasa dengan FFT Anda dapat menggunakan teknik itu juga.
Jika Anda menggunakan salah satu dari teknik ini, saya sarankan prefiltering dengan lowpass untuk mengurangi harmonik dan fokus pada yang mendasar. Dengan FFT, Anda bisa, sebaliknya, atau sebagai tambahan, menggunakan trik seperti melihat maksimum lokal pertama.
Ini mungkin merupakan titik awal yang baik untuk memfilter dan sebagainya. Ini juga akan memberi Anda beberapa tips tentang menghindari melakukan terlalu banyak pekerjaan, dan tautan ke kode sumber: http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html
Buku ini memiliki bagian yang menjelaskan YIN dan FFT menggunakan informasi fase: http://www.amazon.com/DAFX-Digital-Udo-ouml-lzer/dp/0470665998
Akhirnya, Anda harus memahami spesifikasi piano. Saya tidak yakin apakah tuner itu sendiri perlu melakukan sesuatu WRT khusus, misalnya, tala panjang, atau jika itu diserahkan kepada orang yang menyetel piano, tetapi Anda setidaknya harus memahami hal-hal itu. Poster lain menyarankan melihat harmonik yang tidak selaras, tetapi masalah utamanya adalah mengidentifikasi dan menyelaraskan fundamental, sehingga harmonik yang tidak selaras seharusnya tidak menjadi masalah selama Anda mengidentifikasi fundamental dengan tepat.
sumber
Puncak lebar yang Anda lihat mungkin merupakan hasil dari fenomena fisik, bukan artefak pemrosesan sinyal. Secara umum, puncak sempit dalam hasil FFT mewakili sinusoid yang tidak dimodifikasi persis periodik di jendela dalam domain waktu. Tapi getaran senar piano tidak stasioner itu. Mereka berkembang dari waktu ke waktu, menciptakan modulasi yang nyata.
Beberapa efek: beberapa string piano per not akan bertukar energi melalui papan suara; energi getaran total akan membusuk seiring waktu; mode getaran mungkin sedikit tidak harmonis untuk memulai; frekuensi getaran yang tepat dari masing-masing mode (harmonik) dapat berubah dengan peluruhan dalam amplitudo karena kekakuan dan diameter tali bukan-nol; dan setiap harmonik dapat meluruh pada tingkat yang berbeda, dll.
Anda mungkin harus memutuskan mana dari beberapa modulasi ini yang ingin Anda sebut "pitch" (buku tentang audiologi dapat membantu), dan menemukan metode untuk melacaknya dengan lebih baik di dalam "puncak lebar" FFT.
sumber
Dengan nada piano yang lebih rendah, terutama untuk uprights, spektrum cenderung memanjang (jarak antara nada dasar dan nada pertama sedikit lebih dari satu oktaf, dll). Inilah yang memberi piano suara perkusi mereka, nada terendah pada uprights yang lebih tua sering terdengar lebih seperti gedebuk daripada not, dan seperti yang saya pahami inilah sebabnya ciak uprights memiliki suara honk tonk perkusi khusus mereka. Karena piano tuner yang baik ini (orang-orang yang bukan algoritma) akan menyetel piano dengan nada rendah daripada nada dasar untuk nada rendah, telinga manusia cenderung fokus pada interaksi nada rendah untuk nada ini. Peregangan seri harmonik juga bisa menjadi penyebab puncak spektrum yang lebih luas dari yang diharapkan.
sumber