Silakan anggap sebagai berikut:
- Frekuensi fundamental sinyal telah diperkirakan menggunakan FFT dan beberapa metode estimasi frekuensi dan terletak di antara dua pusat bin
- Frekuensi pengambilan sampel ditetapkan
- Upaya komputasi tidak menjadi masalah
Mengetahui frekuensi, apa cara paling akurat untuk memperkirakan nilai puncak sinyal fundamental yang sesuai?
Salah satu cara mungkin dengan mem-pad sinyal waktu untuk meningkatkan resolusi FFT sehingga pusat bin akan lebih dekat ke frekuensi yang diperkirakan. Dalam skenario ini, satu hal yang saya tidak yakin tentang adalah apakah saya dapat nol-pad sebanyak yang saya inginkan atau jika ada beberapa kelemahan dalam melakukannya. Yang lain adalah tempat bin center yang harus saya pilih setelah zero padding sebagai yang saya dapatkan nilai puncaknya (karena orang mungkin tidak mengenai frekuensi yang diinginkan, bahkan setelah zero padding).
Namun, saya juga bertanya-tanya apakah ada metode lain yang dapat memberikan hasil yang lebih baik, yaitu penduga yang menggunakan nilai puncak dari dua pusat bin di sekitarnya untuk memperkirakan nilai puncak pada frekuensi yang diinginkan.
imax
puncak FFT) akan memberikan Anda hasil yang akuratJawaban:
Algoritma pertama yang muncul dalam pikiran adalah Algoritma Goertzel . Algoritma itu biasanya mengasumsikan bahwa frekuensi yang menarik adalah kelipatan bilangan bulat dari frekuensi dasar. Namun, makalah ini menerapkan algoritma (umum) untuk kasus yang Anda minati.
Masalah lain adalah bahwa model sinyal tidak benar. Itu menggunakan
2*%pi*(1:siglen)*(Fc/siglen)
. Itu harus digunakan2*%pi*(0:siglen-1)*(Fc/siglen)
untuk fase untuk keluar dengan benar.Saya juga berpikir ada masalah dengan frekuensinya
Fc=21.3
sangat rendah. Sinyal bernilai real frekuensi rendah cenderung menunjukkan bias ketika datang ke masalah estimasi fase / frekuensi.Saya juga mencoba pencarian grid kasar untuk estimasi fase, dan memberikan jawaban yang sama dengan algoritma Goertzel.
Di bawah ini adalah plot yang menunjukkan bias pada kedua taksiran (Goertzel: biru, Kasar: merah) untuk dua frekuensi berbeda:
Fc=21.3
(padat) danFc=210.3
(putus-putus). Seperti yang Anda lihat bias untuk frekuensi yang lebih tinggi jauh lebih sedikit.sumber
Jika Anda bersedia menggunakan beberapa nampan FFT yang bersebelahan, bukan hanya 2, maka interpolasi Sinc berjendela antara hasil nampan kompleks dapat menghasilkan perkiraan yang sangat akurat, tergantung pada lebar jendela.
Interpolasi Windowed Sinc umumnya ditemukan dalam upampler audio berkualitas tinggi, sehingga makalah tentang subjek tersebut akan memiliki formula interpolasi yang sesuai dengan analisis kesalahan.
sumber
[1] JL Flanagan dan RM Golden, "Phase vocoder," Bell Systems Technical Journal, vol. 45, hlm. 1493–1509, 1966.
[2] K. Dressler, "Ekstraksi sinusoid menggunakan implementasi FFT multi-resolusi yang efisien," di Proc. Int 9. Conf. tentang Efek Audio Digital (DAFx-06), Montreal, Kanada, September 2006, hlm. 247–252.
sumber
Salah satu metode adalah menemukan maksimum dan sesuai parabola tentang hal itu, dan kemudian menggunakan maksimum parabola sebagai perkiraan frekuensi dan besarnya. Anda dapat membaca semua tentang di sini: https://ccrma.stanford.edu/~jos/sasp/Sinusoidal_Peak_Interpolation.html
sumber
Saya memiliki banyak kesulitan dengan masalah yang tepat ini beberapa tahun yang lalu.
Saya memposting pertanyaan ini:
/programming/4633203/extracting-precise-frequencies-from-fft-bins-using-phase-change-between-frame
Saya akhirnya melakukan perhitungan dari awal, dan memposting jawaban untuk pertanyaan saya sendiri.
Saya terkejut bahwa saya tidak dapat menemukan penjelasan serupa di Internet.
Saya akan mengirim jawabannya lagi di sini; perhatikan bahwa kode ini dirancang untuk skenario di mana saya tumpang tindih jendela FFT saya dengan 4x.
π
Teka-teki ini membutuhkan dua kunci untuk membukanya.
Kunci pertama adalah untuk memahami bagaimana tumpang tindih jendela FFT memperkenalkan rotasi pada fase bin.
Kunci kedua berasal dari Grafik 3.3 & 3.4 di sini (terima kasih kepada Stephan Bernsee untuk izin untuk menyalin foto di sini).
Grafik 3.3:
Grafik 3.4:
Kode:
sumber
Kode python ini akan memberikan Anda hasil yang sangat akurat (saya menggunakannya untuk banyak not musik dan mendapatkan kesalahan semitone kurang dari 0,01%) dengan interpolasi parabola (metode yang berhasil digunakan oleh McAulay Quatieri, Serra, dll. Dalam harmonik + residual teknik pemisahan)
sumber
Frekuensi yang Anda hadapi (21,3Hz sampel pada 8kHz) sangat rendah. Karena ini adalah sinyal bernilai nyata, mereka akan menunjukkan bias dalam estimasi fase untuk ** frekuensi ** apa pun.
Gambar ini menunjukkan plot bias (
phase_est - phase_orig
) untukFc = 210.3;
(berwarna merah) versus bias untukFc = 21.3;
. Seperti yang Anda lihat, offset jauh lebih penting untuk21.3
kasing.Pilihan lain adalah mengurangi laju sampling Anda. Kurva hijau menunjukkan bias untuk
Fs = 800
bukan8000
.sumber
goertzel = atan(imag(y(2)),real(y(2)))*180/%pi + 90;
. :-) Akan menggali lebih banyak. Perhatikan ruang ini.p
denganp2 = (abs(y(3)) - abs(y(1)))/(2*(2*abs(y(2)) - abs(y(3)) - abs(y(1)))); phase2 = y0 - 0.25*(ym1-yp1)*p2;
maka Anda mendapatkan jawaban yang JAUH lebih baik --- bahkan untukFc=210
. Saya sama sekali tidak yakin bahwa versi saat inip
akan memberi Anda sesuatu yang masuk akal. Rumus interpolasi adalah untuk interpolasi AMPLITUDE dari parabola, tetapip
interpolasi fase yang hanya ... aneh.p = (yp1 - ym1)/(2*(2*y0 - yp1 - ym1))
) akan salah beberapa waktu jika Anda menggunakan FASE bukan amplitudo. Ini karena fase mungkin melompati batas +/- 180 derajat. Semua yang diperlukan untuk memperbaikinya untuk fase adalah mengubah garis itu kep2
perhitungan saya di atas.