Showing posts with label FFT. Show all posts
Showing posts with label FFT. Show all posts

Friday, October 14, 2011

FFT dari Sinyal Sinus di Matlab/Octave

Seharusnya, bila kita membuat sinyal sinusoidal dengan frekuensi 20 Hz, maka kalau kita fft-kan (fourrier transform-kan) sinyal tersebut memiliki frekuensi tunggal pada sumbu X=20. Bila tidak, atau plotnya menunjukkan spektrum yang tidak beraturan, maka gambar dan teknik yang kita gunakan tersebut salah.
Sinyal Sin 20 Hz dan FFT -nya
Cek dan run listing code matlab di bawah untuk menghasilkan FFT dari sinyal sinus yang match dengan frekuensinya.
% Sampling frequency 
Fs = 1024; 
% Time vector of 1 second 
t = 0:1/Fs:1; 
% Create a sine wave of 20 Hz.
x = sin(2*pi*t*20);
% Use next highest power of 2 greater than or equal to length(x) to calculate FFT.
nfft= 2^(nextpow2(length(x)));

% Take fft, padding with zeros so that length(fftx) is equal to nfft
fftx = fft(x,nfft);

% Calculate the numberof unique points
NumUniquePts = ceil((nfft+1)/2);

% FFT is symmetric, throw away second half
fftx = fftx(1:NumUniquePts);

% Take the magnitude of fft of x and scale the fft so that it is not a function of the length of x
mx = abs(fftx)/length(x);

% Take the square of the magnitude of fft of x.
mx = mx.^2;

% Since we dropped half the FFT, we multiply mx by 2 to keep the same energy.
% The DC component and Nyquist component, if it exists, are unique and should not be multiplied by 2.
if rem(nfft, 2) % odd nfft excludes Nyquist point
  mx(2:end) = mx(2:end)*2;
else
  mx(2:end -1) = mx(2:end -1)*2;
end

% This is an evenly spaced frequency vector with NumUniquePts points.
f = (0:NumUniquePts-1)*Fs/nfft;

% Generate the plot, title and labels.
subplot(211); plot(x);
title('Waveform of a 20Hz Sine Wave');
xlabel('Time');
ylabel('Amplitude');
subplot(212); plot(f,mx);
title('Power Spectrum of a 20Hz Sine Wave');
xlabel('Frequency (Hz)');
ylabel('Power');
Source: Mathwork

Friday, May 01, 2009

Pengolahan Sinyal Akustik

Ada beberapa cara untuk merekam dan menganalisa sinyal suara dengan software Matlab. Untuk perekaman, bisa melalui daq toolbox (data acquisition), perintah wavrecord serta audiorecorder. Semua teknik tersebut mensyaratkan adanya souncard yang telah terpasang, baik internal maupun eksternal.

Berikut proses perekaman dengan perintah wavrecord:

>> Fs=8000;   % deklarasi frekuensi sampling
>> y=wavrecord(5.0*Fs,Fs); % merekam suara selama lima detik
>> figure(1);
>> plot(y);    % menggambar bentuk gelombang
>> wavwrite(y,Fs,'aiueo.wav') % menyimpan file .wav

hasil perintah diatas adalah sebagai berikut:
Gb.1 Waveform Sinyal Akustik


Gambar diatas adalah plot sinyal suara dalam domain waktu yang biasa disebut waveform. Pada Matlab, amplitudo sinyal akan dibatasi pada range [-1 1] dikarenakan ini adalah sinyal teganan yang dinormalisasi (encoding PCM) dan tidak bersatuan. Sedangkan pada sumbu-x grafik diatas adalah masih dalam sample point (jumlah sample) bukan dalam satuan detik. Untuk menjadikan sumbu-x menjadi detik, maka dapat kita definisikan variabel t sebagai berikut,

t = 1/Fs:1/Fs:length(y)/Fs;
plot(t,y)

Simple bukan..? Next analysis....

Analisis

Hampir semua analisa sinyal dilakukan dalam domain waktu dan frekuensi, karena itulah disebut time-frequency analysis. Dalam domain waktu, sinyal digambarkan dengan bentuk waveform dimana sumbu-x menunjukkan time dan sumbu-y menunjukkan besarnya amplitude tiap waktu. Bentuk ini kadang kurang informatif karena kita tidak bisa mengetahui besarnya magnitude tiap waktu. Untuk itu diperlukan sebuah transformasi yang mampu mengubah waveform menjadi spectrum, dimana tiap komponen frekuensi akan terlihat jelas. Nah, Fourier Transform merupakan tranformasi yang dapat melakukan hal ini. Apalagi ditambah dengan adanya FFT atau Fast Fourier Transform, maka waktu komputasi akan menjadi lebih cepat sehingga memudahkan analisa sinyal suara. Output dari FFT berupa spectrum yang menggambarkan grafik frekuensi dengan magnitudo.

Berikut cara mengubah waveform dari sinyal y hasil perekaman menjadi spectrum dengan teknik sekaligus perintah fft: