Membuat spektogram

10

Saya sudah mencoba untuk mengerjakan logika untuk tugas ini, dan berencana untuk menggunakan paket sumber KissFFT untuk melakukan transformasi fourier cepat. Tolong beri tahu saya jika ini benar:

  1. Alokasikan struktur FFT, yaitu. kiss_fft_alloc(N,0,NULL,NULL) Di mana Nukuran jendela yang saya gunakan. Buffer input akan berupa array Nelemen tipe kiss_fft_scalar. Buffer output akan menjadi array N/2 + 1elemen tipe kiss_fft_cpx.
  2. Decode N(ukuran jendela) jumlah sampel PCM.
  3. Untuk setiap sampel PCM, rata-rata setiap amplitudo saluran (sampel yang tidak ditandatangani) dan skala dari 0 hingga 2 (bagi dengan 65536.0), simpan hasilnya ke dalam buffer input.
  4. Lakukan windowing (mis. Hanning) pada buffer input.
  5. Lakukan transformasi fourier cepat pada buffer input, simpan ke buffer output. Karena saya menggunakan nilai nyata sebagai input, saya dapat menggunakan kiss_fftr().
  6. Untuk nilai N/2output, dapatkan besarnya kuadrat dari data yang ditransformasikan dan konversikan nilai ke skala dB dengan rumus berikut: 10 * log10 (re * re + im * im)
  7. Plot N/2nilai dari langkah 6.
  8. Buang bagian pertama buffer input, decoding sampel PCM berikutnya (ukuran jendela / 2) dan lakukan penskalaan dan windowing ke data. Ini harus secara efektif menggeser jendela input dan menghindari keharusan mengulang matematika pada sampel PCM yang diproses.
  9. Ulangi ke langkah 5, ulangi langkah-langkah ini sampai semua sampel diproses.
  10. Bebaskan memori bekas dari kiss_fft_alloc().

Disarankan agar saya mengurangi nilai dari jendela input sebelum saya melakukan FFT, sehingga nilai DC yang dihasilkan memiliki besaran nol. Haruskah saya mengurangi rata-rata atau rata-rata dari data input?

Juga, apa saja hal yang perlu saya pertimbangkan ketika saya memilih ukuran jendela? Selain itu harus nomor genap sesuai instruksi KissFFT, apakah ada manfaat menggunakan ukuran jendela kecil, yaitu. apakah ini akan menyediakan grafik yang lebih baik? Saya berasumsi bahwa ukuran jendela besar mengurangi jumlah FFT yang harus dilakukan, apakah itu satu-satunya keuntungan menggunakan ukuran jendela besar?

Terakhir, ketika saya sampai pada titik bahwa data siap untuk plot, bagaimana cara merencanakannya? Ketika saya bekerja pada beberapa logika grafik gelombang di masa lalu, saya hanya merencanakan 3 nilai untuk setiap piksel di sepanjang sumbu (min amplitudo, amplitudo maks, amplitudo RMS), tapi saya tidak tahu apa yang harus saya lakukan dengan data spektrogram.x

Terima kasih sebelumnya atas segala dan semua panduan yang dapat Anda berikan.

raynebc
sumber

Jawaban:

8

Terlihat bagus untukku. Pada langkah 3, Anda benar-benar ingin mengukur sinyal dari -1 ke 1, jika tidak, Anda menambahkan DC. Anda sebutkan mengurangi mean - Saya tidak akan merekomendasikan melakukan ini untuk spektrogram, karena itu secara efektif menyaring DC, yang harus ditunjukkan oleh spektogram jika ada.

Memilih ukuran jendela adalah tentang pengorbanan. Jendela yang lebih besar akan memberikan Anda resolusi frekuensi yang lebih tajam, tetapi resolusi waktu lebih blurrier. Jendela yang lebih pendek akan memberikan Anda yang sebaliknya: resolusi waktu yang lebih tajam tetapi resolusi frekuensi blurrier. Pilihan ukuran jendela yang sesuai akan tergantung pada data yang Anda coba analisis. Biasanya itu akan menjadi kekuatan 2 hanya karena FFT cenderung menyukai kekuatan 2. Aturan praktis yang baik adalah bahwa jendela Anda harus setidaknya sekitar dua kali selama periode frekuensi terendah yang Anda ingin dapat secara akurat menyelesaikan.

Anda mungkin bertanya-tanya apakah mungkin untuk menangani tradeoff ini dengan lebih baik, dan ada beberapa teknik untuk itu: mereka umumnya melibatkan komputasi spektrogram dengan beberapa ukuran FFT yang berbeda sekaligus, dan menggabungkannya. Ada beberapa informasi visual yang bagus di halaman web ini: http://www.izotope.com/tech/aes_adapt/

Jika ukuran jendela Anda terlalu kecil, dua frekuensi yang sangat dekat mungkin tidak dapat dibedakan satu sama lain karena keduanya berakhir di nampan FFT yang sama. Jika ukuran jendela Anda terlalu besar, dua kejadian dekat dalam waktu, mungkin digabungkan, atau transien yang tajam dapat berubah menjadi serangan bertahap. Lihat halaman web yang saya posting untuk beberapa cara memvisualisasikan ini.

Ukuran jendela yang lebih besar tidak selalu mengurangi jumlah FFT. Anda telah memilih untuk menghitung spektogram menggunakan transformasi Fourier waktu singkat di mana ada tumpang tindih setengah ukuran FFT. Anda bisa menggunakan faktor tumpang tindih yang lebih tinggi jika Anda mau. Memilih ukuran jendela lebih merupakan masalah membuat tradeoff waktu / frekuensi daripada berapa banyak FFT yang harus Anda hitung. Dalam mendesain spektrogram (atau STFT apa pun), Anda dapat menganggap memilih ukuran jendela, dan ukuran hop , jarak antar blok, sebagai parameter independen.

Ketika Anda memplotnya, waktu biasanya pada sumbu x, frekuensi pada sumbu y (biasanya skala log, skala Mel, dll, daripada skala linier), dan kemudian besarnya ditunjukkan dengan intensitas warna, yaitu warna yang sangat gelap sesuai dengan magnitudo kecil dan warna yang sangat terang sesuai dengan magnitudo besar.

schnarf
sumber
Tautan Anda tampaknya sudah mati. Bisakah Anda memperbaruinya?
Daniel Wolf