Lo spettrogramma - variazioni spettrali del suono nel tempo

Machine Learning per dati di serie temporali in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Trasformate di Fourier

  • I dati di serie temporali si descrivono come combinazione di componenti che cambiano rapidamente e lentamente
  • In ogni istante, possiamo descrivere la presenza relativa di componenti veloci e lente
  • Il modo più semplice per farlo è la Trasformata di Fourier
  • Converte una singola serie temporale in un array che la descrive come combinazione di oscillazioni
Machine Learning per dati di serie temporali in Python

Una Trasformata di Fourier (FFT)

Machine Learning per dati di serie temporali in Python

Spettrogrammi: combinazioni di finestre di trasformate di Fourier

  • Uno spettrogramma è una raccolta di trasformate di Fourier con finestra nel tempo
  • Come per una media mobile:
    1. Scegli dimensione e forma della finestra
    2. In un istante, calcola la FFT per quella finestra
    3. Fai scorrere la finestra di uno
    4. Aggrega i risultati
  • Si chiama Short-Time Fourier Transform (STFT)
Machine Learning per dati di serie temporali in Python

Machine Learning per dati di serie temporali in Python

Calcolare la STFT

  • Possiamo calcolare la STFT con librosa
  • Ci sono vari parametri da regolare (ad es. dimensione finestra)
  • Per il nostro uso, convertiremo in decibel per normalizzare i valori medi di tutte le frequenze
  • Poi possiamo visualizzarla con la funzione specshow()
Machine Learning per dati di serie temporali in Python

Calcolare la STFT con il codice

# Import the functions we'll use for the STFT
from librosa.core import stft, amplitude_to_db
from librosa.display import specshow
import matplotlib.pyplot as plt

# Calculate our STFT
HOP_LENGTH = 2**4
SIZE_WINDOW = 2**7
audio_spec = stft(audio, hop_length=HOP_LENGTH, n_fft=SIZE_WINDOW)

# Convert into decibels for visualization
spec_db = amplitude_to_db(audio_spec)

# Visualize
fig, ax = plt.subplots()
specshow(spec_db, sr=sfreq, x_axis='time', 
         y_axis='hz', hop_length=HOP_LENGTH, ax=ax)
Machine Learning per dati di serie temporali in Python

Feature spettrali

  • Ogni serie temporale ha un diverso profilo spettrale.
  • Possiamo calcolare questi profili analizzando lo spettrogramma.
  • Per esempio, spectral bandwidth e spectral centroids indicano dove si concentra l'energia in ogni istante

Machine Learning per dati di serie temporali in Python

Calcolare le feature spettrali

# Calculate the spectral centroid and bandwidth for the spectrogram
bandwidths = lr.feature.spectral_bandwidth(S=spec)[0]
centroids = lr.feature.spectral_centroid(S=spec)[0]

# Display these features on top of the spectrogram
fig, ax = plt.subplots()
specshow(spec, x_axis='time', y_axis='hz', hop_length=HOP_LENGTH, ax=ax)
ax.plot(times_spec, centroids)
ax.fill_between(times_spec, centroids - bandwidths / 2, 
                centroids + bandwidths / 2, alpha=0.5)
Machine Learning per dati di serie temporali in Python

Combinare feature spettrali e temporali in un classificatore

centroids_all = []
bandwidths_all = []
for spec in spectrograms:
    bandwidths = lr.feature.spectral_bandwidth(S=lr.db_to_amplitude(spec))
    centroids = lr.feature.spectral_centroid(S=lr.db_to_amplitude(spec))
    # Calculate the mean spectral bandwidth
    bandwidths_all.append(np.mean(bandwidths))  
    # Calculate the mean spectral centroid
    centroids_all.append(np.mean(centroids))  

# Create our X matrix
X = np.column_stack([means, stds, maxs, tempo_mean, 
                     tempo_max, tempo_std, bandwidths_all, centroids_all])
Machine Learning per dati di serie temporali in Python

Esercitiamoci!

Machine Learning per dati di serie temporali in Python

Preparing Video For Download...