Spektrogrammet – spektrala förändringar i ljud över tid

Maskininlärning för tidsseriedata i Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Fouriertransformer

  • Tidsseriedata kan beskrivas som en kombination av snabbt och långsamt föränderliga komponenter
  • Vid varje tidpunkt kan vi beskriva den relativa förekomsten av snabba och långsamma komponenter
  • Det enklaste sättet att göra detta kallas Fouriertransform
  • Den omvandlar en enskild tidsserie till en array som beskriver tidsserien som en kombination av oscillationer
Maskininlärning för tidsseriedata i Python

En Fouriertransform (FFT)

Maskininlärning för tidsseriedata i Python

Spektrogram: kombinationer av fönstrade Fouriertransformer

  • Ett spektrogram är en samling fönstrade Fouriertransformer över tid
  • Liknar hur ett rullande medelvärde beräknas:
    1. Välj fönsterstorlek och form
    2. Beräkna FFT för det fönstret vid en given tidpunkt
    3. Flytta fönstret ett steg framåt
    4. Aggregera resultaten
  • Kallas Short-Time Fourier Transform (STFT)
Maskininlärning för tidsseriedata i Python

Maskininlärning för tidsseriedata i Python

Beräkna STFT

  • Vi kan beräkna STFT med librosa
  • Det finns flera parametrar att justera (till exempel fönsterstorlek)
  • Vi konverterar till decibel, vilket normaliserar medelvärdena för alla frekvenser
  • Därefter kan vi visualisera med funktionen specshow()
Maskininlärning för tidsseriedata i Python

Beräkna STFT med kod

# 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)
Maskininlärning för tidsseriedata i Python

Spektral särdragsextraktion

  • Varje tidsserie har ett unikt spectralt mönster.
  • Vi kan beräkna dessa mönster genom att analysera spektrogrammet.
  • Till exempel beskriver spektral bandbredd och spektrala centroider var det mesta av energin befinner sig vid varje tidpunkt

Maskininlärning för tidsseriedata i Python

Beräkna spektrala särdrag

# 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)
Maskininlärning för tidsseriedata i Python

Kombinera spektrala och temporala särdrag i en klassificerare

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])
Maskininlärning för tidsseriedata i Python

Nu kör vi en övning!

Maskininlärning för tidsseriedata i Python

Preparing Video For Download...