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)
Algoritma 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
Keterangan:
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)
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)')
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)|')
% 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)|')
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.
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.
FFT2 dalam filtering gunanya apa?
ReplyDeletemohon maaf, sy belum pernah menggunakan FFT2, jadi belum bisa menjawab. trims
DeleteHalo,
ReplyDeleteTrims informasi ny.
Namun, bgmn anda mengetahui frekuensi sinyal derau pd sinyal tersebut?
sinyal derau disini tidak untuk diketahui, tetapi ditentukan untuk keperluan simulasi plot fourier. disini digunakan random noise. trims
DeleteJazaakallahu khoiron...
ReplyDeleteBarokallahu laka brother..
Deletemas download matlabx susah. minta bantu boleh kirim install softwarex d email
ReplyDeletemaaf... filenya gueede banget...
Deletejazakallahufik 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.
ReplyDeletefile 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
Deleteizin 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
ReplyDeletemaaf, saya tdk tahu bahasa Arduino
Delete