O espectrograma — mudanças espectrais do som ao longo do tempo

Machine Learning para dados de séries temporais em Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Transformadas de Fourier

  • Séries temporais podem ser vistas como a soma de coisas que mudam rápido e devagar
  • Em cada instante, dá para descrever a presença relativa de componentes rápidos e lentos
  • A forma mais simples de fazer isso é com a Transformada de Fourier
  • Ela converte uma única série temporal em um array que a descreve como combinação de oscilações
Machine Learning para dados de séries temporais em Python

Uma Transformada de Fourier (FFT)

Machine Learning para dados de séries temporais em Python

Espectrogramas: combinações de janelas de transformadas de Fourier

  • Um espectrograma é um conjunto de transformadas de Fourier com janelas ao longo do tempo
  • Semelhante ao cálculo de uma média móvel:
    1. Escolha o tamanho e o formato da janela
    2. Em um instante, calcule a FFT para essa janela
    3. Deslize a janela em uma posição
    4. Agregue os resultados
  • Chama-se Short-Time Fourier Transform (STFT)
Machine Learning para dados de séries temporais em Python

Machine Learning para dados de séries temporais em Python

Calculando a STFT

  • Podemos calcular a STFT com librosa
  • Há vários parâmetros para ajustar (como o tamanho da janela)
  • Para nosso uso, vamos converter em decibéis, o que normaliza os valores médios de todas as frequências
  • Depois, dá para visualizar com a função specshow()
Machine Learning para dados de séries temporais em Python

Calculando a STFT com código

# 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 para dados de séries temporais em Python

Engenharia de atributos espectrais

  • Cada série temporal tem um padrão espectral diferente.
  • Podemos obter esses padrões analisando o espectrograma.
  • Por exemplo, largura de banda espectral e centróides espectrais indicam onde está a maior parte da energia em cada instante

Machine Learning para dados de séries temporais em Python

Calculando atributos espectrais

# 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 para dados de séries temporais em Python

Combinando atributos espectrais e temporais em um classificador

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 para dados de séries temporais em Python

Vamos praticar!

Machine Learning para dados de séries temporais em Python

Preparing Video For Download...