STFTとスペクトログラム — 時間×周波数の地図

1枚の絵に「いつ・どの高さの音が・どれくらい強く」を全部詰め込む — それがスペクトログラム。信号を短い窓で切り出して並べる短時間フーリエ変換(STFT)のしくみと、窓長・hop が決めるトレードオフを動かしながら理解します。

1. フーリエ変換だけでは「いつ」が分からない

曲を丸ごと1回のDFTにかけると「ドとミとソが含まれていた」ことは分かりますが、どの順番で・いつ鳴ったのかは完全に失われます。スペクトルは時間を潰した「成分の合計表」だからです。

そこで発想を変えます。信号を短い窓で切り出し、その区間だけをDFTし、結果を「縦1列の色帯」にして時間順に並べる。窓を少しずつずらしながらこれを繰り返すと、時間×周波数の地図 — スペクトログラム — が出来上がります。下のデモで、その「1列ずつ積まれていく瞬間」を見てください。

スペクトログラムができる瞬間 — 窓が滑り、列が積まれる
窓長 N = 128 点(128 ms)/ hop = 25 点 固定・ハン窓
上段=波形と滑る窓(オレンジの山がハン窓)。窓が今いる区間だけをDFTした結果が、下段に縦1列の色帯として積まれていきます。色が明るいほど強い成分。3つの音が「横棒」、周波数が滑り上がるチャープが「右肩上がりの線」として現れます。
POINT — スペクトログラムの読み方 横軸=時間、縦軸=周波数、色=強さ(dB)。音の高さの動きが「線の形」として見える。メロディは階段状の横棒、チャープは斜めの線、パルスやクリック音は縦線になる。
X[m, k] = Σn x[n] · w[n − mH] · e−j2πkn/N m = フレーム番号、w = 窓関数、H = hop長。フレームごとのDFTを列として並べたものがスペクトログラム

2. 窓の長さが決める「見え方」 — 分解能のトレードオフ

窓長 N はスペクトログラムの画質を決める最重要パラメータです。周波数の刻み幅は fs/N なので、窓を長くするほど周波数方向は細かくなります。しかし窓の中で起きた変化は全部1列に混ざるため、時間方向はぼやけます。短い窓ではその逆が起こります。

「時間位置が命」の短いパルスと、「周波数の動きが命」のチャープを同居させた信号で確かめてみましょう。

窓長トレードオフ — 時間くっきり ⇔ 周波数くっきり
信号=チャープ+2つの短いパルス。N を小さくすると2本のパルスは鋭い縦線になるがチャープの線は太くにじむ。N を大きくするとチャープは細い線になるがパルスは横に薄く塗り広げられる。両方くっきりは選べません。
Δt · Δf ≥ 1 / 4π ガボール限界(不確定性原理)。時間の分解能 Δt と周波数の分解能 Δf は同時には細かくできない
注意 — 窓を変えても情報は増えない これはフーリエ変換の実装の欠点ではなく、時間と周波数の定義そのものに由来する原理的な限界。「周波数を細かく測る」には長い時間観測するしかなく、長く観測すれば「いつ」が曖昧になる。用途に合わせて N を選ぶのが唯一の答え(音声解析では 20〜40 ms が定番)。

3. どれだけ細かく刻むか — hop長とオーバーラップ

窓を一度に進める歩幅を hop長 H と呼びます。H を窓長 N より小さくすると隣のフレームと重なり合い(オーバーラップ)、時間方向が滑らかになります。定番はオーバーラップ 50〜75%(H = N/2 〜 N/4)。H を大きくすると計算は軽くなりますが時間方向が粗くなり、H > N まで広げると窓と窓の間の信号を取りこぼします。

hop長とオーバーラップ — 窓の重なりと滑らかさ
上段=窓(ハン窓の山)が hop 間隔で並ぶ様子。重なりが大きいほど帯が密になります。下段=そのままスペクトログラムに反映。H を 128(=N、オーバーラップ0%)より大きくすると赤い「取りこぼし区間」が現れます。
POINT — 定番レシピ ハン窓 + オーバーラップ 50〜75% が実務の出発点。ハン窓は 50% または 75% 重ねで窓の合計がほぼ一定になるため、加工後に逆STFTで波形へ戻す(オーバーラップ加算)ときにも都合がよい。

4. まとめ — 音声・音楽解析の共通言語

一歩先へ — スペクトログラムはAIの入力になる 音声認識や音楽解析の深層学習モデルは、生波形ではなくスペクトログラム(さらに人の聴覚に合わせたメルスペクトログラム)を「画像」として入力するのが定番。また STFT は振幅と一緒に位相も持っており、位相を復元して波形へ戻す Griffin-Lim 法やニューラルボコーダへと話がつながる。