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.