Spectrograma - modificări spectrale ale sunetului în timp

Machine Learning pentru Date de Tip Șir de Timp în Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Transformate Fourier

  • Datele de tip serie temporală pot fi descrise ca o combinație de componente rapid-variabile și lent-variabile
  • La fiecare moment în timp, putem descrie prezența relativă a acestor componente
  • Metoda cea mai simplă se numește Transformata Fourier
  • Aceasta convertește o serie temporală într-un tablou ce descrie seria ca o combinație de oscilații
Machine Learning pentru Date de Tip Șir de Timp în Python

O Transformată Fourier (FFT)

Machine Learning pentru Date de Tip Șir de Timp în Python

Spectrograme: combinații de transformate Fourier cu fereastră

  • O spectrogramă reprezintă o colecție de transformate Fourier cu fereastră glisantă în timp
  • Similar calculului mediei mobile:
    1. Alegeți dimensiunea și forma ferestrei
    2. La un moment de timp, calculați FFT pentru acea fereastră
    3. Glisați fereastra cu un pas
    4. Agregați rezultatele
  • Numită Transformata Fourier pe Termen Scurt (STFT)
Machine Learning pentru Date de Tip Șir de Timp în Python

Machine Learning pentru Date de Tip Șir de Timp în Python

Calcularea STFT

  • STFT poate fi calculat cu librosa
  • Există mai mulți parametri ajustabili (de ex. dimensiunea ferestrei)
  • În acest curs, vom converti valorile în decibeli, normalizând astfel valorile medii ale tuturor frecvențelor
  • Rezultatul poate fi vizualizat cu funcția specshow()
Machine Learning pentru Date de Tip Șir de Timp în Python

Calcularea STFT cu cod

# 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 pentru Date de Tip Șir de Timp în Python

Ingineria caracteristicilor spectrale

  • Fiecare serie temporală are un tipar spectral diferit.
  • Aceste tipare pot fi calculate prin analiza spectrogramei.
  • De exemplu, lățimea de bandă spectrală și centroizii spectrali descriu unde se concentrează energia la fiecare moment în timp

Machine Learning pentru Date de Tip Șir de Timp în Python

Calcularea caracteristicilor spectrale

# 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 pentru Date de Tip Șir de Timp în Python

Combinarea caracteristicilor spectrale și temporale într-un clasificator

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 pentru Date de Tip Șir de Timp în Python

Să exersăm!

Machine Learning pentru Date de Tip Șir de Timp în Python

Preparing Video For Download...