はじめに
最近、スペクトルデータを扱うコンペに参加しました。
過去に大学で音声合成の研究をしていたとき、メルスペクトログラムを扱っていたのですが、そのときは「音声データを機械学習で扱う際のベーシックな方法で、CNNやLSTMで扱う際に便利」くらいの理解でした。今回のコンペでスペクトルデータに再び向き合ったことで、自分がスペクトルやスペクトログラムの仕組みをちゃんと理解できていなかったことに気づきました。
この記事では、スペクトル・スペクトログラムとは何か、なぜこのような変換をするのか、機械学習においてどう活用できるのかを自分なりに整理してみます。
スペクトルとは
スペクトル(spectrum)とは、ある信号がどの周波数成分をどれだけ含んでいるかを表したものです。
たとえば音声信号は時間の関数 $x(t)$ として表されますが、これをそのまま見ても「どんな音か」は直感的にわかりにくいです。そこでフーリエ変換を用いて、周波数領域に変換します。
フーリエ変換
フーリエ変換とは、時間領域の信号を周波数領域に変換する操作です。任意の信号は、様々な周波数の正弦波の重ね合わせとして表現できるという考え方に基づいています。
フーリエ変換は「各周波数の正弦波とどれくらい似ているか(内積)」を計算しているとも言えます。
$$X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dt$$
- $x(t)$:時間領域の信号
- $X(f)$:周波数領域の表現(どの周波数がどの強さで含まれるか)
- $e^{-j2\pi ft}$:周波数 $f$ の複素正弦波(オイラーの公式より $\cos(2\pi ft) - j\sin(2\pi ft)$)
複雑な音の波形を低音・中音・高音の成分に分解して、それぞれの強さを可視化しているイメージです。
実際の計算では連続フーリエ変換ではなく、離散データに適用できる離散フーリエ変換(DFT) を高速化したFFT(高速フーリエ変換)が使われます。
import numpy as np
import matplotlib.pyplot as plt
# サンプル信号(440Hzと880Hzの正弦波を合成)
sr = 8000 # サンプリングレート
t = np.linspace(0, 1, sr)
signal = np.sin(2 * np.pi * 440 * t) + 0.5 * np.sin(2 * np.pi * 880 * t)
# FFTでスペクトルを計算
fft_result = np.fft.rfft(signal)
frequencies = np.fft.rfftfreq(len(signal), 1 / sr)
amplitude = np.abs(fft_result)
plt.plot(frequencies, amplitude)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.xlim(0, 1500)
plt.title("Spectrum (FFT)")
plt.show()
これにより、「どの周波数成分がどのくらいの強さで含まれているか」=スペクトルが得られます。
Tips:スペクトルはさまざまな信号に使われる
フーリエ変換に基づくスペクトル分析は、音声に限らず幅広い分野で活用されています。
| 分野 | 信号の種類 | 横軸 | 縦軸 |
|---|---|---|---|
| 音声処理 | 音声波形 | 周波数 (Hz) | 振幅・パワー |
| 通信工学 | 電気信号 | 周波数 (Hz) | 電力密度 |
| 地震学 | 地震波 | 周波数 (Hz) | 振幅 |
| 分光分析 | 光の吸収 | 波数 (cm⁻¹) / 波長 (nm) | 吸光度 |
例えば分光分析では、物質に光を当てたときの吸収・反射特性をスペクトルとして表現し、物質の成分や状態を非破壊で推定するために使われます。
スペクトログラムとは
スペクトルは「ある瞬間の周波数成分」のスナップショットです。しかし音声のような時間的に変化する信号では、時間によって周波数成分が変わります。
そこで登場するのがスペクトログラムです。
スペクトログラムは、時間ごとのスペクトルの変化を表したものです。
計算方法:短時間フーリエ変換(STFT)
信号を短い時間窓(フレーム)に切り出し、各フレームにフーリエ変換を適用します。これを**短時間フーリエ変換(Short-Time Fourier Transform; STFT)**と呼びます。
$$S(t, f) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j2\pi f\tau} d\tau$$
- $w(\tau - t)$:時刻 $t$ を中心とした窓関数(ハン窓など)
- 結果 $|S(t, f)|^2$:各時刻・各周波数でのパワー(エネルギー)
これを2次元のヒートマップとして可視化したものがスペクトログラムです。
横軸 = 時間
縦軸 = 周波数
色 = パワー(振幅の強さ)
なぜこの変換をするのか
音声信号をそのままモデルに入力しても、時系列の波形は情報が冗長で学習しにくいです。スペクトログラムに変換することで:
- 人間の聴覚に近い特徴表現が得られる
- 2次元画像として扱えるため、CNNなどを使用できる
- 時間・周波数の両方向のパターンを同時に捉えられる
という利点があります。
トレードオフ
ちなみに、どのくらいの窓を用いて変換するかによって、以下のトレードオフがあります。
- 短い窓 → 時間に強い
- 長い窓 → 周波数に強い
機械学習での活用
音声・信号分類
スペクトログラムを画像として扱い、画像分類モデル(ResNet、EfficientNet など)をそのまま適用するアプローチが広く使われています。
import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
# 音声読み込み
y, sr = librosa.load("sample.wav", sr=22050)
# STFTスペクトログラム
D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
# 可視化
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('STFT Spectrogram')
plt.show()
1次元スペクトルの回帰・分類
時間方向を持たない1次元のスペクトルデータに対しては、以下のようなアプローチが有効です。
import numpy as np
from sklearn.cross_decomposition import PLSRegression
from sklearn.preprocessing import StandardScaler
# データの準備(X: スペクトル, y: 目的変数)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
# PLS回帰(化学計量学の定番手法)
pls = PLSRegression(n_components=10)
pls.fit(X_scaled, y_train)
y_pred = pls.predict(scaler.transform(X_test))
| 手法 | 特徴 | 向いているケース |
|---|---|---|
| PLS回帰 | 化学計量学の定番、解釈しやすい | データ数が少ない |
| SVR | カーネルで非線形も対応 | 中規模データ |
| 1D-CNN | 局所パターンを自動抽出 | データ数が多い |
| XGBoost | 特徴量重要度が得られる | 汎用的に強い |
Tips:メルスペクトログラムとは
通常のSTFTスペクトログラムは周波数が線形スケールですが、人間の聴覚は高周波数域での分解能が低く、低周波域の変化に敏感です。この特性を模倣したのがメルスケールです。
$$m = 2595 \log_{10}\left(1 + \frac{f}{700}\right)$$
メルスペクトログラムはSTFTの結果にメルフィルタバンクをかけ、周波数軸をメルスケールに変換したものです。
# メルスペクトログラム
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
S_db = librosa.power_to_db(S, ref=np.max)
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram')
plt.show()
STFTスペクトログラムとの違い
| STFTスペクトログラム | メルスペクトログラム | |
|---|---|---|
| 周波数軸 | 線形 | 対数的(メルスケール) |
| 計算コスト | 低い | やや高い(フィルタバンク適用) |
| 人間の聴覚との対応 | 低い | 高い |
| 主な用途 | 汎用的な信号解析 | 音声認識・音楽分析 |
音声認識や音楽ジャンル分類などのタスクでは、メルスペクトログラムのほうが精度が出やすい傾向があります。
まとめ
| 概念 | 一言で言うと |
|---|---|
| スペクトル | 信号がどの周波数成分をどれだけ含むかの分布 |
| スペクトログラム | スペクトルの時間変化を2D画像にしたもの(STFT) |
| メルスペクトログラム | 人間の聴覚特性に合わせた周波数スケールのスペクトログラム |