Le spectrogramme : variations spectrales du son dans le temps

Machine Learning for Time Series Data in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Transformées de Fourier

  • Une série temporelle se décrit comme un mélange de composantes rapides et lentes
  • À chaque instant, on peut indiquer la présence relative de ces composantes
  • La manière la plus simple de le faire est la transformée de Fourier
  • Elle convertit une série temporelle en un tableau décrivant un mélange d'oscillations
Machine Learning for Time Series Data in Python

Une transformée de Fourier (FFT)

Machine Learning for Time Series Data in Python

Spectrogrammes : combinaisons de fenêtres de transformées de Fourier

  • Un spectrogramme est une série de transformées de Fourier fenêtrées dans le temps
  • Comme pour une moyenne glissante :
    1. Choisir une taille et une forme de fenêtre
    2. À un instant donné, calculer la FFT sur cette fenêtre
    3. Faire glisser la fenêtre d'un cran
    4. Agréger les résultats
  • On appelle cela la transformée de Fourier à court terme (STFT)
Machine Learning for Time Series Data in Python

Machine Learning for Time Series Data in Python

Calculer la STFT

  • On peut calculer la STFT avec librosa
  • Plusieurs paramètres sont réglables (p. ex. la taille de fenêtre)
  • Ici, on convertira en décibels pour normaliser la moyenne des fréquences
  • On peut ensuite l'afficher avec la fonction specshow()
Machine Learning for Time Series Data in Python

Calculer la STFT en code

# 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 for Time Series Data in Python

Ingénierie de caractéristiques spectrales

  • Chaque série temporelle a une signature spectrale différente.
  • On peut l'estimer en analysant le spectrogramme.
  • Par exemple, la largeur de bande spectrale et le centroïde spectral indiquent où se trouve l'essentiel de l'énergie à chaque instant

Machine Learning for Time Series Data in Python

Calculer des caractéristiques spectrales

# 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 for Time Series Data in Python

Combiner caractéristiques spectrales et temporelles dans un classifieur

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 for Time Series Data in Python

Passons à la pratique !

Machine Learning for Time Series Data in Python

Preparing Video For Download...