Saya mencoba membuat program deteksi pitch yang mengekstraksi frekuensi puncak dalam spektrum daya yang diperoleh dari FFT ( fftpack
). Saya mengekstraksi frekuensi puncak dari spektrum saya menggunakan Penaksir Pertama Quinn untuk menginterpolasi antara nomor bin. Skema ini tampaknya bekerja dengan baik dalam kondisi tertentu. Misalnya, menggunakan fungsi jendela persegi panjang dengan ukuran jendela 1024 dan laju sampel 16000, algoritma saya dengan benar mengidentifikasi frekuensi nada A440 murnisebagai 440,06 dengan frekuensi parsial kedua 880,1. Namun, dalam kondisi lain, itu menghasilkan hasil yang tidak akurat. Jika saya mengubah laju sampel (misalnya menjadi 8000) atau ukuran jendela (misalnya menjadi 2048), ia masih mengidentifikasi dengan benar parsial pertama sebagai 440, tetapi parsial kedua ada di sekitar 892. Masalahnya menjadi lebih buruk untuk nada inharmonik seperti yang diproduksi oleh gitar atau piano.
Pertanyaan umum saya adalah: Dengan cara apa laju sampel, ukuran jendela, dan fungsi jendela memengaruhi estimasi frekuensi puncak FFT? Asumsi saya adalah bahwa hanya meningkatkan resolusi spektrum akan meningkatkan akurasi estimasi frekuensi puncak, tetapi ini jelas bukan pengalaman saya (zero padding juga tidak membantu). Saya juga berasumsi bahwa pilihan fungsi jendela tidak akan banyak berpengaruh karena kebocoran spektral seharusnya tidak mengubah lokasi puncak (meskipun, sekarang saya berpikir tentang hal itu, kebocoran spektral berpotensi mempengaruhi perkiraan frekuensi yang diinterpolasi jika besarnya tempat sampah yang berdekatan dengan puncak secara artifisial ditingkatkan oleh kebocoran dari puncak lainnya ...).
Adakah pikiran?
Pertama, estimasi frekuensi puncak dan estimasi pitch adalah dua hal yang berbeda. Pitch adalah fenomena psiko-akustik. Orang dapat mendengar nada bahkan dengan frekuensi dasar benar-benar hilang, atau relatif lemah dibandingkan dengan kebanyakan puncak lainnya, seperti pada nada rendah yang dihasilkan oleh beberapa instrumen.
Kedua, tidak menggunakan jendela pada FFT sama dengan menggunakan jendela persegi panjang, yang menggabungkan spektrum Anda dengan fungsi Sinc. Fungsi Sinc memiliki banyak punuk yang tersebar jauh dari puncak yang akan muncul untuk semua frekuensi yang tidak persis periodik dalam panjang FFT (juga dikenal sebagai "kebocoran spektral"). Semua kebocoran energi ini dari satu frekuensi yang kuat akan mengganggu estimasi posisi puncak frekuensi lainnya. Jadi fungsi jendela yang lebih cocok (Hamming atau von Hann) dapat membantu mengurangi gangguan antar puncak.
FFT yang lebih lama akan mengurangi frekuensi delta antara pusat-pusat bin, yang harus meningkatkan interpolasi dan dengan demikian akurasi estimasi frekuensi untuk spektrum stasioner. Namun jika FFT terlalu panjang sehingga spektrum berubah di dalam jendela FFT, semua frekuensi yang diubah itu akan dikaburkan dalam FFT yang lebih panjang.
sumber
Anda pasti memerlukan fungsi jendela yang sesuai - efek kebocoran spektral sangat bervariasi tergantung pada bagaimana periode pitch dan panjang jendela FFT terkait - jika Anda mendapatkan transien besar antara sampel terakhir dan pertama dari jendela FFT maka ini akan menghasilkan sangat buruk mengolesi spektrum, sedangkan jika Anda beruntung dan diskontinuitas ini kecil maka spektrum yang dihasilkan akan jauh lebih bersih. Ini mungkin mengapa Anda melihat inkonsistensi ketika Anda mengubah salah satu parameter Anda seperti ukuran FFT. Dengan fungsi jendela yang sesuai, Anda akan mendapatkan spektrum yang konsisten saat nada berubah.
sumber