Phổ đồ - thay đổi phổ của âm thanh theo thời gian

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Biến đổi Fourier

  • Dữ liệu chuỗi thời gian có thể xem là kết hợp của thành phần thay đổi nhanh và chậm
  • Ở mỗi thời điểm, ta mô tả mức độ hiện diện tương đối của phần nhanh và chậm
  • Cách đơn giản nhất để làm điều này gọi là Fourier Transform
  • Cách này biến một chuỗi thời gian thành một mảng mô tả chuỗi như tổ hợp các dao động
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Một biến đổi Fourier (FFT)

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Phổ đồ: kết hợp các biến đổi Fourier theo cửa sổ

  • Phổ đồ là tập hợp các biến đổi Fourier theo cửa sổ theo thời gian
  • Tương tự cách tính trung bình trượt:
    1. Chọn kích thước và dạng cửa sổ
    2. Tại một thời điểm, tính FFT cho cửa sổ đó
    3. Trượt cửa sổ đi một bước
    4. Tổng hợp kết quả
  • Gọi là Short-Time Fourier Transform (STFT)
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Tính STFT

  • Ta có thể tính STFT bằng librosa
  • Có nhiều tham số có thể chỉnh (như kích thước cửa sổ)
  • Trong phạm vi bài này, ta sẽ chuyển sang decibel để chuẩn hóa giá trị trung bình của mọi tần số
  • Sau đó trực quan hóa bằng hàm specshow()
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Tính STFT bằng mã

# 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 cho Dữ liệu Chuỗi thời gian bằng Python

Kỹ thuật đặc trưng phổ

  • Mỗi chuỗi thời gian có một mẫu phổ khác nhau.
  • Ta có thể tính các mẫu này bằng cách phân tích phổ đồ.
  • Ví dụ, spectral bandwidth và spectral centroid mô tả nơi tập trung năng lượng lớn nhất tại mỗi thời điểm

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Tính các đặc trưng phổ

# 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 cho Dữ liệu Chuỗi thời gian bằng Python

Kết hợp đặc trưng phổ và thời gian trong bộ phân loại

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 cho Dữ liệu Chuỗi thời gian bằng Python

Cùng luyện tập nào!

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Preparing Video For Download...