Bagaimana cara memeriksa hasil FFT dari gelombang sinus?

9

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.

Komunitas
sumber
1
dapatkah Anda merencanakan array? (mungkin dalam perangkat lunak spreadsheet?)
Ada 8192 nilai dalam array. Anda ingin saya memplot secara manual atau spreadsheet akan menanganinya. Saya sedang mengerjakan MAC
2
Saya telah merencanakan puluhan ribu sampel dalam MS Excel; Gnumerik atau lainnya juga cocok. Atau gnuplot juga.
Jangan lupa buka kantor
Nama Palsu
@Fake Name: saya tidak bisa menggambar grafik ..

Jawaban:

4

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:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

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.

Eryk Sun
sumber
Saya menguji sinyal gelombang sinus saya 1000 Hz. Tambang FFT memberikan jawaban yang tepat. Terima kasih atas bantuan Anda.
10

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:

teks alternatif

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.

endolit
sumber
Apakah maksud Anda nilai spektrum daya sebagai amplitudo?
t -> dengan referensi waktu?
Jangan khawatir tentang waktu. Jika Anda hanya memeriksa apakah FFT berfungsi, yang perlu Anda lakukan adalah memeriksa bahwa bentuk besarnya mirip dengan ini.
endolith
Saya tetap tidak bisa merencanakan FFT saya berfungsi dengan baik. Saya akan mencoba menerapkan grafik di waktu luang saya pasti. Terima kasih banyak.
1
@clabacchio: Oh. FFT menghasilkan output dengan sumbu f = 0 pada awal dan akhir plot. Titik tengah plot adalah sumbu f = fs / 2. Seringkali ada fungsi fftfreq atau fftshift untuk mengatur ulang plot sehingga frekuensi 0 ada di tengah. flic.kr/p/arVeZT
endolith
0

Saya telah menggunakan alat analisis Fourier dalam Excel Analysis Toolpak untuk melakukan pemeriksaan cepat pada data dan hasil.

kamu
sumber
Saya bekerja di MAC.
@ Warrior - Kemudian gunakan MacPorts atau Fink untuk menginstal Gnumeric (lihat juga halaman ini untuk info tentang bungkus Platypus jika Anda menginginkannya)
Kevin Vermeer