6.14. FFT

Transformasi Fourier menguraikan sinyal domain waktu menjadi frekuensi-frekuensi penyusunnya. Fast Fourier transform (FFT) adalah algoritma standar untuk menghitungnya secara efisien -- itulah alasan modul ini ada, dan alasan mengapa transformasi dengan panjang yang cukup berguna (1024 titik, 4096 titik) dapat dijalankan pada mikrokontroler.

Pada kamera, masukannya biasanya berupa buffer sampel yang berjarak sama dari mikrofon, sumbu akselerometer, sensor arus, atau probe getaran; keluarannya adalah spektrum yang kemudian diperiksa oleh aplikasi untuk mencari puncak, energi, atau fitur klasifikasi.

numpy.fft menyediakan transformasi Fourier diskrit satu dimensi. Dua fungsinya adalah fft() (maju) dan ifft() (balik, dinormalisasi oleh N).

Panjang transformasi harus merupakan pangkat dua. Panjang lainnya akan memunculkan ValueError. N = 256 dan N = 1024 adalah pilihan umum: cukup panjang untuk resolusi frekuensi yang dapat digunakan pada sebagian besar laju sampel embedded, cukup pendek untuk muat di RAM dan selesai jauh sebelum satu periode bingkai.

fft() mengambil bagian real dari masukan sebagai argumen posisi pertamanya dan bagian imajiner opsional sebagai argumen kedua, dan mengembalikan 2-tuple (real, imag) dari array real.

6.14.1. Masukan real, keluaran magnitudo

Ketika aplikasi hanya memberi masukan real dan hanya membutuhkan spektrum magnitudo:

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

Hasilnya adalah ndarray real dengan panjang yang sama dengan masukan. Fungsi bantu spectrogram() melakukan hal yang persis sama tanpa alokasi perantara -- panggilan yang tepat di dalam loop streaming.

6.14.2. Transformasi balik

ifft() dinormalisasi sehingga perjalanan bolak-balik mengembalikan masukan asli dalam batas kesalahan floating-point. Kedua panggilan menerima dan mengembalikan sepasang array real:

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

6.14.3. Mencari frekuensi dominan

Pola umum adalah mencari puncak terbesar dalam buffer sampel -- audio, getaran, IR termodulasi. Resepnya:

  1. Ambil N sampel, dengan N merupakan pangkat dua.

  2. Lakukan FFT.

  3. Cari bin dengan magnitudo terbesar.

  4. Konversikan indeks bin ke Hz menggunakan laju sampel.

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