Спектрограма — спектральні зміни звуку в часі

Machine Learning для часових рядів у Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Перетворення Фурʼє

  • Часові ряди можна подати як поєднання швидких і повільних змін
  • У кожний момент описуємо відносну частку швидких і повільних компонентів
  • Найпростіший спосіб — це перетворення Фурʼє
  • Воно перетворює один часовий ряд на масив, що описує його як суму коливань
Machine Learning для часових рядів у Python

Перетворення Фурʼє (FFT)

Machine Learning для часових рядів у Python

Спектрограми: поєднання віконних перетворень Фурʼє

  • Спектрограма — це набір віконних перетворень Фурʼє у часі
  • Подібно до ковзного середнього:
    1. Виберіть розмір і форму вікна
    2. У вибраній точці часу обчисліть FFT для цього вікна
    3. Зсуньте вікно на одну позицію
    4. Агрегуйте результати
  • Це називається короткочасним перетворенням Фурʼє (STFT)
Machine Learning для часових рядів у Python

Machine Learning для часових рядів у Python

Обчислення STFT

  • STFT можна обчислити за допомогою librosa
  • Є кілька параметрів для налаштування (наприклад, розмір вікна)
  • Для наших цілей перетворимо в децибели, щоб нормалізувати середні значення всіх частот
  • Потім візуалізуємо функцією specshow()
Machine Learning для часових рядів у Python

Обчислення STFT кодом

# 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 для часових рядів у Python

Інжиніринг спектральних ознак

  • Кожен часовий ряд має свій спектральний візерунок.
  • Його можна отримати, аналізуючи спектрограму.
  • Наприклад, спектральна смуга пропускання та спектральний центроїд показують, де зосереджена більшість енергії в кожний момент часу

Machine Learning для часових рядів у Python

Обчислення спектральних ознак

# 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 для часових рядів у Python

Поєднання спектральних і часових ознак у класифікаторі

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 для часових рядів у Python

Давайте потренуємось!

Machine Learning для часових рядів у Python

Preparing Video For Download...