6.14. FFT¶
En Fouriertransform bryter ner en tidsdomänsignal i dess ingående frekvenser. Den snabba Fouriertransformen (FFT) är standardalgoritmen för att beräkna en sådan effektivt – skälet till att denna modul finns, och skälet till att transformer som är tillräckligt långa för att vara användbara (1024 punkter, 4096 punkter) över huvud taget är hanterbara på en mikrokontroller.
På en kamera är indatan vanligtvis en buffert med jämnt fördelade sampel från en mikrofon, en accelerometeraxel, en strömsensor eller en vibrationsprob; utdatan är ett spektrum som applikationen sedan undersöker efter toppar, energi eller särdrag för en klassificerare.
numpy.fft tillhandahåller den endimensionella diskreta Fouriertransformen. De två funktionerna är fft() (framåt) och ifft() (invers, normaliserad med N).
Transformlängden måste vara en tvåpotens. Andra längder utlöser ValueError. N = 256 och N = 1024 är vanliga val: tillräckligt långa för användbar frekvensupplösning vid de flesta inbäddade samplingsfrekvenser, tillräckligt korta för att rymmas i RAM och hinna bli klara i god tid inom en bildrutas period.
fft() tar realdelen av indatan som sitt första positionsargument och en valfri imaginärdel som sitt andra, och returnerar en 2-tupel (real, imag) av reella arrayer.
6.14.1. Reell indata, magnitudutdata¶
När applikationen endast matar in reell indata och endast behöver magnitudspektrumet:
real, imag = np.fft.fft(x)
magnitude = np.sqrt(real * real + imag * imag)
Resultatet är en reell ndarray med samma längd som indatan. Hjälpfunktionen spectrogram() gör exakt detta utan de mellanliggande allokeringarna – det rätta anropet inuti en strömmande loop.
6.14.2. Invers transform¶
ifft() är normaliserad så att rundresan returnerar den ursprungliga indatan inom flyttalsfel. Båda anropen tar och returnerar ett par reella arrayer:
real, imag = np.fft.fft(y)
re_back, im_back = np.fft.ifft(real, imag)
6.14.3. Hitta den dominerande frekvensen¶
Ett vanligt mönster är att lokalisera den största toppen i en buffert med sampel – ljud, vibration, modulerad IR. Receptet:
Fånga
Nsampel, därNär en tvåpotens.Ta FFT:n.
Hitta facket med den största magnituden.
Konvertera fackets index till Hz med hjälp av samplingsfrekvensen.
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")