Saya telah diberi file audio (gelombang sinus) 1000Hz sebagai input untuk algoritma FFT saya. Saya sudah mendapat sampel spektrum daya 8192 dalam array.
Apa cara terbaik dan termudah untuk memeriksa apakah output saya benar atau salah?
Jika saya memberikan file audio diam maka hasilnya adalah nol untuk semua sampel. Dalam gelombang sinus, o / p meningkat dari 20 (sampel ke-0) menjadi 26059811 (sampel ke-743) dan menurun secara bertahap menjadi 40.
Jika saya mendapatkan gambaran tentang kisaran output maka saya dapat membuktikan secara teknis apakah FFT berfungsi.
Setiap ide akan sangat membantu.
Lihat tautan ini untuk keraguan teknis.
Jawaban:
Tampaknya Anda menghitung spektrum dengan rata-rata 10 jendela (non-tumpang tindih?) Untuk mendapatkan besarnya kuadrat pada frekuensi 8192 atau 8193 (dari 0 hingga Nyquist, tetapi beberapa algoritma mungkin menjatuhkan frekuensi Nyquist di bin 8192).
Hal pertama yang perlu diperiksa adalah bahwa puncaknya berada di tempat sampah yang tepat. Anda tidak mengatakan berapa laju samplingnya, tetapi bin 743 akan menjadi 743/16384 kali laju sampling. Jika sinyal benar-benar di 800 Hz, yang menempatkan Fs di sekitar 17640 sampel / detik. Sepertinya itu salah. Sinyal uji Anda mungkin berada pada tingkat standar seperti 8000, 16000, 22050, 32000, 44100, atau 48000. Untuk Fs = 22050, puncaknya akan tajam di tempat sampah 800/22050 * 16384 = 594.
Kriteria lain yang perlu diperiksa adalah bahwa energi total dalam sinyal kira-kira sama di domain waktu dan frekuensi. Berikut ini contoh dalam Python:
Sinyal input x, yang terdiri dari dua sinusoid sampel pada Fs = 22050 sampel / detik, disegmentasi menjadi 10 jendela non-tumpang tindih ukuran NFFT = 2048 sampel. Panggilan ke psd (kerapatan spektral daya) menghitung spektrum y sebagai rata-rata besarnya kuadrat dari sepuluh DFT 16384-titik (sebenarnya itu 8193 poin karena x bernilai nyata).
Energi domain frekuensi yang dikomputasi memiliki faktor penskalaan N / 16384 karena fungsi psd menskalakan y ke ukuran DFT alih-alih total panjang sinyal. Apakah ini masalah atau tidak tergantung pada bagaimana sistem Anda menangani normalisasi PSD. Normalisasi opsional lain adalah penskalaan dengan 1 / Fs. Ini cocok dengan energi dengan sinyal analog asli. Normalisasi standar harus didokumentasikan dengan baik di perpustakaan.
sumber
Anda perlu merencanakan besarnya output FFT. Saya tidak terbiasa dengan bahasa pemrograman Anda, tetapi dalam Python Anda akan menggunakan sesuatu seperti
plot(abs(fft(a)))
. Untuk input diam, output harus semua nol. Untuk input gelombang sinus, Anda akan melihat dua lonjakan:Untuk sinyal nyata, paku akan simetris dari kiri ke kanan. Namun, jika Anda melakukan FFT nyata (yang lebih efisien secara komputasi), Anda hanya akan mendapatkan separuh plot sebagai output, karena mengabaikan gambar cermin yang berlebihan.
Jika frekuensinya lebih tinggi, paku akan lebih dekat ke tengah. Jika frekuensi benar-benar sinkron dengan ukuran bongkahan , lonjakan hanya akan menjadi satu titik lebar dan yang lainnya akan tepat 0. Jika tidak maka akan memiliki "rok" lancip seperti di atas.
sumber
Saya telah menggunakan alat analisis Fourier dalam Excel Analysis Toolpak untuk melakukan pemeriksaan cepat pada data dan hasil.
sumber