Saya memiliki hasil FFT. Ini disimpan dalam dua double
array: array bagian nyata dan array bagian imajiner. Bagaimana cara menentukan frekuensi yang sesuai dengan setiap elemen dalam array ini?
Dengan kata lain, saya ingin membuat array yang menyimpan frekuensi untuk setiap komponen nyata dan imajiner FFT saya.
c#
signal-processing
fft
Rango
sumber
sumber
Jawaban:
Nampan pertama di FFT adalah DC (0 Hz), nampan kedua adalah
Fs / N
, di manaFs
laju sampel danN
adalah ukuran FFT. Tempat sampah berikutnya adalah2 * Fs / N
. Untuk menyatakan ini secara umum, n bin adalahn * Fs / N
.Jadi jika laju sampel Anda,
Fs
katakanlah 44,1 kHz dan ukuran FFT Anda,N
adalah 1024, maka nampan keluaran FFT berada di:Perhatikan bahwa untuk sinyal input nyata (bagian imajiner semuanya nol) paruh kedua FFT (nampan dari
N / 2 + 1
keN - 1
) tidak mengandung informasi tambahan yang berguna (mereka memiliki simetri konjugat kompleks dengan nampan pertamaN / 2 - 1
). Bin berguna terakhir (untuk aplikasi praktis) adalah diN / 2 - 1
, yang sesuai dengan 22006,9 Hz dalam contoh di atas. Tempat sampahN / 2
mewakili energi pada frekuensi Nyquist, yaituFs / 2
(= 22050 Hz dalam contoh ini), tetapi ini pada umumnya tidak digunakan secara praktis, karena filter anti-aliasing biasanya akan melemahkan sinyal pada dan di atasFs / 2
.sumber
Lihatlah jawaban saya di sini .
Jawab komentar:
FFT sebenarnya menghitung korelasi silang dari sinyal input dengan fungsi sinus dan fungsi kosinus (fungsi basis) pada rentang frekuensi dengan jarak yang sama. Untuk output FFT yang diberikan, ada frekuensi yang sesuai (F) seperti yang diberikan oleh jawaban yang saya posting. Bagian nyata dari sampel keluaran adalah korelasi silang dari sinyal input dengan
cos(2*pi*F*t)
dan bagian imajiner adalah korelasi silang dari sinyal input dengansin(2*pi*F*t)
. Alasan sinyal input dikorelasikan dengansin
dancos
fungsinya adalah untuk menjelaskan perbedaan fase antara sinyal input dan fungsi basis.Dengan mengambil besarnya output FFT yang kompleks, Anda mendapatkan ukuran seberapa baik sinyal input berkorelasi dengan sinusoid pada serangkaian frekuensi terlepas dari fase sinyal input. Jika Anda hanya menganalisis konten frekuensi suatu sinyal, Anda hampir selalu akan mengambil besaran atau besarnya kuadrat dari output kompleks FFT.
sumber
Saya telah menggunakan yang berikut ini:
Inputnya adalah:
i
: Nampan untuk mengaksessamples
: Laju pengambilan sampel dalam Hertz (yaitu 8000 Hz, 44100Hz, dll.)nFFT
: Ukuran vektor FFTsumber
samples
ataunFFT
. Jadi tolong buat lebih jelas.i * samples / nFFT
. Mengapa ada tambahan2
? Apakah saya melewatkan sesuatu?Koefisien output FFT (untuk input ukuran N yang kompleks) dari 0 hingga N - 1 dikelompokkan sebagai frekuensi [RENDAH, TENGAH, TINGGI, TINGGI, TINGGI, TINGGI, TINGGI].
Saya akan mempertimbangkan bahwa elemen pada k memiliki frekuensi yang sama dengan elemen pada Nk karena untuk data nyata, FFT [Nk] = konjugat kompleks FFT [k].
Urutan pemindaian dari frekuensi RENDAH ke TINGGI adalah
Ada [N / 2] +1 kelompok frekuensi dari indeks i = 0 hingga [N / 2], masing-masing memiliki
frequency = i * SamplingFrequency / N
Jadi frekuensi di bin FFT [k] adalah:
sumber
K Anda th frekuensi FFT hasil ini adalah 2 * pi * k / N.
sumber