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:
- Alokasikan struktur FFT, yaitu.
kiss_fft_alloc(N,0,NULL,NULL)
Di manaN
ukuran jendela yang saya gunakan. Buffer input akan berupa arrayN
elemen tipekiss_fft_scalar
. Buffer output akan menjadi arrayN/2 + 1
elemen tipekiss_fft_cpx
. - Decode
N
(ukuran jendela) jumlah sampel PCM. - 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.
- Lakukan windowing (mis. Hanning) pada buffer input.
- Lakukan transformasi fourier cepat pada buffer input, simpan ke buffer output. Karena saya menggunakan nilai nyata sebagai input, saya dapat menggunakan
kiss_fftr()
. - Untuk nilai
N/2
output, dapatkan besarnya kuadrat dari data yang ditransformasikan dan konversikan nilai ke skala dB dengan rumus berikut:10 * log10 (re * re + im * im)
- Plot
N/2
nilai dari langkah 6. - 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.
- Ulangi ke langkah 5, ulangi langkah-langkah ini sampai semua sampel diproses.
- 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.
Terima kasih sebelumnya atas segala dan semua panduan yang dapat Anda berikan.