Bir FFT'deki her bir değerin frekanslarını nasıl elde edebilirim?


148

FFT sonucum var. Bunlar iki doubledizide saklanır : gerçek parça dizisi ve hayali parça dizisi. Bu dizilerdeki her bir öğeye karşılık gelen frekansları nasıl belirlerim?

Başka bir deyişle, FFT'imin her gerçek ve hayali bileşeni için frekansları saklayan bir dizi oluşturmak istiyorum.


Bunu C # .net içinde yapıyorum. Bana yardım eder misiniz?
Rango

9
Bir FFT'nin gerçek ve hayali bölümlerinin alaka düzeyini anlamadıysanız, anlamlı sonuçlar elde etmeyeceksiniz, bu nedenle sonuçların nasıl yorumlanacağını anlamak için bazı FFT ve sinyal işleme öğreticilerini avlamalısınız. Bence onu ne için kullanırsanız kullanın, FFT'nin büyüklüğünü veya Güç Spektral Yoğunluğunu istiyorsunuz.
the_mandrill

Teşekkür ederim! Her karenin tepe frekanslarını almak istiyorum (kare uzunluğu Pencere Uzunluğuna ve Vites Uzunluğuna bağlıdır)
Rango

Yanıtlar:


350

FFT ilk bölmesi ikinci bölmesi olan DC (0 Hz), olduğu Fs / Nyerde, Fsörnek hızı ve NFFT boyutudur. Bir sonraki bölme 2 * Fs / N. Genel hatlarıyla ifade etmek gerekirse, n'inci bin olduğunu n * Fs / N.

Dolayısıyla, örnekleme hızınız Fs44,1 kHz ve FFT boyutunuz N1024 ise, FFT çıkış bölmeleri şuradadır:

  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

Not gerçek giriş sinyali için (sanal kısmın tamamı sıfır) FFT ikinci yarısı (gelen depo olduğu N / 2 + 1için N - 1) faydalı bir ek bilgi (ilk kompleks eşlenik simetrisine sahiptir içeren N / 2 - 1kutular). N / 2 - 1Yukarıdaki örnekte 22006.9 Hz'e karşılık gelen son kullanışlı bölme (pratik uygulamalar için) 'dir . Üzerindeki hazne N / 2, Nyquist frekansındaki enerjiyi temsil eder, yani Fs / 2(bu örnekte = 22050 Hz), ancak bu genellikle herhangi bir pratik kullanım değildir, çünkü kenar yumuşatma filtreleri tipik olarak ve üzerindeki sinyalleri zayıflatacaktır Fs / 2.


8
Not - cevap biraz yanlış - 512. kova 22050 seviyesini, nyquist limiti içeriyor. 0 ila N / 2 dahil bölmeleri faydalı değerler içerir.
david van brink

4
Düzenleme ve açıklama için teşekkürler ... Sanırım burada pratiklik eksikliği ortaya çıkıyor. Ben: Ama efendimiz, FFT'in nyquist'e kadar çalışması! Siz: Padawan, bunu gerçekten filtrelemelisiniz.
david van brink

5
Keşke yıldızlara cevap verebilseydim. Bu cevap orijinal sorudan daha iyidir!
Skylion

14
@PaulR - Yıllar boyunca bana hizmet eden bu harika cevap için teşekkür etmek istedim. Bir StackOverflow hesabım olmadan önce bu yanıtı ziyaret ederdim ve kaydolduktan sonra size gerçekten teşekkür etmeyi unuttum. Son zamanlarda FFT şeylerine bakıyordum ve cevabınızı hatırladım ve şimdi ziyaret ettim. Buraya geldiğimde sana teşekkür etmeyi hatırladım ... bu yüzden teşekkür ederim! Ne zaman FFT'nin yatay eksenindeki her noktanın ne olduğunu yorumlama konusunda biriyle tartıştığımda, onları sadece bu bağlantıya yönlendiriyorum.
rayryeng

6
@rayryeng: çok teşekkür ederim - Sanırım burada SO ile ilgili soruları cevapladıktan yaklaşık 5 yıl sonra yaşadığım en güzel teşekkür!
Paul R

55

Cevabımı burada bulabilirsiniz .

Yorum için cevap:

FFT aslında giriş sinyalinin sinüs ve kosinüs fonksiyonları (temel fonksiyonlar) ile eşit aralıklı frekanslarda çapraz korelasyonunu hesaplar . Belirli bir FFT çıkışı için, gönderdiğim cevapta verilen karşılık gelen bir frekans (F) vardır. Çıkış örneğinin gerçek kısmı, giriş sinyalinin çapraz korelasyonudur cos(2*pi*F*t)ve hayali kısım, giriş sinyalinin çapraz korelasyonudur sin(2*pi*F*t). Giriş sinyalinin ilişkili olması sinve cosişlevlerinin nedeni, giriş sinyali ve temel işlevler arasındaki faz farklarını hesaba katmaktır.

Karmaşık FFT çıkışının büyüklüğünü alarak, giriş sinyalinin giriş sinyal fazından bağımsız olarak, bir dizi frekansta giriş sinyalinin sinüzoidlerle ne kadar iyi korele olduğunun bir ölçüsünü alırsınız. Sadece bir sinyalin frekans içeriğini analiz ediyorsanız, neredeyse her zaman FFT'nin karmaşık çıktısının karesini veya büyüklüğünü alırsınız.


Gerçek ve Hayali kısım FFT için kullanılan sonuçtur? Lütfen benim için açıkla. Teşekkür ederim
Rango

5
bu cevap daha çok sevgiyi hak ediyor.
parlak yıldız

1
Karmaşık çıktıların büyüklüğünün ikiye katlanması gerekebilir mi? (yorumumu alt
Wolf

18

Aşağıdakileri kullandım:

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));
}

Girişler:

  • i: Erişilecek kutu
  • samples: Hertz cinsinden örnekleme oranı (örn. 8000 Hz, 44100Hz, vb.)
  • nFFT: FFT vektörünün boyutu

7
İnsanlar neyi temsil ettiğinizi tam olarak bilemez samplesveya nFFT. Lütfen daha açıklayıcı olun.
mostar

14
Kabul edilen cevap bunun olması gerektiğini söylüyor i * samples / nFFT. Ekstra neden 2orada? Bir şey mi kaçırıyorum?
yati sagade

13

FFT çıkış katsayıları (N büyüklüğündeki karmaşık girdi için) 0 ile N - 1 arasında [LOW, MID, HI, HI, MID, LOW] frekansı olarak gruplandırılmıştır.

K'deki elemanın Nk'deki elemanla aynı frekansa sahip olduğunu düşünürüm, çünkü gerçek veriler için FFT [Nk] = FFT [k] 'nin karmaşık konjugatı.

DÜŞÜK'ten YÜKSEK frekansa tarama sırası

0,

 1,
 N-1,

 2,
 N-2

 ...

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

 [N/2]

İndeks i = 0 ile [N / 2] arasında [N / 2] +1 frekans grubu vardır; frequency = i * SamplingFrequency / N

Yani bin FFT [k] 'deki frekans:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N

5

Sizin k inci FFT sonucun frekansı 2 * pi * k / N biçimindedir.


6
Sanırım bu radyan olacak
Barnaby
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.