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()
