6.14. FFT¶
Een Fouriertransformatie ontbindt een signaal in het tijddomein in zijn samenstellende frequenties. De snelle Fouriertransformatie (FFT) is het standaardalgoritme om er op efficiënte wijze één te berekenen – de reden dat deze module bestaat, en de reden dat transformaties die lang genoeg zijn om nuttig te zijn (1024 punten, 4096 punten) überhaupt haalbaar zijn op een microcontroller.
Op een camera is de invoer doorgaans een buffer met gelijkmatig verdeelde samples van een microfoon, een versnellingsmeter-as, een stroomsensor of een trillingsprobe; de uitvoer is een spectrum dat de toepassing vervolgens onderzoekt op pieken, energie of classifier-kenmerken.
numpy.fft biedt de eendimensionale discrete Fouriertransformatie. De twee functies zijn fft() (voorwaarts) en ifft() (invers, genormaliseerd door N).
De transformatielengte moet een macht van twee zijn. Andere lengtes geven een ValueError. N = 256 en N = 1024 zijn veelgebruikte keuzes: lang genoeg voor een bruikbare frequentieresolutie bij de meeste embedded sample rates, kort genoeg om in het RAM te passen en ruim binnen één frameperiode klaar te zijn.
fft() neemt het reële deel van de invoer als eerste positionele argument en een optioneel imaginair deel als tweede, en geeft een 2-tuple (real, imag) van reële arrays terug.
6.14.1. Reële invoer, magnitude-uitvoer¶
Wanneer de toepassing alleen reële invoer aanlevert en alleen het magnitudespectrum nodig heeft:
real, imag = np.fft.fft(x)
magnitude = np.sqrt(real * real + imag * imag)
Het resultaat is een reële ndarray met dezelfde lengte als de invoer. De hulpfunctie spectrogram() doet precies dit zonder de tussenliggende allocaties – de juiste keuze binnen een streaming-lus.
6.14.2. Inverse transformatie¶
ifft() is zo genormaliseerd dat de heen-en-terugweg de oorspronkelijke invoer teruggeeft binnen de drijvendekommafout. Beide aanroepen nemen en geven een paar reële arrays terug:
real, imag = np.fft.fft(y)
re_back, im_back = np.fft.ifft(real, imag)
6.14.3. De dominante frequentie vinden¶
Een veelvoorkomend patroon is het lokaliseren van de grootste piek in een buffer met samples – audio, trillingen, gemoduleerd IR. Het recept:
Leg
Nsamples vast, waarbijNeen macht van twee is.Neem de FFT.
Vind de bin met de grootste magnitude.
Reken de bin-index om naar Hz met behulp van de sample rate.
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")