Bagaimana cara saya mendapatkan frekuensi masing-masing nilai dalam FFT?

148

Saya memiliki hasil FFT. Ini disimpan dalam dua doublearray: 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.

Rango
sumber
Saya melakukannya di C # .net. Bisakah kamu membantuku?
Rango
9
Jika Anda tidak memahami relevansi bagian FFT nyata dan imajiner maka Anda tidak akan mendapatkan hasil yang berarti, jadi Anda harus mencari beberapa tutorial FFT dan pemrosesan sinyal untuk memahami cara menafsirkan hasil. Saya pikir sangat mungkin bahwa apa pun yang Anda gunakan untuk itu, Anda menginginkan besarnya FFT atau Power Spectral Density.
the_mandrill
Terima kasih! Saya ingin mendapatkan frekuensi puncak dari masing-masing bingkai (panjang bingkai tergantung pada Panjang Jendela dan Panjang Pergeseran)
Rango

Jawaban:

350

Nampan pertama di FFT adalah DC (0 Hz), nampan kedua adalah Fs / N, di mana Fslaju sampel dan Nadalah ukuran FFT. Tempat sampah berikutnya adalah 2 * Fs / N. Untuk menyatakan ini secara umum, n bin adalah n * Fs / N.

Jadi jika laju sampel Anda, Fskatakanlah 44,1 kHz dan ukuran FFT Anda, Nadalah 1024, maka nampan keluaran FFT berada di:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

Perhatikan bahwa untuk sinyal input nyata (bagian imajiner semuanya nol) paruh kedua FFT (nampan dari N / 2 + 1ke N - 1) tidak mengandung informasi tambahan yang berguna (mereka memiliki simetri konjugat kompleks dengan nampan pertama N / 2 - 1). Bin berguna terakhir (untuk aplikasi praktis) adalah di N / 2 - 1, yang sesuai dengan 22006,9 Hz dalam contoh di atas. Tempat sampah N / 2mewakili energi pada frekuensi Nyquist, yaitu Fs / 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 atas Fs / 2.

Paul R
sumber
8
Catatan - jawabannya sedikit salah - ember ke-512 berisi level untuk 22050, batas nyquist. Sampah 0 hingga N / 2 berisi nilai yang berguna.
david van brink
4
Terima kasih atas hasil edit & klarifikasi ... Saya kira ini adalah di mana saya mengungkapkan kurangnya kepraktisan. Saya: Tapi tuan, pekerjaan FFT sampai ke nyquist! Anda: Padawan, Anda harus memfilternya.
david van brink
5
Saya berharap bisa membintangi jawaban. Jawaban ini bahkan lebih baik daripada pertanyaan awal!
Skylion
14
@ PaulR - Saya ingin mengucapkan terima kasih atas jawaban luar biasa yang telah membantu saya selama ini. Saya akan mengunjungi jawaban ini sebelum saya memiliki akun StackOverflow, dan saya benar-benar lupa berterima kasih kepada Anda begitu saya mendaftar. Saya baru-baru ini melihat hal-hal FFT dan saya ingat jawaban Anda dan baru saja mengunjunginya sekarang. Begitu saya tiba di sini, saya ingat untuk berterima kasih ... jadi terima kasih! Setiap kali saya berdebat dengan seseorang tentang menafsirkan apa setiap titik pada sumbu horizontal FFT, saya hanya mengarahkan mereka ke tautan ini.
rayryeng
6
@rayryeng: terima kasih banyak - saya pikir itu pengakuan terbaik yang pernah saya miliki ~ 5 tahun menjawab pertanyaan di SO!
Paul R
55

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 dengan sin(2*pi*F*t). Alasan sinyal input dikorelasikan dengan sindan cosfungsinya 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.

Jason B
sumber
Bagian nyata dan imajiner adalah hasil FFT yang digunakan untuk? Tolong jelaskan untuk saya. Terima kasih
Rango
5
jawaban ini layak mendapatkan lebih banyak cinta.
Bintang terang
1
Mungkinkah besarnya output kompleks masing-masing harus digandakan? (jika saya membatasi penafsiran saya ke bagian bawah)
Wolf
18

Saya telah menggunakan yang berikut ini:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

Inputnya adalah:

  • i: Nampan untuk mengakses
  • samples: Laju pengambilan sampel dalam Hertz (yaitu 8000 Hz, 44100Hz, dll.)
  • nFFT: Ukuran vektor FFT
roberto
sumber
7
Orang tidak bisa tahu persis dengan apa Anda mewakili samplesatau nFFT. Jadi tolong buat lebih jelas.
mostar
14
Jawaban yang diterima mengatakan ini seharusnya i * samples / nFFT. Mengapa ada tambahan 2? Apakah saya melewatkan sesuatu?
yati sagade
13

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

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

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:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
robert.b
sumber
5

K Anda th frekuensi FFT hasil ini adalah 2 * pi * k / N.

Neo
sumber
6
Saya kira ini akan di radian
Barnaby