スペクトルセントロイド完全ガイド:定義・数式・実装上の注意点と応用(音響信号処理・MIR向け)

はじめに — スペクトルセントロイドとは何か

スペクトルセントロイド(spectral centroid)は、音声・音楽信号のスペクトル(周波数対振幅)の「重心」を表す特徴量で、主に音の明るさ(brightness)や鋭さを定量化するために用いられます。直感的にはスペクトルセントロイドが高いほど高周波成分が多く、音が明るく・鋭く感じられ、低いほど暗く・丸い印象になります。

本コラムでは、定義と数学的背景、実装方法、前処理や窓関数の影響、スケールと正規化、応用例(音色解析、分類、合成パラメータ推定)までを深掘りし、実務での落とし穴や改善手法も解説します。

数学的定義と離散実装の基本式

スペクトルセントロイドは、周波数を重みとしてスペクトル強度の重心を計算したものです。離散フーリエ変換(DFT)で計算したスペクトルの振幅(またはパワー)を用いるのが一般的です。

離散的な定義(1フレームあたり)は次のようになります:

スペクトルセントロイド C = Σ_{k=0}^{N-1} f_k * M_k / Σ_{k=0}^{N-1} M_k

ここで、

  • f_k = k * (fs / N)
  • M_k = |X_k|(あるいは |X_k|^2 を用いることもある)
  • fs はサンプリング周波数、N はDFTのポイント数(FFT長)、X_k は複素スペクトルのk番目の係数

すなわち、各周波数ビンの周波数 f_k に対してその振幅を重みとした加重平均を取っています。結果はHz単位で得られます。

振幅(|X|)かパワー(|X|^2)か、あるいは対数か

実務では振幅スペクトル(|X_k|)を使うことが多いですが、音響的知覚に近づけるためにパワー(|X_k|^2)や対数スペクトルを使う変種もあります。選択は目的によります:

  • |X_k|:生のエネルギー分布を重視。計算がシンプル。
  • |X_k|^2:エネルギー寄与をより強調。低振幅成分がさらに小さくなる。
  • log(|X_k| + eps):対数は人間の聴覚の対数的応答に近く、ダイナミクスを圧縮する。

学術研究やライブラリ実装(例:librosa)では振幅を用いる例が多いですが、目的(分類性能や主観評価)に応じて試すべきです。

周波数軸のマッピングと標本化率依存性

上式で使う f_k は線形周波数軸(Hz)です。f_k = k * fs / N に依存するため、スペクトルセントロイドはサンプリング周波数 fs に依存します。つまり、同じ音源を異なるサンプリング周波数で分析すると値が変わる可能性があります。

対処法:

  • Hzそのままを使う:物理的な周波数重心として解釈。
  • 正規化する:例えば最大周波数(fs/2)で割ることで 0〜1 に正規化し、異なるサンプリング周波数間で比較可能にする。
  • メル周波数軸や対数周波数軸で計算する:人間の知覚尺度に近づける場合に有効。メルバンドの中心周波数を重みとして計算する方法もある(ただしこれにより「純粋な」セントロイド概念は拡張される)。

STFTのパラメータ(窓長・窓種・ゼロパディング・ホップ)と影響

スペクトルセントロイドはフレームごとに計算することが一般的です。STFT(短時間フーリエ変換)パラメータの選び方は結果に直接影響します。

  • 窓長(window length):長い窓は高周波分解能を高め低周波の正確さを向上させるが時間分解能を犠牲にします。短い窓は瞬時的変化を捉えやすいが周波数分解能が低下します。音楽的には3〜100 ms の範囲で試すことが多い(例:1024点@44.1kHz ≒ 23 ms)。
  • 窓関数:ハニングやハミング等の窓はサイドローブを抑えます。矩形窓は漏洩が大きいため推奨されません。窓によりスペクトルのピークと帯域が変わり、結果としてセントロイドが変わります。
  • ゼロパディング(FFT長 N):ゼロパディングは周波数サンプリング密度を上げ、見かけ上の分解能を上げますが実際の情報量は増えません。ただし、ピーク位置の補間や数値的安定性に寄与します。
  • ホップサイズ(frameshift):フレームの滑らかさや時間解像度に影響します。大きなホップは時間的に粗い時系列を生みます。

前処理とノイズ対策

