Spektrogram – spektrální změny zvuku v čase

Machine Learning pro data časových řad v Pythonu

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Fourierovy transformace

  • Časové řady lze popsat jako kombinaci rychle a pomalu se měnících složek.
  • V každém okamžiku lze popsat relativní zastoupení rychlých a pomalých složek.
  • Nejjednodušší metodou je Fourierova transformace.
  • Ta převádí jeden časový řad na pole popisující řad jako kombinaci oscilací.
Machine Learning pro data časových řad v Pythonu

Fourierova transformace (FFT)

Machine Learning pro data časových řad v Pythonu

Spektrogramy: kombinace okenních Fourierových transformací

  • Spektrogram je soubor okenních Fourierových transformací v čase.
  • Podobně jako výpočet klouzavého průměru:
    1. Zvolte velikost a tvar okna.
    2. V daném časovém bodě vypočítejte FFT pro toto okno.
    3. Posuňte okno o jeden krok.
    4. Agregujte výsledky.
  • Nazývá se krátkodobá Fourierova transformace (STFT).
Machine Learning pro data časových řad v Pythonu

Machine Learning pro data časových řad v Pythonu

Výpočet STFT

  • STFT lze vypočítat pomocí librosa.
  • K dispozici je několik nastavitelných parametrů (např. velikost okna).
  • Pro naše účely převedeme hodnoty na decibely, čímž normalizujeme průměrné hodnoty všech frekvencí.
  • Výsledek lze vizualizovat funkcí specshow().
Machine Learning pro data časových řad v Pythonu

Výpočet STFT v kódu

# 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 pro data časových řad v Pythonu

Tvorba spektrálních příznaků

  • Každý časový řad má jiný spektrální vzor.
  • Tyto vzory lze analyzovat pomocí spektrogramu.
  • Například spektrální šířka pásma a spektrální centroidy popisují, kde se v každém okamžiku nachází většina energie.

Machine Learning pro data časových řad v Pythonu

Výpočet spektrálních příznaků

# 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 pro data časových řad v Pythonu

Kombinace spektrálních a časových příznaků v klasifikátoru

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 pro data časových řad v Pythonu

Pojďme si procvičit!

Machine Learning pro data časových řad v Pythonu

Preparing Video For Download...