Mengenal spectogram

By | May 18, 2025
320 Views

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?

  1. Bagi sinyal jadi segmen kecil (frame)

  2. Lakukan FFT pada tiap segmen → dapatkan frekuensi

  3. Ambil magnitudo dari FFT (abaikan fase)

  4. Konversi ke dB (untuk visualisasi lebih jelas)

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

 

See also  Penerapan Convolution 1D pada Sinyal