Penerapan Convolution 1D pada Sinyal

By | September 1, 2023
686 Views

Operasi Convolution telah banyak kita gunakan tapi lebih kepada 2D, seperti yang telah dijelaskan pada dokumentasi pytorch mengenai operasi Conv2d dengan input berupa tensor N, C, H, W yaitu N jumlah batch/record, C adalah channel seperti grayscale atau RGB, dan H dan W merupakan dimensi dari array yaitu Height dan Width. Misalkan kita mempunyai tensor terdiri dari 18 gambar dengan format RGB dan ukuran dimensi 256 x 256 maka bila dibuat dalam random value tensor yaitu tensor.rand(18,3,256,256) ref: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

Bagaimana dengan Convolution 1D untuk data seperti sinyal digital? Sinyal digital juga mempunyai channel seperti mono atau stereo serta punya length/banyaknya data. Seperti pada penjelasan dokumentasi di https://pytorch.org/docs/stable/generated/torch.nn.Conv1d.html menggunakan urutan N, C, L yaitu N jumlah batch/record, C adalah channel seperti mono atau stereo dan L adalah length untuk jumlah panjang data.

Amplitudo dan Frekeunsi apakah berubah setelah Convolution?

Convolution pada gambar bisa terlihat dengan jelas seperti berikut

Nah bagaimana dengan Sinyal? apakah kita bisa melihat perbedaanya? melalui paramater amplitudio dan frekuensi?

 

Misalkan kita punya sinyal sinus dengan frekeuensi 3 Hz dan mode mono dengan frekuensi sampling sebanyak 100 kali, bisa kita presentasikan sebagai berikut (kalian bisa baca Additve White Gaussian Noise pada Sinyal

import numpy as np
from matplotlib import pyplot as plt

fs = 100 #frekuensi sampling
t = np.linspace(0,1,fs) # 1 detik
f1 = 3 # 3 hz
y1 = np.sin(2*np.pi*f1*t)

plt.figure()
plt.plot(t,y1)
plt.xlabel('1 detik')
plt.ylabel('Amplitudo')
plt.title('Sinyal Sinus dengan frekuensi 3 Hz')
plt.show()

Sinyal Sinus 3 Hz

Untuk menyiapkan dalam bentuk tensor, maka kita ubah dulu dimensinya sekalian yang semula y1 punya dimensi (100,) menjadi

(1,1,100) yang artinya 1 sinyal dengan mode mono dan 100 length nya

import torch
import torch.nn as nn

y_reshape = y1.reshape(1,1,fs)
y_tensor = torch.from_numpy(y_reshape).float()

Kita akan convolution 1D dengan out_channel menjadi 5 dan kernel_size 3

out_channel = 5

block3 = nn.Conv1d(in_channels = 1, out_channels= out_channel, kernel_size=3)
result1 = block3(y_tensor)

plt.figure()
plt.title('Operasi Convolution 1D')
plt.plot(y1)
for i in range(0,out_channel):
    plt.plot(result1[0,i,:].detach().numpy())
plt.legend(['Sinyal','out1','out2','out3','out4','out5'])
plt.show()

Operasi Convolutional 1D pada Sinyal Sinus dan Output Channel

Seperti yang kalian bisa lihat operasi conv1d dapat digunakan membuat fitur dari sinyal sinus yang bila kita lihat akan ada perbedaaan yaitu

  • beda amplitudo bisa dilihat yang tadi semula +1 sd -1 hanya menjadi +0.75 sd -0.75
  • tapi apakah beda frekuensinya?

Sekilas sih menjadi berbeda-beda amplitudo nya Pengolahan Sinyal Digital dengan Matlab untuk mengetahui frekuensi, maka kita butuh FFT.

Mari kita cari FFT https://docs.scipy.org/doc/scipy/tutorial/fft.html

from scipy.fft import fft, fftfreq
yf = fft(y1)
xf = fftfreq(fs, 1/fs)[:fs//2]
plt.figure()
plt.plot(xf, 2.0/fs * np.abs(yf[0:fs//2]))
plt.title('Domain Frekuensi')
plt.show()

Kalian bisa melihat peak berada pada angka 3 alias 3 Hz

Sinyal 3 Hz

Yuk kita hitung out dari masing-masing Conv1D diatas apakah frekuensinya berubah? hemm ternyata tidak berubah yaitu semuanya masih di 3 Hz (ternyata hanya berubah amplitudonya saja)

plt.figure()
plt.plot(xf, 2.0/fs * np.abs(yf[0:fs//2]))
plt.title('Domain Frekuensi')
for i in range(0,out_channel):
    y_out = fft(result1[0,i,:].detach().numpy())
    plt.plot(xf, 2.0/fs * np.abs(y_out[0:fs//2]))
plt.legend(['Sinyal','out1','out2','out3','out4','out5'])
plt.xlabel('frekuensi')
plt.ylabel('magnitudo')
plt.show()