正しい前処理を行わないとスペクトルセントロイドはノイズや直流成分に引きずられます。実務的な推奨:

  • DCオフセット除去:直流成分は低周波側に重心を引くため、信号から平均を引く。
  • ノイズフロアの設定:極めて小さい振幅ビンを無視する閾値を設ける(例えば全体エネルギーの0.1%未満を0にするなど)。
  • 帯域制限:分析対象が人声なら通常20Hz〜8kHzなど、興味のない極端な周波数を除外する。
  • 前強調フィルタ(pre-emphasis):高周波成分を強調することでセントロイドの感度を上げる。0.97程度の係数で一次高域強調フィルタを使うことが多い。

正規化と解釈の仕方

スペクトルセントロイドの値はHzで表されますが、比較・可視化・学習器への入力として扱う場合には次の正規化が有用です:

  • 周波数で割る(fs/2):0〜1に正規化。
  • 対数変換:大きな値の影響を圧縮し、機械学習での学習を安定化。
  • 平均・標準偏差で正規化(zスコア):特徴量スケーリングとして一般的。

解釈上の注意点:セントロイドは「平均周波数」であり、複数ピークを持つスペクトルでは中間の周波数に寄る傾向があります。高周波の少数ピークが存在すると平均が引き上げられ、必ずしも「支配的な聴感的成分」を示すとは限りません。そのため、スペクトルスプレッド(spectral spread)やロールオフ(spectral roll-off)と組み合わせて解析することが推奨されます。

実装上のポイント(擬似コードとライブラリ)

擬似的な実装手順:

  • 信号を短時間フレームに分割し、窓をかける。
  • 各フレームについてFFTを計算し、振幅スペクトルを得る。
  • 振幅スペクトルと対応する周波数ビン f_k を使って重心を計算する(分母が0にならないよう eps を用いる)。

擬似コード(概念):

for each frame:
X = FFT(windowed_frame)
mags = abs(X[0:K])
freqs = (0..K-1) * fs / N
centroid = sum(freqs * mags) / (sum(mags) + eps)

主要なライブラリ:

  • librosa: librosa.feature.spectral_centroid(Python) — 実務で広く使われる。
  • Essentia: spectral_centroid(C++/Pythonバインディング) — 音響特徴抽出ライブラリ。
  • MIRtoolbox / Marsyas などのMIRツールキットも同様の実装を提供。

実際に遭遇する問題と改善策

一般的なトラブルとその対処:

  • ノイズに敏感:事前にノイズリダクションや閾値処理を行う。
  • サンプリング周波数差で値がズレる:正規化や特徴量スケーリングを行う。
  • 複数音源(ミックス)で意味が薄れる:音源分離やマスクを併用して解析する。
  • 短時間の瞬変に過度に反応する:時系列を平滑化(移動平均)するか長めの窓を使う。

応用例(研究・製品での使い道)

スペクトルセントロイドは多くのタスクで有用です:

  • 音色分類・ジャンル分類:セントロイドは楽器の「明るさ」を説明する手がかりになる。
  • 楽器検出・音区分(bright/dark):セントロイドとスプレッドの組み合わせで音色特徴を抽出。
  • 音声分析:声質(ヘッドボイス vs チェストボイス)や子音/母音の区別の手がかり。
  • 合成パラメータの推定:スペクトル形状に基づくフィルタ係数やEQ設定の推定。
  • オーディオエフェクトの自動調整:ミックスの明るさを測る指標としてコンプレッサーやイコライザの自動設定に利用。

拡張・代替指標

セントロイドだけではスペクトルの全貌を表せないため、次の指標と併用されます:

  • スペクトルスプレッド(spectral spread):分散に相当し、帯域の広がりを示す。
  • スペクトルロールオフ(spectral roll-off):累積エネルギーの閾値に達する周波数。
  • スペクトルフラットネス:ノイズ対信号比を示す。

まとめ

スペクトルセントロイドは音の明るさを定量化するシンプルかつ強力な特徴量です。しかし、サンプリング周波数やSTFTの設定、前処理、振幅かパワーを用いるかといった実装上の選択が結果に大きく影響します。実務ではセントロイド単体で用いるよりも、スプレッド・ロールオフなど他のスペクトル指標と組み合わせ、適切な正規化とノイズ処理を施すことが重要です。

参考文献