Thursday, October 1, 2015

Algoritma FFT untuk DFT di MATLAB

Dengan Nama Allah Sang Maha Pengasih Sang Maha Penyayang
 
Saya sempat ditanya teman untuk menebak frekuensi sinyal Road Profile Class-C dengan fungsi fft nya MATLAB. Alhamdulillah, Product Help nya MATLAB bisa ditanya. Saya tulis dan terjemahkan di sini dengan sedikit tambahan tafsiran. Semoga bermanfaat.

Fast Fourier Transform (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. Umumnya, suatu sinyal diskrit/kontinyu terbentuk dari campuran beberapa sinyal dengan frekuensi berbeda. Misalnya, pada kasus bercampurnya sinyal informasi dan noise, FFT dapat membantu kita mengetahui pada frekuensi berapa sinyal informasi berada dan pada frekuensi berapa noise mendominasi.

Algoritma FFT

Perhitungan FFT dinyatakan dengan persamaan

clip_image001

Keterangan:
X(k) adalah hasil transformasi fourier diskrit dari x[k], memuat nilai-nilai magnitud sinyal untuk k = 0, 1, ... N
x(k) yang dinyatakan dalam x(j) adalah sinyal waktu diskrit
N adalah panjang sinyal x(k)

clip_image003
 
Contoh

Dalam contoh ini, transformasi Fourier akan digunakan untuk menemukan frekuensi sinyal informasi yang telah bercampur noise. Data di-sampling pada 1000 Hz. Sinyal informasi pada frekuensi 50 Hz memiliki amplitudo 0.7 dan pada 120 Hz amplitudo 1 bercampur dengan noise acak dengan rerata nol.

Kode untuk generate sinyal informasi dan noise

Fs = 1000; % Frekuensi sampling
T = 1/Fs; % Periode sampling
L = 1000; % Panjang sinyal informasi
t = (0:L-1)*T; % Vektor waktu
% Jumlahan sinus 50 Hz dan 120 Hz, sinyal informasi
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
y = x + 2*randn(size(t)); % Sinyal informasi plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

clip_image005
 
Sangat sulit untuk mengenali frekuensi sinyal dengan melihat sinyal aslinya. Kita perlu mengonversi sinyal ini ke domain frekuensi dengan algoritma FFT.

Kode untuk konversi sinyal ke domain frekuensi dengan fungsi fft MATLAB

NFFT = 2^nextpow2(L);
% NFFT adalah panjang vektor hasil perhitungan FFT. Baiknya adalah bilangan dari angka 2 yang dipangkatkan, dan sedikit lebih panjang dari sinyal informasi. Sehingga digunakanlah fungsi nextpow2.


Y = fft(y,NFFT)/L;
% Untuk mendapatkan normalisasi magnitud sinyal, nilai hasil FFT harus dibagi dengan L (panjang data)


f = Fs/2*linspace(0,1,NFFT/2);
% Vektor frekuensi untuk plot spektrum frekuensi. Pembagi dua pada Fs/2 dan NFFT/2 digunakan karena vektor Y bersifat simetris. Y(1)=Y(NFFT); Y(2)=Y(NFFT-1); dst. Y(1) untuk frekuensi 0 dan Y(NFFT) untuk frekuensi 2π. Jadi plot spektrum frekuensi cukup mengambil data Y(1) s.d. Y(NFFT/2).


% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2)))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')



clip_image007

Amplitudo sinyal informasi tidak tepat 0.7 dan 1 karena pengaruh noise. Selain itu juga karena panjang sinyal x(k) terbatas. Mengubah nilai L dari 1000 ke 10000 pada contoh ini akan menghasilkan nilai amplitudo yang lebih tepat.

Sekian. Mudah2an bermanfaat.

Penyusun

M. Nur Qomarudin, +62 85733484101, alfiyahibnumalik@gmail.com

Bila tulisan ini dirasa bermanfaat, saya berharap pembaca berkenan mendoakan saya dengan kebaikan atau dengan membacakan surat al-Fatihah. Terimakasih.

Referensi

[1] MATLAB 7.6.0 Product Help

12 comments:

  1. FFT2 dalam filtering gunanya apa?

    ReplyDelete
    Replies
    1. mohon maaf, sy belum pernah menggunakan FFT2, jadi belum bisa menjawab. trims

      Delete
  2. Halo,
    Trims informasi ny.
    Namun, bgmn anda mengetahui frekuensi sinyal derau pd sinyal tersebut?

    ReplyDelete
    Replies
    1. sinyal derau disini tidak untuk diketahui, tetapi ditentukan untuk keperluan simulasi plot fourier. disini digunakan random noise. trims

      Delete
  3. mas download matlabx susah. minta bantu boleh kirim install softwarex d email

    ReplyDelete
  4. jazakallahufik atas infonya.. mas kira-kira file gelombang PWM dalam format csv yang saya simpan pada oscilloscope bisa gak ditampilkan FFTnya pada matlab,. kalo bisa kira-kira bagaimana langkah-langkahnya terimakasih.

    ReplyDelete
    Replies
    1. file csv bisa diimpor data ke MATLAB lalu disimpan di workspace dalam tipe array. Bila sudah dalam workspace, bisa gunakan code di atas untuk membuat plot fft. maturnuwun

      Delete
  5. izin bertanya mas, kl untuk hasil dari matlab ini dimasukan ke dalam bahasa arduino bisa ngga ya?kl bisa caranya gmn ya mas?terima kasih mas

    ReplyDelete