Getaran mesin yang rusak “berbunyi” berbeda dari mesin sehat — komponen 50 Hz dari jala-jala listrik menyusup ke hampir semua pengukuran laboratorium. Derau dan interferensi seperti ini paling mudah dikenali di ranah frekuensi, bukan di ranah waktu. Analisis sinyal membalik sudut pandang itu: kita membedah sinyal menjadi komponen frekuensinya dengan FFT, mengenali frekuensi dominan, lalu meredam bagian yang tidak diinginkan dengan filter. Chapter ini membangun seluruh alurnya di MATLAB — dari sinyal sintetis dua frekuensi sampai filter moving average — dengan setiap angka yang bisa diverifikasi ulang.
- Sinyal diskret: sampling rate, jumlah sampel, dan lebar bin
- FFT dan normalisasi spektrum amplitudo satu sisi
- Deteksi frekuensi dominan dengan logika local maximum
- Filter moving average dengan fungsi
filter
Sinyal sebagai Data Tersampling #
Sinyal di MATLAB bukan kurva mulus, melainkan vektor nilai yang diambil berjarak tetap. Dua angka mengatur seluruh geometrinya: sampling rate fs (jumlah sampel per detik) dan durasi rekaman. Dari keduanya turun jumlah sampel N, periode sampling Ts = 1/fs, dan lebar bin spektrum fs/N — resolusi frekuensi kita. Sinyal uji cukup kita rangkai dari dua sinus murni:
fs = 1000; % sampling rate (Hz)
Ts = 1/fs; % periode sampling (s)
t = 0:Ts:0.5-Ts; % 500 sampel, durasi 0.5 s
N = numel(t);
x = 0.8*sin(2*pi*50*t) + 0.4*sin(2*pi*120*t);
fprintf('N = %d sampel, fs = %d Hz, lebar bin = %.1f Hz\n', N, fs, fs/N);Output yang Dihasilkan:
N = 500 sampel, fs = 1000 Hz, lebar bin = 2.0 HzMari kita bedah baris-baris kode di atas:
- Baris 3 (
0:Ts:0.5-Ts): vektor waktu berhenti di0.5-Ts— 500 titik yang membentang tepat 0.5 detik; sampel ke-501 dihindari supaya 25 siklus penuh frekuensi 50 Hz terjadi utuh tanpa kebocoran spektral. - Baris 5 (
x = ...): amplitudo 0.8 pada 50 Hz dan 0.4 pada 120 Hz — kedua frekuensi ini adalah “jawaban” yang nanti harus ditemukan kembali oleh analisis. - Baris 6 (
fs/N): 1000/500 = 2 Hz — spektrum nanti hanya bisa membedakan frekuensi dengan jarak minimal 2 Hz.
Aturan sampling paling terkenal datang dari teorema Nyquist: fs harus lebih dari dua kali frekuensi tertinggi sinyal. Pelanggarannya tidak sekadar kabur — frekuensi tinggi menyamar sebagai frekuensi rendah (aliasing):
xa = sin(2*pi*600*t);
XA = abs(fft(xa))/N;
XA1 = XA(1:floor(N/2)+1);
XA1(2:end-1) = 2*XA1(2:end-1);
[~, iMax] = max(XA1);
fprintf('sinyal 600 Hz terlihat sebagai %.0f Hz (aliasing)\n', f(iMax));Output yang Dihasilkan:
sinyal 600 Hz terlihat sebagai 400 Hz (aliasing)Alur analisis sinyal pada chapter ini dapat dipetakan sebagai pipeline berikut:
Diagram tersebut dibaca dari kiri: sinyal kontinu diubah menjadi vektor sampel, FFT memproyeksikannya ke ranah frekuensi, normalisasi mengembalikan skala amplitudo asli, deteksi puncak menandai frekuensi dominan, dan filter membersihkan derau bila perlu.
FFT dan Spektrum Amplitudo #
Fungsi fft(x) menghitung Discrete Fourier Transform — dekomposisi x menjadi N komponen kompleks pada frekuensi 0 sampai (N-1)*fs/N. Nilai absolutnya abs(X) adalah besar tiap komponen, tetapi ada dua pekerjaan tambahan sebelum angkanya bisa dibaca sebagai amplitudo: bagi dengan N (energi tersebar ke seluruh bin), lalu kalikan dua pada spektrum satu sisi (komponen frekuensi positif dan negatif saling bercermin):
X = fft(x);
P2 = abs(X)/N; % normalisasi jumlah sampel
P1 = P2(1:floor(N/2)+1); % potong sisi negatif
P1(2:end-1) = 2*P1(2:end-1); % faktor 2 karena dipotong
f = fs*(0:floor(N/2))/N; % sumbu frekuensi 0..fs/2Sumbu f di atas ekuivalen dengan linspace(0, fs/2, floor(N/2)+1). Untuk melihat spektrum lengkap dua sisi, fungsi fftshift memutar indeks sehingga frekuensi nol duduk di tengah vektor:
Xd = fftshift(X); % pindahkan nol frekuensi ke tengah
md = abs(Xd)/N; % amplitudo per sisi (tanpa faktor 2)
fd = (-N/2 : N/2-1) * (fs/N); % sumbu frekuensi -fs/2 .. fs/2
fprintf('dua sisi: mag(-50 Hz) = %.3f, mag(+50 Hz) = %.3f\n', ...
md(fd == -50), md(fd == 50));Output yang Dihasilkan:
dua sisi: mag(-50 Hz) = 0.400, mag(+50 Hz) = 0.400Komponen 50 Hz terbelah rata menjadi 0.400 + 0.400 di dua sisi spektrum — itulah asal faktor 2 pada bentuk satu sisi. Setelah spektrum beres, frekuensi dominan tinggal dicari: sebuah puncak adalah bin yang lebih besar dari kedua tetangganya sekaligus melewati ambang:
naik = [false, P1(2:end) > P1(1:end-1)];
turun = [P1(1:end-1) >= P1(2:end), false];
puncak = find(naik & turun & P1 > 0.2);
fprintf('frekuensi dominan : ');
fprintf('%.0f Hz ', f(puncak));
fprintf('\n');
fprintf('amplitudo puncak : ');
fprintf('%.2f ', P1(puncak));
fprintf('\n');Output yang Dihasilkan:
frekuensi dominan : 50 Hz 120 Hz
amplitudo puncak : 0.80 0.40 Analisis menemukan kembali persis dua angka yang kita tanam di sinyal: 50 Hz beramplitudo 0.80 dan 120 Hz beramplitudo 0.40.
Filter Moving Average #
Sinyal nyata jarang setenang x sintetis kita. Kita tambahkan derau Gaussian baku 0.2 dengan seed tetap rng(42) agar hasil reproducible, lalu haluskan dengan moving average — rata-rata bergerak 4 sampel berturutan. Implementasinya satu baris lewat fungsi filter(b, 1, x):
rng(42); % seed tetap agar reproducible
xn = x + 0.2*randn(size(x)); % sinyal + derau Gaussian
b = ones(1,4)/4; % koefisien FIR: rata-rata 4 sampel
xf = filter(b, 1, xn);Mekanisme filter(b, 1, xn): setiap sampel keluaran adalah jumlah tertimbang 4 sampel masukan dengan bobot b — filter FIR (finite impulse response) orde empat. Rata-rata bergerak meredam komponen yang berosilasi cepat, dan melewatkan komponen lambat: itulah perilaku lowpass. Besar redamannya bisa dihitung dari rumus respons frekuensi:
H = @(fq) abs(sin(pi*fq*4/fs) / (4*sin(pi*fq/fs))); % gain FIR
fprintf('gain MA @ 50 Hz = %.3f, @ 120 Hz = %.3f, @ 495 Hz = %.3f\n', ...
H(50), H(120), H(495));Output yang Dihasilkan:
gain MA @ 50 Hz = 0.939, @ 120 Hz = 0.678, @ 495 Hz = 0.016Gain 0.939 pada 50 Hz berarti sinyal utuh hampir 94 persen; komponen dekat Nyquist pada 495 Hz tinggal 1.6 persen. Apakah kedua frekuensi dominan selamat dari penyaringan? Spektrum hasil filter dihitung ulang dan puncaknya dideteksi dengan logika yang sama:
XF = abs(fft(xf))/N;
XF1 = XF(1:floor(N/2)+1);
XF1(2:end-1) = 2*XF1(2:end-1);
naikF = [false, XF1(2:end) > XF1(1:end-1)];
turunF = [XF1(1:end-1) >= XF1(2:end), false];
puncakF = find(naikF & turunF & XF1 > 0.15);
fprintf('puncak setelah MA: ');
fprintf('%.0f Hz ', f(puncakF));
fprintf('\n');Output yang Dihasilkan:
puncak setelah MA: 50 Hz 120 Hz Kedua puncak tetap terdeteksi — derau tinggi frekuensi tertelenjang, sinyal 50 dan 120 Hz bertahan. Kualitas sinyal sering diringkas satu angka: signal-to-noise ratio (SNR), yaitu 10*log10(daya_sinyal/daya_derau) dalam desibel. Sinyal kita memiliki daya (0.8^2 + 0.4^2)/2 = 0.4 dan derau 0.2^2 = 0.04, sehingga SNR awal 10 dB; setelah penyaringan, lantai spektrum pada plot turun jauh — penampakan visual dari SNR yang membaik.
Berkas contoh.m menjalankan pipeline utuh — sinyal, FFT dua sisi dan satu sisi, deteksi puncak, filter, aliasing, dan plot sinyal-nya-spektrum — dalam satu script.
Ringkasan #
Sinyal diskret ditentukan oleh fs dan N, dengan lebar bin fs/N dan syarat Nyquist fs > 2*f_maks — pelanggarannya membuat 600 Hz tampil sebagai 400 Hz. fft mengubah ranah waktu ke frekuensi; pembacaan amplitudo menuntut pembagian N dan faktor 2 pada spektrum satu sisi, sementara fftshift menyajikan pandangan dua sisi yang simetris. Frekuensi dominan ditemukan dengan logika sederhana: mengungguli kedua tetangga dan melewati ambang. Filter moving average via filter(b, 1, x) meredam komponen tinggi (gain 0.016 pada 495 Hz) tanpa menggugurkan puncak 50 dan 120 Hz — bukti bahwa analisis frekuensi dan filtering saling melengkapi.