6.14. FFT

O transformată Fourier descompune un semnal în domeniul timp în frecvențele sale constituente. Transformata Fourier rapidă (FFT) este algoritmul standard pentru a calcula eficient una – motivul pentru care acest modul există și motivul pentru care transformatele suficient de lungi pentru a fi utile (1024 de puncte, 4096 de puncte) sunt, în primul rând, abordabile pe un microcontroler.

Pe o cameră, intrarea este de regulă un tampon (buffer) de eșantioane echidistante de la un microfon, de la o axă a unui accelerometru, de la un senzor de curent sau de la o sondă de vibrații; ieșirea este un spectru pe care aplicația îl inspectează apoi pentru vârfuri, energie sau caracteristici de clasificare.

numpy.fft oferă transformata Fourier discretă unidimensională. Cele două funcții sunt fft() (directă) și ifft() (inversă, normalizată cu N).

Lungimea transformatei trebuie să fie o putere a lui doi. Alte lungimi generează ValueError. N = 256 și N = 1024 sunt alegeri frecvente: suficient de lungi pentru o rezoluție de frecvență utilizabilă la majoritatea ratelor de eșantionare din sistemele embedded, suficient de scurte pentru a încăpea în RAM și a se finaliza cu mult în interiorul unei perioade de cadru.

fft() ia partea reală a intrării ca prim argument pozițional și o parte imaginară opțională ca al doilea, și returnează un tuplu de 2 elemente (real, imag) de tablouri reale.

6.14.1. Intrare reală, ieșire de magnitudine

Când aplicația furnizează doar intrare reală și are nevoie doar de spectrul de magnitudine:

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

Rezultatul este un ndarray real, de aceeași lungime ca intrarea. Funcția ajutătoare spectrogram() face exact acest lucru fără alocările intermediare – apelul potrivit în interiorul unei bucle de tip flux.

6.14.2. Transformata inversă

ifft() este normalizată astfel încât parcurgerea dus-întors să returneze intrarea originală în limita erorii de virgulă mobilă. Ambele apeluri primesc și returnează o pereche de tablouri reale:

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

6.14.3. Găsirea frecvenței dominante

Un model frecvent este localizarea celui mai mare vârf într-un tampon (buffer) de eșantioane – audio, vibrații, IR modulat. Rețeta:

  1. Capturează N eșantioane, cu N o putere a lui doi.

  2. Calculează FFT.

  3. Găsește intervalul (bin) cu cea mai mare magnitudine.

  4. Convertește indexul intervalului (bin) în Hz folosind rata de eșantionare.

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