Bagaimana cara membuat plot frekuensi vs waktu?

9

Saya seorang insinyur kimia, bukan EE, jadi ini agak sulit.

Saya mencoba mencari cara untuk mengambil data amplitudo vs waktu dan mengubahnya menjadi frekuensi vs waktu. Insting pertama saya adalah mengiris data saya menjadi potongan-potongan, melakukan FFT pada setiap potongan, dan kemudian memplotnya. Sayangnya, karena durasi waktu setiap irisan mendekati nol, tidak ada lagi informasi yang cukup untuk mendapatkan informasi frekuensi yang akurat (frekuensi rendah memerlukan lebih dari irisan waktu yang sangat kecil). Jadi ... bagaimana saya melakukan ini? Saya yakin ini adalah semacam masalah terkenal yang sudah dipecahkan seseorang.

Inilah jenis transformasi yang saya cari, diilustrasikan dengan gelombang suara (piano note G). Seperti yang Anda lihat, grafik ini sebagai tiga sumbu, dengan yang ketiga diwakili oleh warna.

Terima kasih!

masukkan deskripsi gambar di sini

Nick
sumber

Jawaban:

5

Resolusi waktu vs frekuensi adalah masalah yang terkenal, dan memang ada pendekatan untuk mengatasinya. Untuk sinyal audio, beberapa teknik yang umum digunakan meliputi: metode parametrik; resolusi adaptif (analisis dengan berbagai konfigurasi waktu / frekuensi dan tambal hasilnya bersama-sama - Wen X. dan M. Sandler, "spektrogram komposit menggunakan multiple fourier transforms"); wavelet / dekomposisi pada basis yang terlalu lengkap; dan penggunaan informasi fase untuk mengekstrak lokasi tepat puncak frekuensi (IFgram).

Namun, tampaknya grafik yang Anda tunjukkan tidak menggunakan beberapa teknik ini; jadi saya curiga ini bukan yang mungkin Anda cari. Tampaknya ada beberapa "noda" pada sumbu horizontal (misalnya pada t = 1.2s) dan ini merupakan tanda pasti bahwa analisis telah dilakukan dengan tumpang tindih yang tinggi di antara potongan.

Memang, durasi chunk dan jumlah frame analisis per detik tidak harus dihubungkan satu sama lain jika Anda membiarkan frame tumpang tindih. Jadi jika Anda ingin menggunakan kerangka analisis panjang 40 ms, kisi Anda tidak harus:

bingkai 1: t = 0..t = 40ms; bingkai 2: t = 40ms..t = 80ms

Bisa jadi:

bingkai 1: t = 0..t = 40ms; bingkai 2: t = 10 ms..t = 50 ms

Tumpang tindih ini dapat memberikan ilusi resolusi temporal yang lebih tinggi tanpa mengurangi terlalu banyak ukuran jendela FFT. Perhatikan bahwa ini hanya dapat membantu dalam secara akurat menemukan suatu peristiwa pada sumbu waktu - itu tidak akan membantu menyelesaikan dua peristiwa yang mendekati waktu ... Seperti halnya meningkatkan ukuran FFT mungkin membantu mengidentifikasi lokasi puncak frekuensi, tetapi tidak dengan resolusi dua puncak frekuensi yang berdekatan.

pichenettes
sumber
Bagaimana Anda pergi ke arah lain (mengubah dari spektrogram ke sinyal audio)
pete
4

Ya, banyak orang telah mengerjakan analisis frekuensi waktu.

Pendekatan "mengiris data saya menjadi potongan, melakukan FFT pada setiap potongan" adalah ide yang bagus. Menerapkan "fungsi jendela" pada setiap chunk, tepat sebelum melakukan FFT, membantu menghindari banyak artefak. Membiarkan potongan tumpang tindih juga membantu. Setelah perubahan itu , Anda berakhir dengan transformasi Gabor , yang tampaknya menjadi transformasi Fourier waktu singkat (STFT) yang paling populer.

Seperti yang telah Anda tunjukkan, dan seperti yang ditunjukkan artikel Wikipedia, semua teknik transformasi Fourier jangka pendek memiliki tradeoff:

  • ketika Anda memotong deret waktu menjadi bagian-bagian yang sangat pendek, Anda mendapatkan informasi waktu yang sangat tepat kapan tepatnya nada mulai dan berhenti, tetapi informasi frekuensinya sangat kabur.
  • Ketika Anda memotong deret waktu menjadi bagian-bagian yang sangat panjang, Anda mendapatkan informasi frekuensi yang sangat tepat untuk frekuensi nada yang tepat, tetapi waktu yang tepat mulai dan berhenti itu buram.

Ini adalah masalah yang terkenal, tetapi sayangnya, tidak hanya tidak diselesaikan, sudah terbukti bahwa ketidakpastian antara keduanya tidak dapat dihindari - batas Gabor, batas Heisenberg-Gabor, prinsip ketidakpastian , dll.

Jika saya jadi Anda, saya akan mulai dengan salah satu dari banyak perpustakaan untuk menghitung transformasi Gabor, dan bereksperimen dengan memotong deret waktu menjadi berbagai panjang. Ada kesempatan baik cukup Anda akan beruntung dan Anda akan berakhir dengan beberapa panjang yang memberikan memadai lokalisasi waktu dan memadai diskriminasi frekuensi.

Jika itu tidak bekerja untuk aplikasi ini, maka saya akan pindah ke pendekatan lain untuk representasi waktu-frekuensi dan analisis waktu-frekuensi - transformasi wavelet, transformasi chirplet , pecahan Fourier transform (FRFT), dll

EDIT: Beberapa kode sumber untuk menghasilkan spektrogram / plot air terjun dari data audio:

Gambar untuk Spectrogram berjalan dalam arah terbalik dari utilitas di atas.

David Cary
sumber
Transformasi Gabor hanya dengan jendela Gaussian. Jika Anda menggunakan jendela lain, itu hanya STFT. (Dan windows Gaussian sejati tidak ada dalam digital karena mereka berangsur-angsur berkurang hingga tak terbatas.)
endolith
@endolith: Anda benar. Transformasi Gabor menggunakan "fungsi jendela Gaussian" yang dipotong hingga panjang - cukup dekat, tetapi tidak identik secara matematis dengan, Gaussian yang ideal.
David Cary
Saya pikir transformasi Gabor adalah transformasi kontinu, menggunakan integral, sehingga dapat memiliki Gaussian non-terpotong sebagai jendela?
endolith
@endolith: Ya, pada prinsipnya, seseorang dapat menggunakan Gaussian yang tidak terpotong sebagai jendela. Dalam praktiknya, karena praktis semua energi Gaussian berada dalam beberapa sigma punuk tengah, menggunakan jendela terpotong praktis selalu membuat tidak ada perbedaan yang terlihat dalam grafik output. Karena perangkat lunak yang menghasilkan plot air terjun spektrogram berulang kali menerapkan jendela Gaussian dan kemudian melakukan FFT untuk setiap kolom bagan, "tidak memotong" akan membuat perangkat lunak itu lambat secara tak tertahankan.
David Cary