Thursday, April 27, 2017

Eliminasi Nilai DC pada Sinyal dengan FFT

Tulisan versi PDF [unduh]

Bismillah. Seorang sahabat Nusantara yang sedang riset di Australia memiliki data hasil ukur accelerometer dari sebuah kendaraan dan beliau ingin mendapatkan nilai posisi dengan melakukan integrasi ganda pada data tersebut. Untuk integrasi ganda, ia menggunakan metode yang dirumuskan oleh Slifka [1]. Ada fragmen kode yang ia tanyakan kepada saya, yaitu terkait peran FFT dalam metode tersebut, untuk apa dan bagaimana algoritma penerapannya. Tulisan ini adalah untuk menjelaskan hal tersebut dan untuk siapa saja yang menjumpai pertanyaan yang sama. Mudah2an bermanfaat.

Sekilas Tentang FFT

FFT adalah nama algoritma yang paling populer untuk komputasi Transformasi Fourier Diskrit dari suatu sinyal diskrit x[k]. Hasil dari FFT adalah spektrum magnitud terhadap frekuensi dari suatu sinyal diskrit. Dalam MATLAB, FFT telah disiapkan sebagai fungsi siap pakai dan juga fungsi inversinya. Penjelasan ini saya terjemah bebaskan dari MathWorks [2].

Y = fft(X) and X = ifft(Y) adalah fungsi untuk transformasi Fourier dan inversnya. Misalnya X dan Y memiliki panjang n, transformasi tersebut dirumuskan dengan persamaan berikut:

[Persamaan]

Untuk penjelasan lebih lengkap khusus terkait FFT, pernah saya tulis di sini [3].

Kode MATLAB FFT untuk Integrasi

Di dalam buku tesisnya, Slifka [1] mengolah data percepatan kendaraan dari hasil ukur accelerometer untuk menjadi data posisi dengan metode integrasi ganda. Di dalam kode MATLAB yang ia susun, Slifka melibatkan FFT dan IFFT pada tiap integrasi. Berikut ini adalah fragmen kode MATLAB untuk integrasi tahap pertama untuk mengolah data percepatan (acc) menjadi kecepatan (vel).

%Perform 1st Integration
vel=Ts*cumtrapz(acc);
vel_0=-1*mean(vel);
Vel_Spect=fft(vel,length(t));
x=length(Vel_Spect);
%Set the First 46 values constant
Vel_Spect(1)=0.0775*Vel_Spect(46);
for i=2:45
    Vel_Spect(i)=0.0775*Vel_Spect(45);
    Vel_Spect(x-(i-2))=conj(Vel_Spect(i));
end
vel=real(ifft(Vel_Spect));
plot(t,vel), grid on;
xlabel('Time (sec.)'),ylabel('Amplitude (mm/sec)'),title('Velocity (after 1^s^t Integration) Vs. Time')

CATATAN

Beberapa catatan penting untuk memahami kode ini, sepengetahuan saya, antara lain:
  • Vel_Spect memuat spektrum frekuensi dari sinyal vel (hasil dari transformasi fourier terhadap sinyal vel)
  • Yang dimaksud values constant sepertinya magnitud spektrum frekuensi hasil FFT
  • Vel_Spect(1) = 0.0775*Vel_Spect(46) maksudnya, menyetarakan magnitud sinyal frekuensi 0 Hz (sinyal DC) dengan magnitud sinyal frekuensi ambang batas maksimal. Kode inilah yang berguna untuk mengeliminasi nilai DC pada sinyal.
  • Nilai 46 adalah batas indeks vektor Vel_Spect yang akan diolah, berfungsi sebagai frekuensi cut-off. Artinya, semua magnitud sinyal yang tersimpan pada indeks ke-47 dst tidak akan diolah untuk tahap selanjutnya.
  • Koefisien 0.0775 adalah nilai alfa untuk menyesuaikan magnitud sinyal.
Catatan2 di atas saya buat setelah memelajari algoritma di bawah ini.

Algoritma Eliminasi DC dengan FFT

Kode yang digunakan oleh Slifka di atas kurang lebih menyatakan algoritma eliminasi nilai DC dengan FFT. Algoritma ini saya lihat dari [4].


N adalah ukuran vektor FFT, k adalah nomor index dari koefisien FFT yang menyatakan frekuensi cut-off, dan α adalah koefisien filter yang kita tetapkan.

Algoritma di atas adalah algoritma FFT yang dapat digunakan untuk mengeliminasi sinyal frekuensi 0 HZ atau sinyal DC. Eliminasi tersebut dinyatakan dalam baris Xf(0) = α0Xf(k).

Bagian loop (for) menceritakan: Vektor Xf hasil dari FFT terbagi dalam dua bagian simetris, yaitu magnitud frekuensi sinyal dan juga pasangannya (conjugate). Ketika magnitud sinyalnya dikalikan dengan koefisien α maka pasangannya juga harus disesuaikan.

Kesimetrisan vektor Xf ini diperlukan pada fungsi IFFT di bawahnya, untuk mengembalikan vektor frekuensi ke domain waktu.

Gambar plot berikut mengilustrasikan sinyal asli dan sinyal hasil eliminasi nilai DC dengan algoritma FFT.
 


Gambar 1 Ilustrasi filter FIR dengan algoritma FFT [4]

Sinyal asli (Gambar a) setimbang di amplitudo 2 karena ada komponen sinyal DC. Spektrum frekuensi dari sinyal asli (b) menunjukkan bahwa pada frekuensi 0 Hz, magnitudnya bernilai 250. Setelah algoritma eliminasi DC dengan FFT diterapkan (c), magnitud frekuensi 0 Hz bernilai 0. Konversi ke domain waktu, menghasilkan sinyal yang setimbang di amplitudo 0.

CATATAN

Pada kasus pengukuran dengan accelerometer, intervensi hasil pengukuran oleh sinyal DC ini hampir selalu terjadi karena efek grafitasi bumi [4].

Penutup

Sekian. Mudah2an bermanfaat. Alhamdulillah.
Saran/kritik boleh disampaikan via WA: 0857 33 484 101, Email: alfiyahibnumalik@gmail.com
Arsip: http://mnurq.ga/

Referensi

[1] L. D. Slifka, An Accelerometer Based Approach to Measuring Displacement of A Vehicle Body, Dearborn: University of Michigan, 2004.
[2] Mathworks, "fft," Mathworks, [Online]. Available: https://www.mathworks.com/help/matlab/ref/fft.html. [Accessed April 2017].
[3] M. N. Qomarudin, “FFT untuk DFT @ MATLAB,” 1 Oktober 2015. [Online]. Available: http://www.mnurq.ga/2015/10/fft-untuk-dft-matlab.html. [Diakses April 2017].
[4] T. M. Do and T. C. Le, "Performance Analysis of FFT Filter to Measure Displacement Signal in Road Roughness Profiler," International Journal of Computer and Electrical Engineering, vol. 5, no. 4, pp. 356-361, 2013.

No comments:

Post a Comment