Friday, February 01, 2019

Zero Padding dan efeknya pada FFT

Zero padding berarti menambahkan nol diakhir sinyal. Misal kita memiliki vektor x sebagai berikut,

x=[0 1 2 3 1 2 3 2 4 3]

Vektor tersebut memiliki ukuran 10 data. Zero padding adalah menambahkan nol di belakang vektor tersebut, misalnya kita tambahkan lima nol di belakang data terakhir sehingga menjadi,

x=[0 1 2 3 1 2 3 2 4 3 0 0 0 0 0]

Zero padding banyak dipakai untuk menyamakan ukuran vektor/matriks. Pada machine learning/deep learning, ukuran input harus sama, dan zero padding dilakukan untuk tujuan tersebut (menyamakan ukuran input). Pada analisa sinyal di domain frekuensi, zero padding ini biasanya digunakan agar spektrum yang kita plot menjadi lebih halus.

Implementasi dengan Python

Implementasi zero padding dengan python bisa bermacam-macam, salah satunya dengan np.pad (salah lainnya dengan menggunakan np.zeros).

Contohnya adalah sebagai berikut:

>>> x = np.array([1, 2, 3, 4, 5])
>>> xpad = np.pad(x, (0, 5), 'constant')  # menambahkan lima nol di belakang vektor a
>>> x
    [1, 2, 3, 4 , 5, 0, 0, 0, 0, 0]

Efek terhadap FFT

Untuk apa menambahkah nol di akhir sinyal? Untuk memperhalus tampilan FFT agar lebih mudah difahami. Perhatikan skrip python berikut dan plot hasilnya.

#!/usr/share/env python3
# demo zeropadding
# dimodifikasi dari: https://dsp.stackexchange.com/questions/10363/algorithm-to-zero-pad-data-before-fft
# ada implementasi yang lebih mudah dari ini yakni dengan menggunakan np.pad
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, fftshift
Fs = 16000 # Frekuensi sampling
f0 = 5000 # Frekuensi tengah
N = 128 # Samples dalam domain waktu
K = 8 # faktor Zero-pad
# Buat indeks watu
t = np.linspace(0, N/Fs, N)
# Buat sinyal dengan panjang N*Fs pada frekuensi f0 Hz
x = np.cos(2*np.pi*f0*t)/N
# membuat zeropad dengan faktor K-1 kali panjang x dengan zeros
# xpad = np.concatenate((x, np.zeros((K-1)*len(x))))
# bisa juga dengan np.pad seperti ini:
xpad = np.pad(x,(0, (K-1)*len(x)), 'constant')
# Hitung fft dari x dan xpad
xf = np.abs(fftshift(fft(x, len(x))))
xpadf = np.abs(fftshift(fft(xpad, len(xpad))))
# plot hasil
plt.plot(np.linspace(-N/2.0,N/2.0, len(x)), xf, color='b', lw=1.5)
plt.plot(np.linspace(-N/2.0,N/2, len(xpad)),xpadf,color='r', lw=1.5)
plt.show()


Hasil:
Spektrum tanpa zero padding (biru) dan dengan zero padding (merah).
Zero padding (red) vs Non zero padding (blue)
Agar lebih jelas, kita zoom sebagai berikut.
Disini terlihat lebih jelas perbedaan spektrum setelah zero padding
Selamat belajar, semoga bermanfaat.

Bonus:
- Keras/TensorFlow menyediakan fungsi pad_sequences untuk menyamakan ukuran semua vektor dalam matriks. Panggil dengan,
from keras.preprocessing.sequence import pad_sequences
Related Posts Plugin for WordPress, Blogger...