Saya sedang mengerjakan aplikasi web sederhana yang memungkinkan pengguna menyetel gitarnya. Saya seorang pemula yang nyata dalam pemrosesan sinyal, jadi jangan menilai terlalu keras jika pertanyaan saya tidak tepat.
Jadi, saya berhasil mendapatkan frekuensi dasar menggunakan algoritma FFT dan pada titik ini aplikasinya berfungsi. Namun, ada ruang untuk perbaikan, saat ini saya mengirim pcm mentah ke algoritma FFT, tetapi saya berpikir bahwa mungkin ada beberapa algoritma / filter pra / pasca yang dapat meningkatkan deteksi. Bisakah Anda menyarankan?
Masalah utama saya adalah ketika mendeteksi frekuensi tertentu itu menunjukkan frekuensi itu untuk 1-2sec dan kemudian melompat ke frekuensi acak lainnya dan kembali lagi dan seterusnya, bahkan jika suara terus menerus.
Saya juga tertarik pada jenis optimasi lainnya jika seseorang memiliki pengalaman dengan hal-hal seperti itu.
sumber
Lapangan tidak sama dengan nampan frekuensi magnitudo puncak dari FFT. Pitch adalah fenomena psiko-akustik manusia. Suara pitch dapat memiliki fundamental yang hilang atau sangat lemah (umum dalam beberapa suara, piano dan suara gitar) dan / atau banyak nada kuat dalam spektrumnya yang melebihi frekuensi nada (tetapi masih terdengar sebagai nada nada yang dicatat oleh manusia) . Jadi setiap detektor frekuensi puncak FFT (bahkan termasuk beberapa windowing dan interpolasi) tidak akan menjadi metode estimasi pitch yang kuat.
Pertanyaan stackoverflow ini mencakup daftar beberapa metode alternatif untuk memperkirakan pitch yang mungkin menghasilkan hasil yang lebih baik.
TAMBAH: Jika Anda melakukan ini untuk suara gitar, perhatikan bahwa senar gitar terendah sebenarnya dapat menghasilkan nada sedikit inharmonik, membuat estimasi nada lebih sulit, karena telinga manusia mungkin mendengar frekuensi nada yang lebih dekat terkait dengan sub-kelipatan nada , daripada frekuensi getaran fundamental aktual dari string.
TAMBAH # 2: Ini sering ditanyakan sehingga saya menulis posting blog yang lebih panjang pada topik: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-ff-fft-frequency.html
sumber
Saya menghabiskan bertahun-tahun meneliti pendeteksian nada pada musik polifonik - seperti mendeteksi nada-nada dari solo gitar dalam rekaman mp3. Saya juga menulis bagian di Wikipedia yang memberikan uraian singkat tentang prosesnya (lihat subbagian "Pendeteksian Pitch" di tautan di bawah).
Ketika satu tombol ditekan pada piano, apa yang kita dengar bukan hanya satu frekuensi getaran suara, tetapi gabungan dari beberapa getaran suara yang terjadi pada frekuensi yang berhubungan secara matematis berbeda. Unsur-unsur komposit getaran ini pada frekuensi yang berbeda disebut sebagai harmonik atau parsial. Misalnya, jika kita menekan tombol C Tengah pada piano, frekuensi individual harmonik komposit akan mulai pada 261,6 Hz sebagai frekuensi dasar, 523 Hz akan menjadi Harmonik ke-2, 785 Hz akan menjadi Harmonik ke-3, 1046 Hz akan menjadi Harmonika ke-4, dll. Harmonisa selanjutnya adalah kelipatan bilangan bulat dari frekuensi dasar, 261,6 Hz (mis: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).
Saya menggunakan DFT Logarithmic Transform yang dimodifikasi untuk pertama-tama mendeteksi kemungkinan harmonisa dengan mencari frekuensi dengan level puncak (lihat diagram di bawah). Karena cara saya mengumpulkan data untuk Log DFT saya yang dimodifikasi, saya TIDAK harus menerapkan Fungsi Windowing ke sinyal, juga tidak menambah dan tumpang tindih . Dan saya telah membuat DFT sehingga saluran frekuensinya terletak secara logaritma untuk menyelaraskan langsung dengan frekuensi di mana harmonik dibuat oleh not pada gitar, saksofon, dll.
Sekarang sedang pensiun, saya telah memutuskan untuk merilis kode sumber untuk mesin deteksi pitch saya dalam aplikasi demonstrasi gratis yang disebut PitchScope Player . PitchScope Player tersedia di web, dan Anda bisa mengunduh executable untuk Windows untuk melihat algoritme saya bekerja pada file mp3 yang Anda pilih. Tautan di bawah ini ke GitHub.com akan mengarahkan Anda ke kode sumber lengkap saya di mana Anda dapat melihat bagaimana saya mendeteksi harmonik dengan transformasi DFT Logarithmic kustom, dan kemudian mencari parsial (harmonik) yang frekuensinya memenuhi hubungan bilangan bulat yang benar yang mendefinisikan ' nada'.
Algoritma Deteksi Pitch Saya sebenarnya adalah proses dua tahap: a) Pertama ScalePitch terdeteksi ('ScalePitch' memiliki 12 nilai nada yang mungkin: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) dan setelah ScalePitch ditentukan, maka Oktaf dihitung dengan memeriksa semua harmonik untuk 4 kemungkinan catatan Oktaf-Calon. Algoritma ini dirancang untuk mendeteksi nada paling dominan (not musik) pada waktu tertentu dalam file MP3 polifonik. Itu biasanya sesuai dengan catatan solo instrumental. Mereka yang tertarik dengan kode sumber C ++ untuk algoritma 2 Stage Pitch Detection saya mungkin ingin memulai pada fungsi Estimate_ScalePitch () dalam file SPitchCalc.cpp di GitHub.com.
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
Di bawah ini adalah gambar DFT Logaritmik (dibuat oleh perangkat lunak C ++ saya) selama 3 detik dari solo gitar pada rekaman mp3 polifonik. Ini menunjukkan bagaimana harmonik muncul untuk not individu pada gitar, saat bermain solo. Untuk setiap catatan pada DFT Logaritmik ini kita dapat melihat beberapa harmoniknya memanjang secara vertikal, karena masing-masing harmonik memiliki lebar waktu yang sama. Setelah oktaf nota ditentukan, maka kita mengetahui frekuensi Fundamental.
Diagram di bawah ini menunjukkan algoritme Deteksi Oktaf yang saya kembangkan untuk memilih nada Oktaf-Calon yang benar (yaitu, Fundamental yang benar), setelah ScalePitch untuk catatan tersebut telah ditentukan. Mereka yang ingin melihat metode dalam C ++ harus pergi ke fungsi Calc_Best_Octave_Candidate () di dalam file yang disebut FundCandidCalcer.cpp, yang terkandung dalam kode sumber saya di GitHub.
sumber