6.14. FFT

A Fourier-transzformáció egy időtartománybeli jelet bontja fel az azt alkotó frekvenciákra. A gyors Fourier-transzformáció (FFT) az ezt hatékonyan kiszámító szabványos algoritmus – emiatt létezik ez a modul, és emiatt válnak egyáltalán kezelhetővé a hasznosan hosszú transzformációk (1024 pont, 4096 pont) egy mikrovezérlőn.

Egy kamerán a bemenet jellemzően egyenletesen elosztott minták puffere mikrofontól, egy gyorsulásmérő tengelyétől, egy áramérzékelőtől vagy egy rezgésszondától; a kimenet pedig egy spektrum, amelyet az alkalmazás ezután csúcsok, energia vagy osztályozó jellemzők után vizsgál.

A numpy.fft egydimenziós diszkrét Fourier-transzformációt biztosít. A két függvény a fft() (előre) és a ifft() (inverz, N szerint normalizálva).

A transzformáció hosszának kettő hatványának kell lennie. Más hosszúságok ValueError kivételt váltanak ki. Az N = 256 és az N = 1024 gyakori választás: elég hosszúak a használható frekvenciafelbontáshoz a legtöbb beágyazott mintavételi sebesség mellett, mégis elég rövidek ahhoz, hogy elférjenek a RAM-ban és bőven egy képkocka-perióduson belül befejeződjenek.

A fft() a bemenet valós részét veszi első pozicionális argumentumként, opcionális képzetes részét pedig a másodikként, és egy (real, imag) 2-est ad vissza valós tömbökből.

6.14.1. Valós bemenet, magnitúdó kimenet

Amikor az alkalmazás csak valós bemenetet ad át, és csak a magnitúdóspektrumra van szüksége:

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

Az eredmény egy valós, a bemenettel megegyező hosszúságú ndarray. A spectrogram() segédfüggvény pontosan ezt teszi a közbenső lefoglalások nélkül – ez a helyes hívás egy folyamatos (streaming) cikluson belül.

6.14.2. Inverz transzformáció

A ifft() úgy van normalizálva, hogy az oda-vissza út lebegőpontos hibahatáron belül visszaadja az eredeti bemenetet. Mindkét hívás egy pár valós tömböt vesz és ad vissza:

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

6.14.3. A domináns frekvencia megtalálása

Gyakori minta a legnagyobb csúcs megkeresése egy mintapufferben – audió, rezgés, modulált IR. A recept:

  1. Vegyél N mintát, ahol N kettő hatványa.

  2. Vedd az FFT-t.

  3. Keresd meg a legnagyobb magnitúdójú binet.

  4. Számítsd át a bin indexét Hz-be a mintavételi sebesség segítségével.

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")