Spektrogram – zmiany widmowe dźwięku w czasie

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Transformaty Fouriera

  • Dane szeregów czasowych można opisać jako kombinację składowych szybko- i wolnozmiennych
  • W każdej chwili czasu można określić względny udział składowych szybkich i wolnych
  • Najprostszą metodą jest transformata Fouriera
  • Przekształca ona szereg czasowy w tablicę opisującą go jako kombinację oscylacji
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Transformata Fouriera (FFT)

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Spektrogramy: kombinacje okienkowych transformat Fouriera

  • Spektrogram to zbiór okienkowych transformat Fouriera w czasie
  • Obliczany podobnie jak średnia krocząca:
    1. Wybór rozmiaru i kształtu okna
    2. Obliczenie FFT dla okna w danym punkcie czasowym
    3. Przesunięcie okna o jeden krok
    4. Agregacja wyników
  • Nazywany krótkoterminową transformatą Fouriera (STFT)
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Obliczanie STFT

  • STFT można obliczyć za pomocą librosa
  • Dostępnych jest kilka parametrów do dostosowania (np. rozmiar okna)
  • Wyniki konwertuje się do decybeli, co normalizuje średnie wartości wszystkich częstotliwości
  • Wizualizacja jest możliwa za pomocą funkcji specshow()
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Obliczanie STFT z użyciem kodu

# 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)
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Inżynieria cech widmowych

  • Każdy szereg czasowy ma inny wzorzec widmowy.
  • Wzorce widmowe można obliczać, analizując spektrogram.
  • Na przykład szerokość pasma widmowego i centroidy widmowe opisują rozkład energii w każdej chwili czasu

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Obliczanie cech widmowych

# 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)
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Łączenie cech widmowych i czasowych w klasyfikatorze

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])
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Czas na ćwiczenia!

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Preparing Video For Download...