Transformasi fourier logaritmik (LFT) pada sinyal audio

9

Saya mencoba menganalisis musik sebaik mungkin. Tentu saja saya mencoba FFT, tetapi ada beberapa masalah.

Saya menemukan frekuensi rendah memiliki resolusi sangat rendah daripada pendengaran manusia. Saya mencoba FFT waktu yang sangat lama untuk menyelesaikan masalah ini, tetapi bahkan menganalisis dengan 8192 sampel / s dalam tingkat sampel 44100Hz (Berarti kurangnya resolusi waktu), saya tidak mendapatkan cukup resolusi pada frekuensi rendah.

Saya menemukan ada beberapa solusi.

Pertama, interpolasi kuadrat pada tempat sampah FFT.
Tapi sepertinya itu bukan cara yang sempurna. Masalah dari metode ini adalah:

1. 'Jika saya ingin menentukan freqs di antara freq bin, mana tiga nampan yang harus saya pilih untuk melakukan interpolasi?'
2. 'Bahkan saya melakukan ini, tidak ada informasi tambahan aktual tentang hasil. Saya tahu interpolasi adalah semacam metode yang rumit. '

Kedua, mengekstraksi setiap tempat sampah freq dengan frekuensi yang diinginkan, jadi saya bisa mengekstrak tempat sampah secara logaritma.
Tetapi memiliki masalah biaya komputasi kritis: (mungkin lebih) N ^ 2.

Ketiga, LFT (Logarithmic Fourier Transform).
Ini meminta sampel yang ditempatkan secara logaritmik dan memberi saya hasil persis apa yang saya cari dengan kecepatan sangat cepat; /programming/1120422/is-there-an-fft-that-uses-a-logarithmic-division-of-frequency

Tapi saya tidak tahu dengan algoritma itu. Saya mencoba memahami makalah dan mengimplementasikannya, tetapi itu tidak mungkin karena kurangnya kemampuan bahasa Inggris dan matematika saya.

Jadi, saya butuh bantuan implementasi LFT.

Laie
sumber

Jawaban:

8

Solusi paling sederhana dan paling pragmatis adalah dengan menggunakan FFT normal dengan ukuran yang cukup besar sehingga Anda mendapatkan resolusi yang diperlukan pada frekuensi bunga terendah. Misalnya, jika Anda menginginkan resolusi 1 Hz pada frekuensi bunga terendah maka Anda akan memerlukan jendela FFT 1 detik, yaitu ukuran FFT harus sama dengan laju sampel, misalnya 44100.

Perhatikan bahwa bahkan jika Anda dapat menerapkan FFT logaritmik maka itu masih akan terikat oleh hukum fisika (teori informasi) dan Anda masih akan memerlukan jendela sampel panjang yang sama - semua yang akan Anda peroleh akan menjadi kenyamanan (tidak harus mengumpulkan tempat keluaran) ) dengan mengorbankan kinerja.

Paul R
sumber
Itu aneh. Saya tahu secara teori tidak ada lagi data. Jika saya menggunakan FFT ukuran besar, memang benar bahwa itu tidak dapat menganalisis alat musik yang sangat cepat. Dan juga benar bahwa saya tidak bisa mendapatkan resolusi yang lebih tinggi pada frekuensi rendah. Tapi bagaimana dengan sistem pendengaran manusia? Bagaimana sistem itu mendapatkan resolusi yang lebih tinggi baik dalam waktu maupun frekuensi?
3
Mungkin Anda harus mempertimbangkan pendekatan hierachis, di mana Anda memusnahkan setiap oktaf berturut-turut dengan faktor 2, sehingga Anda dapat menggunakan jendela waktu pendek pada frekuensi lebih tinggi dan jendela waktu lebih lama pada frekuensi lebih rendah? Ini akan agak analog dengan bank filter pendengaran, di mana bandwidth meningkat seiring frekuensi.
Paul R
Pendekatan yang bagus. Goertzel lama pada frekuensi rendah, goertzel waktu singkat pada frekuensi tinggi? Masuk akal. Tetapi akan membutuhkan biaya komputasi yang besar.
Ini mungkin lebih efisien daripada melakukan satu FFT besar, meskipun lebih kompleks. Misalnya untuk hierarki 4 oktaf Anda mungkin ingin 4 x 2048 titik FFT dan 3 filter low pass untuk x2 pengambilan sampel. Resolusi FFT terendah akan sama baiknya dengan FFT 16384 titik tunggal pada laju sampel penuh, tetapi karena FFT adalah O (n log n) total biaya komputasi akan jauh lebih rendah.
Paul R
aha, FFT 2048, down sample x2, FFT 2048, down sample x2 .... daripada saya punya resolusi waktu dan frekuensi, dengan biaya yang jauh lebih murah daripada 16384 FFT. Bagus. Dan sekarang saya punya solusi lain: pada sampel 16384, goertzel setiap kali oleh 32. Jadi, dengan akumulasi, saya dapat mengekstraksi frekuensi rendah dan tinggi dengan biaya lebih rendah. Terima kasih banyak. :)
0

Jika analisis yang ingin Anda lakukan memerlukan frekuensi sinyal di setiap nampan, Anda dapat menggunakan Short Time Fourier Transform untuk mencapai ini.

Setiap bin dari FFT menghasilkan bilangan kompleks yang mewakili komponen nyata dan imajiner - atau setelah sedikit fase manipulasi dan besarnya.

Sebagai frekuensi = dPhi / dt, (Phi == fase), dengan mengambil tempat sampah yang sesuai dari pasangan spektrum STFT berturut-turut, Anda dapat menghitung frekuensi.

Dimensi DSP memiliki artikel yang bagus tentang proses tersebut.

Marko
sumber
Sepertinya saya sedang merenungkan masalah yang lebih rumit. Saya dapat menggunakan FFT, tetapi pada analisis sinyal audio, itu tidak cocok.
3
Lihatlah versi "Q konstan" dari Short Time Fourier Transform. Susunan STFT ini menyediakan resolusi frekuensi yang menyesuaikan secara logaritmik untuk mengakomodasi kebutuhan rentang frekuensi yang berbeda.
user2718
Saya akan memeriksanya. Saya pikir itu hanya operasi filter-bank sederhana yang diterapkan pada hasil fft.
Laie