
Spektrogram adalah representasi visual dari spektrum frekuensi suatu sinyal audio terhadap waktu. Ia menunjukkan bagaimana frekuensi dalam sebuah sinyal berubah seiring waktu dan seberapa kuat (kuat = “amplitudo” atau “intensitas”) setiap frekuensi tersebut. Sinyal audio biasanya direpresentasikan sebagai waveform (amplitudo vs waktu). Tapi waveform tidak memberitahu kita frekuensi apa yang ada dalam sinyal tersebut, terutama frekuensi yang berubah-ubah seperti pada suara manusia atau musik. Untuk itu, kita gunakan transformasi waktu-frekuensi: Short-Time Fourier Transform (STFT).
Apa itu Spektrogram?
Spektrogram = hasil visualisasi dari STFT.
Sumbu:
-
X-axis = waktu (detik)
-
Y-axis = frekuensi (Hz, atau bisa logaritmik)
-
Warna = intensitas/amplitudo (biasanya dalam dB)
Bagaimana cara membuatnya?
-
Bagi sinyal jadi segmen kecil (frame)
-
Lakukan FFT pada tiap segmen → dapatkan frekuensi
-
Ambil magnitudo dari FFT (abaikan fase)
-
Konversi ke dB (untuk visualisasi lebih jelas)
-
Plot hasilnya dalam 2D (waktu × frekuensi, warna = amplitudo)
Kapan Spektrogram Berguna?
-
Analisis suara manusia (pidato, nyanyian)
-
Deteksi noise atau kerusakan audio
-
Klasifikasi suara (misalnya suara binatang, musik)
-
Analisis pitch, harmoni, dan ritme
-
Pelatihan model ML untuk pengenalan suara
Berikut contoh sinyal suara menggunakan grafik domain waktu vs amplitudo
Contoh spektogram 2 Dimensi dengan librosa
import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np y, sr = librosa.load('audio.wav') S = librosa.stft(y) S_db = librosa.amplitude_to_db(np.abs(S), ref=np.max) plt.figure(figsize=(12, 6)) librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='log', cmap='magma') plt.colorbar(format='%+2.0f dB') plt.title('Spectrogram') plt.tight_layout() plt.show()
Spektogram 3 Dimensi
Kita bisa juga menampilkan dalam versi 3 dimensi agar lebih jelas
import numpy as np import plotly.graph_objects as go from scipy.io import wavfile from scipy.signal import spectrogram # 1. Baca file audio (ganti dengan path file kamu) sample_rate, data = wavfile.read(SPEECH_FILE) # 2. Jika stereo, ambil salah satu channel if data.ndim > 1: data = data[:, 0] # 3. Hitung spektrogram frequencies, times, Sxx = spectrogram(data, fs=sample_rate, nperseg=1024) # 4. Konversi ke dB Sxx_dB = 10 * np.log10(Sxx + 1e-10) # 5. Buat plot 3D fig = go.Figure(data=[go.Surface(z=Sxx_dB, x=times, y=frequencies, colorscale='Viridis')]) # 6. Tata letak plot fig.update_layout( title='3D Spectrogram dari File Audio', scene=dict( xaxis_title='Time [s]', yaxis_title='Frequency [Hz]', zaxis_title='Power [dB]' ), width=1000, # Lebar piksel height=700, # Tinggi piksel autosize=False ) # 7. Tampilkan fig.show()