6.14. FFT¶
Una transformada de Fourier descompone una señal en el dominio del tiempo en sus frecuencias constituyentes. La transformada rápida de Fourier (FFT) es el algoritmo estándar para calcular una de forma eficiente – la razón por la que existe este módulo, y la razón por la que transformadas lo bastante largas como para ser útiles (1024 puntos, 4096 puntos) resultan abordables en un microcontrolador en primer lugar.
En una cámara, la entrada suele ser un búfer de muestras equidistantes procedentes de un micrófono, un eje de un acelerómetro, un sensor de corriente o una sonda de vibración; la salida es un espectro que la aplicación inspecciona después en busca de picos, energía o características para un clasificador.
numpy.fft proporciona la transformada discreta de Fourier unidimensional. Las dos funciones son fft() (directa) e ifft() (inversa, normalizada por N).
La longitud de la transformada debe ser una potencia de dos. Otras longitudes lanzan ValueError. N = 256 y N = 1024 son opciones habituales: lo bastante largas para una resolución en frecuencia útil en la mayoría de las frecuencias de muestreo empotradas, y lo bastante cortas para caber en la RAM y terminar holgadamente dentro de un periodo de fotograma.
fft() toma la parte real de la entrada como su primer argumento posicional y una parte imaginaria opcional como el segundo, y devuelve una 2-tupla (real, imag) de arrays reales.
6.14.1. Entrada real, salida en magnitud¶
Cuando la aplicación solo aporta entrada real y solo necesita el espectro de magnitud:
real, imag = np.fft.fft(x)
magnitude = np.sqrt(real * real + imag * imag)
El resultado es un ndarray real de la misma longitud que la entrada. La función auxiliar spectrogram() hace exactamente esto sin las asignaciones intermedias – la llamada adecuada dentro de un bucle de transmisión continua.
6.14.2. Transformada inversa¶
ifft() está normalizada de modo que el viaje de ida y vuelta devuelve la entrada original dentro del error de coma flotante. Ambas llamadas toman y devuelven un par de arrays reales:
real, imag = np.fft.fft(y)
re_back, im_back = np.fft.ifft(real, imag)
6.14.3. Encontrar la frecuencia dominante¶
Un patrón habitual es localizar el pico más grande en un búfer de muestras – audio, vibración, IR modulado. La receta:
Capturar
Nmuestras, siendoNuna potencia de dos.Calcular la FFT.
Encontrar el bin con la mayor magnitud.
Convertir el índice del bin a Hz usando la frecuencia de muestreo.
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")