『音による故障予知の教科書たたき台:3.6 短時間フーリエ変換(STFT)の原理』LLMと一緒に書いてみた—AIが導く研究メモ

3. 基本的な信号処理手法  

3.6 短時間フーリエ変換(STFT)の原理

音や振動のように時間とともに様子が変わる信号では、「いつ、どの周波数成分が強かったか」を同時に知る必要がある。通常のフーリエ変換は信号全体を一度に周波数へ分解するため、「周波数は分かるが、それがいつ現れたか」は分からない。短時間フーリエ変換(STFT)は、この弱点を補うために、信号を短い時間の切れ端に区切り(窓で切り出し)、区切った部分ごとにフーリエ変換を行って、時間と周波数の両方の変化を追えるようにした方法である。この「短い区間ごとのフーリエ変換」を時間方向に少しずつずらしながら繰り返すと、時間×周波数の2次元的な表現が得られ、これをスペクトログラムとして可視化できる。[1][2][3]

STFTの基本操作を直感でまとめる。まず、分析したい信号に「窓関数」をかけて、その窓で囲んだ短い区間だけを取り出す(窓の端は滑らかに0へ向かう形がよく使われ、境目のギザギザによるにじみ=漏れを抑える)。次に、その区間のフーリエ変換を計算して周波数成分を求める。最後に、窓の位置を少し先にずらして同じことを繰り返す。ずらし幅(ホップ長)を小さくすると時間方向の点が密になり、変化をなめらかに追えるが計算は重くなる。この一連の流れにより、ある時刻の周波数分布と、その変化の移り変わりを手に取るように観察できる。[4][2][3][5][6][1]

なぜ窓を使うのかも重要だ。実験的に得られる有限長の信号をそのままフーリエ変換すると、切り出し端の不連続が原因でスペクトルがにじむ(漏れ)ことがある。そこで、中央が1付近で端に向けて0へ滑らかに小さくなる窓関数を掛け、端の不連続の影響を減らしてからフーリエ変換するのが定石である。この「窓をかけてから変換する」を時間方向へずらしながら繰り返す手続きがSTFTの核心であり、窓の形と幅(長さ)が解析の見え方を左右する。[2][1]

ここで避けて通れないのが「時間分解能と周波数分解能のトレードオフ」である。短い窓は、短時間の出来事を素早く捉えられる(時間分解能が高い)が、周波数の細かい差は見分けにくくなる(周波数分解能が低い)。逆に長い窓は、近い周波数どうしをきれいに分けて見られる(周波数分解能が高い)が、いつ変化したかの時間精度は落ちる(時間分解能が低い)。どちらを優先するかは信号の性質と目的次第で、速く変わる現象を追うなら短い窓、ゆっくり変わる成分を細かく分けたいなら長い窓を選ぶのが直観に合う。このトレードオフは不確定性原理とも関係し、万能の最適解が常にあるわけではないことが教科書的に知られている。[7][2]

窓関数の選び方も結果に効く。矩形窓は計算が簡単だが漏れが大きい一方、ハミング窓やハン窓はバランスがよく、ブラックマン系は漏れ抑制に優れる代わりに分解能(主ローブ幅)が広がりやすいといった性質がある。現場ではハミングやハンから始め、漏れや分解能の要求に応じて窓を見直すことが多い。また、隣り合う窓の重なり(オーバーラップ)を増やすと、時間方向の表示がなめらかになり見落としを減らせるが、計算量は増える。典型的な重なりは50〜75%とされる。離散STFTの実装では、短区間ごとに高速フーリエ変換(FFT)を使って効率的に計算し、ホップ長(窓長−重なり)で時間方向にずらしていく。[8][5][6][4]

ホップ長と重なりには、解析の狙い以外に「重ね合わせで均一にカバーできるか」という観点もある。窓を並べて加え合わせたときに、時間方向で均一な重みになる条件(COLA, constant overlap-add)を満たすホップ長の選択は、再合成(逆変換)やスムーズな解析の観点で保守的な指針になる。ハンやハミング窓では、1/2や1/4など特定の重なりで都合が良い(きれいに重なる)ことが知られており、こうした性質を踏まえてホップ長を決めるのが安全策になる。一方、解析だけで再合成を伴わない場合には、信号の変化速度に応じてホップ長を広げ、計算量を抑える実務的な調整も行われる。[9]

