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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) |
![]() |
Disini terlihat lebih jelas perbedaan spektrum setelah zero padding |
Bonus:
- Keras/TensorFlow menyediakan fungsi pad_sequences untuk menyamakan ukuran semua vektor dalam matriks. Panggil dengan,
from keras.preprocessing.sequence import pad_sequences