Mengenal spectogram

1,524 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