STFTの結果はふつう極座標(複素数)で得られ、振幅(大きさ)と位相(角度)の両方の情報を含む。見やすさのため、振幅を対数スケール(dB)にして時間×周波数の画像(スペクトログラム)にすれば、強い成分が明るく(または濃く)表示され、どの時刻にどの周波数が強かったかが直観的に分かる。音声などでは、ヒトの聴感に近づけるために周波数軸をメル尺度に並べ替えた「メルスペクトログラム」を使うこともある。ただし、位相を捨てて振幅だけを用いると再合成に課題が生じるため、復元が必要な用途では位相の扱い(または復元手法)も検討が要るという研究的な指摘がある。[3][10][2]

STFTを実務で設計するときの勘どころをまとめる。第一に、窓長は「見たい現象の時間幅」に合わせる。短い衝撃や素早い過渡を追うなら短窓、狭い周波数差を分けたいなら長窓が有利である。第二に、窓関数は漏れと分解能のバランスで選び、まずはハミングやハンを基準に、漏れが問題ならブラックマン系などへの変更を検討する。第三に、オーバーラップは50〜75%を起点に、時間方向のなめらかさと計算量の折り合いをつける。再合成や均一加重を意識するならCOLA条件に配慮したホップ長を選ぶ。第四に、表示はdBスケールのスペクトログラムで傾向を把握し、必要なら周波数軸の変換(メルなど)も検討する。第五に、実装ではFFTを用いる離散STFT関数(例:librosaやMATLABのSTFT)を使い、窓長・ホップ長・窓関数・オーバーラップを明示的に設定する。[5][6][8][9][7][4][2][3]

最後に、STFTの限界も正しく理解しておく。STFTは「固定の窓長」で全区間を分析するため、速い現象と遅い現象が混在する場合、どちらかに不利な設定になりがちである。この固定分解能の限界は原理的なもので、時間と周波数の分解能は同時に無限大にはできない(不確定性原理)。この欠点を補う考え方として、窓の幅を周波数に応じて変えるウェーブレット変換のような方法もあるが、STFTの理解が時間周波数解析の入口であることは変わらない。[11][7]

以上のように、短時間フーリエ変換は「短い時間で区切って、その都度フーリエ変換する」ことで、いつ・どの周波数が強かったかを2次元に描き出す原理で成り立っている。窓長・窓関数・オーバーラップ・ホップ長の選択は、時間と周波数の見え方を左右するハンドルであり、信号の性質と目的(速い変化を捉えるのか、近い周波数を分けたいのか)から逆算して決めるのが実務的な設計の基本となる。[1][8][9] [1] https://ja.wikipedia.org/wiki/%E7%9F%AD%E6%99%82%E9%96%93%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B

[2] https://en.wikipedia.org/wiki/Short-time_Fourier_transform

[3] https://towardsdatascience.com/all-you-need-to-know-to-start-speech-processing-with-deep-learning-102c916edf62/

[4] https://library.fiveable.me/advanced-signal-processing/unit-1/short-time-fourier-transform-stft/study-guide/OprLM7X5xQrmPIAp

[5] https://librosa.org/doc/main/generated/librosa.stft.html

[6] https://jp.mathworks.com/help/dsp/ref/dsp.stft.html

[7] https://qiml.radiology.wisc.edu/wp-content/uploads/sites/760/2020/10/notes_016_stft.pdf

[8] https://www.numberanalytics.com/blog/short-time-fourier-transform-for-signal-analysis

[9] https://www.dsprelated.com/freebooks/sasp/Choice_Hop_Size.html

[10] https://www.dafx.de/paper-archive/2011/Papers/27_e.pdf

[11] http://www7b.biglobe.ne.jp/~yizawa/InfSys1/basic/chap11/index.htm

[12] https://ys0510.hatenablog.com/entry/fourier

[13] https://appswingby.com/%E7%9F%AD%E6%99%82%E9%96%93%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B-%E4%BB%8A%E6%9B%B4%E8%81%9E%E3%81%91%E3%81%AA%E3%81%84it%E7%94%A8%E8%AA%9E%E9%9B%86/

[14] https://fast-d.hmcom.co.jp/techblog/stft-from-zero/

[15] https://www.jstage.jst.go.jp/article/jasj/77/6/77_396/_pdf

[16] https://note.com/suzukusa/n/nc3e5b10cbf85

[17] https://qiita.com/takayoshi1968/items/636372d464d02699ba4f

[18] https://labo-code.com/python/stft/

[19] https://arxiv.org/pdf/1504.07372.pdf

[20] https://www.klv.co.jp/corner/fft-in-freq-analysis.html

※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。

※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。

おすすめの記事