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:
Vegyél
Nmintát, aholNkettő hatványa.Vedd az FFT-t.
Keresd meg a legnagyobb magnitúdójú binet.
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")