6.14. FFT

Bir Fourier dönüşümü, zaman alanındaki bir sinyali onu oluşturan frekanslarına ayrıştırır. Hızlı Fourier dönüşümü (FFT), birini verimli biçimde hesaplamak için kullanılan standart algoritmadır – bu modülün var olma nedeni ve faydalı olacak kadar uzun dönüşümlerin (1024 nokta, 4096 nokta) ilk etapta bir mikrodenetleyicide hesaplanabilir olmasının nedeni budur.

Bir kamerada giriş genellikle bir mikrofondan, bir ivmeölçer ekseninden, bir akım sensöründen veya bir titreşim probundan eşit aralıklarla alınmış örneklerden oluşan bir arabellektir; çıkış ise uygulamanın ardından tepe noktaları, enerji veya sınıflandırıcı öznitelikleri açısından incelediği bir spektrumdur.

numpy.fft, tek boyutlu ayrık Fourier dönüşümünü sağlar. İki işlev fft() (ileri) ve ifft() (ters, N ile normalize edilmiş) şeklindedir.

Dönüşüm uzunluğu ikinin bir kuvveti olmalıdır. Diğer uzunluklar ValueError hatası verir. N = 256 ve N = 1024 yaygın tercihlerdir: çoğu gömülü örnekleme hızında kullanılabilir frekans çözünürlüğü için yeterince uzun, RAM’e sığacak ve bir çerçeve süresi içinde rahatça tamamlanacak kadar kısadır.

fft(), ilk konumsal argümanı olarak girişin gerçel kısmını ve ikincisi olarak isteğe bağlı bir sanal kısmı alır ve gerçel dizilerden oluşan bir 2 elemanlı (real, imag) demeti döndürür.

6.14.1. Gerçel giriş, büyüklük çıkışı

Uygulama yalnızca gerçel giriş besliyor ve yalnızca büyüklük spektrumuna ihtiyaç duyuyorsa:

real, imag = np.fft.fft(x)
magnitude  = np.sqrt(real * real + imag * imag)

Sonuç, girişle aynı uzunlukta gerçel bir ndarray nesnesidir. spectrogram() yardımcısı, ara tahsisler olmadan tam olarak bunu yapar – akışlı bir döngü içinde doğru çağrı budur.

6.14.2. Ters dönüşüm

ifft(), gidiş-dönüşün orijinal girişi kayan nokta hatası dahilinde döndüreceği şekilde normalize edilmiştir. Her iki çağrı da bir çift gerçel diziyi alır ve döndürür:

real, imag       = np.fft.fft(y)
re_back, im_back = np.fft.ifft(real, imag)

6.14.3. Baskın frekansı bulma

Yaygın bir kalıp, bir örnek arabelleğindeki – ses, titreşim, modüle edilmiş kızılötesi – en büyük tepe noktasını bulmaktır. Tarifi şudur:

  1. N örnek yakalayın; N ikinin bir kuvveti olsun.

  2. FFT’yi alın.

  3. En büyük büyüklüğe sahip kutuyu (bin) bulun.

  4. Örnekleme hızını kullanarak kutu indeksini Hz’e dönüştürün.

from ulab import numpy as np

N  = 1024
fs = 8000.0                       # sample rate, Hz

# ... fill ``samples`` with N data points ...

real, imag = np.fft.fft(samples)
spectrum   = np.sqrt(real * real + imag * imag)

half      = spectrum[:N // 2]     # only first half is meaningful
peak_bin  = np.argmax(half)
peak_hz   = peak_bin * fs / N

print("peak at", peak_hz, "Hz")