
3. 基本的な信号処理手法
3.7 スペクトログラムの作成と読み方
スペクトログラムは、時間の経過とともに音に含まれる周波数の強さがどのように変化したかを、ひと目でわかるように可視化した図である。横軸が時間、縦軸が周波数、色や濃さが強さ(エネルギーや振幅)を表すヒートマップになっており、音声・機械音・環境音などの「いつ・どの帯域が・どれだけ」強くなったかを同時に読めるのが特徴である。この表示は、短時間フーリエ変換(STFT)で得た時間ごとのスペクトルを時間軸に沿って並べたもので、波形だけでは埋もれて見える特徴を明確にしてくれる。[1][2][3][4][5]
作り方の流れは、シンプルに言えば「短く切ってはフーリエ変換」を繰り返すことになる。実務手順は次の通りである。まず、解析したい信号から短い時間区間を取り出すための窓関数を用意する(ハン窓やハミング窓など、端がなめらかに0へ向かう形が一般的)。次に、その窓で囲った区間にフーリエ変換(FFT)をかけて周波数別の強さを求める。窓を少しだけ時間方向にずらし、同じ処理を繰り返すと、時間ごとに得られたスペクトルを上下(周波数軸)に積み上げた「時間×周波数×強さ」のデータが得られ、これを色で描けばスペクトログラムになる。[6][3][7][8][9][10]
ここで重要なのは、窓の長さ(何ミリ秒の区間をまとめて見るか)と、どれだけずらして繰り返すか(オーバーラップやホップサイズ)の選び方である。窓を長くすると周波数を細かく見分けられる(周波数分解能が高い)が、時間的な変化は平均化されて「いつ変わったか」がぼやける。逆に窓を短くすると、急な変化のタイミングは鋭く見える(時間分解能が高い)が、周波数の見分けは粗くなる。これはSTFTの基本的なトレードオフで、対象の信号が速く変わるのか、近い周波数をきちんと分けたいのかによって窓長を調整するのが定石である。[3][7][8][9]
窓関数を使う理由は、切り出しの両端で信号が急に途切れると、周波数軸に「にじみ(リーケージ)」が生じて、エネルギーが本来の周波数から周辺へ漏れてしまうからである。端がなめらかな窓(ハン、ハミングなど)を掛けると、にじみが弱まり、弱い成分が強い成分の裾に埋もれにくくなる一方、ピークの幅はやや広がるので、目的に応じた窓の選択が必要になる。実装例では、窓長・ホップ・サンプリング周波数を設定してSTFTを呼び出し、得られたパワーをdBに換算してpcolormesh等で描画するのが一般的である。[7][8][9][10][3]
表示の読み方は、基本を押さえるとぐっと楽になる。横軸は時間、縦軸は周波数で、明るい色や濃い部分が強いことを示す(色味はソフトによって異なるが、「明るい=強い」が多い)。1つの持続音は、縦に細い筋として現れる。楽器や声の「高さ」を作る基本周波数と、その整数倍の「倍音」は、帯域ごとに横筋の列として見える。破裂音や衝撃など瞬間的で鋭い音は、多くの高周波を含むため、時間的に薄い帯が高い周波数まで一気に立ち上がってすぐ消える模様として現れる。ささやきや摩擦のようなノイズ主体の音は、帯域ごとにざらっと広がった塗りつぶしの模様になりやすい。[11][12][2][4][13]
音声例では、母音は低〜中周波にエネルギーが集まり、フォルマントと呼ばれる帯域の濃い横筋が連なる一方、[s]のような摩擦音は高域にエネルギーが集まり、薄めの高周波帯が広く現れる、といった読み分けができる。ソフト上では、カーソル位置の時間・周波数・強さ(パワー密度)を直接読み取れる機能があり、値で確かめると理解が早い。機械音でも基本は同じで、回転数に相当する基本周波数帯の筋や、その高調波、変調による側帯域の出現など、時間の波形では見つけにくい特徴を帯域別の色の変化として素早く見つけられる。[12][2][4][14][15][6][1]
実務でつまずきやすい点も整理しておく。まず縦軸の上限はサンプリング周波数の半分(ナイキスト周波数)までであり、それを超える情報は正しく表示できないので、対象帯域に合う録音・取り込み設定が前提となる。次に、色のスケール(ダイナミックレンジ)を広げすぎると弱い成分が見えにくく、狭めすぎると強い成分で全体が飽和するため、カラーバーの範囲(dBの上下限)は目的に応じて調整する。さらに、窓長は解析目的に合わせて試行するのが基本で、速い異常の立ち上がりを見たいときは短め、近接帯域の分離が必要なときは長めに設定する。[8][3][7]
作成の実例イメージとして、解析ライブラリに備わるSTFT機能を用い、ハン窓(たとえば長さ512)・ホップ128・サンプリング周波数fsを指定し、得られたパワースペクトルを10×log10でdB化して、時間軸tと周波数軸fに対してカラーマップで描画する、という一連の処理が広く使われている。この際、FFTの点数や窓長が周波数の刻み(分解能)を決め、ホップが時間方向の刻みを決めるため、目標の「どれくらい細かく見たいか」から逆算して設定するのがよい。[10][3][7]
読み取りの勘所は次のとおりである。1) 連続して現れる細い縦筋は、一定の周波数成分が持続しているサイン波的成分を示す。2) 水平に並ぶ帯域の濃さの変化は、同じ周波数帯の強度が時間とともに上がったり下がったりしていることを示す。3) 短時間に広帯域で強度が上がるパターンは、衝撃的・破裂的なイベントの可能性が高い。4) 帯域が斜めに上がる・下がる模様は、周波数が上昇・下降している(例えば回転数の変化)ことを意味する。5) 周囲の雑音が強いと弱い異常が埋もれやすいので、カラースケールの再設定やノイズ帯域の目視確認が有効である。[2][4][13][6][11]
故障予知に役立つ視点として、正常時のスペクトログラムを「基準」として記録し、同じ運転条件での新しいデータと見比べる運用が効果的である。たとえば、回転機の基本周波数の筋の周りに、左右へ等間隔に「側帯域」の筋が新たに現れる場合は、変調(間欠的な力や緩み)や歯車・軸受の異常の兆候を示すことがある。また、高周波帯のざらつきがじわじわ増すのは摩耗や潤滑悪化の兆しとして観察されることがあるため、時間方向に沿った帯域ごとの強度推移(トレンド)を見ると、微小な変化を見逃しにくい。こうした「帯域で見る、時間で追う」という読み方は、音声でも同様に用いられ、母音・子音の帯域特徴や発音の切り替わりが時系列に沿って確認できる。[4][14][6][1][12][2]
最後に、道具としての選び方も触れておく。専門ソフト(音声分析、機械解析ツール)や一般的なプログラミング環境の信号処理ライブラリには、STFTとスペクトログラム描画が実装されている。基本は、窓長・ホップ・サンプリング周波数・窓関数・表示スケールを適切に設定し、目的(時間変化重視か、周波数分離重視か)に合わせて調整を繰り返すことだ。読み方の訓練には、既知の音(サイン波、パルス、音声の単語)で結果を見て、どのパターンがどの見え方をするかを対応づけるのが近道である。[6][11][4] [1] https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0
[2] https://www.kikoeblog.jp/?p=1378 [3] https://labo-code.com/python/stft/ [4] https://mainichi-nonbiri.com/praat/spectrogram/ [5] https://www.weblio.jp/content/%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0 [6] https://logicalyze.com/understanding-spectrograms/ [7] https://nettyukobo.com/python_scipy_signal_spectrogram/ [8] https://qiita.com/uene/items/3501a439c5c4fb320153 [9] https://qiita.com/purple_jp/items/7c91a05c547615e9ab89 [10] https://watlab-blog.com/2019/05/19/python-spectrogram/ [11] https://emastered.com/ja/blog/what-is-spectrogram [12] https://www.gavo.t.u-tokyo.ac.jp/~mine/japanese/nlp+slp/lecture-02.pdf [13] http://francais.la.coocan.jp/chokaku2012k13.htm [14] https://www.jstage.jst.go.jp/article/isciesci/65/4/65_119/_pdf/-char/ja [15] http://www.takagi.inf.uec.ac.jp/swr/pdf/appendix.pdf [16] https://www.ye-digital.com/jp/product/mmpredict/ [17] https://www.chusho.meti.go.jp/sapoin/index.php/cooperation/project/detail/4316 [18] https://repository.dl.itc.u-tokyo.ac.jp/record/2002815/files/K-08262.pdf [19] https://qiita.com/tanaka_benkyo/items/1b13ad1c1810ecaf4c93 [20] https://note.com/lebris22/n/n857675bcdfd4※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。
※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。