『音による故障予知の教科書たたき台:4.10 波形やスペクトログラムの可視化』LLMと一緒に書いてみた—AIが導く研究メモ

4. データ前処理  

4.10 波形やスペクトログラムの可視化

波形の可視化は、音や振動の「時間とともにどう変わるか」を直感的につかむ基本の作業で、横軸が時間、縦軸が振幅(大きさ)のグラフとして描くのが出発点である。時間軸を正しく作るには、サンプリング周波数Fsとサンプル数Nから、0秒からN/Fs秒まで等間隔の配列を用意するのが実務の基本になる。波形だけでは周波数の内訳は分からないため、時間範囲を切り出してFFT(高速フーリエ変換)で周波数スペクトルも併せて表示すると、どの周波数が強いかを定量的に読める。FFTの結果は0〜Fs/2の片側スペクトルを作り、振幅は20log10でdB表示にすると見やすいのが定石である。[1][2]

スペクトログラムは、短時間フーリエ変換(STFT)を時間方向に連ねて、横軸を時間、縦軸を周波数、色で強さ(振幅やパワー)を表した図である。各時点でどの周波数がどれくらい存在するかを瞬時に読めるため、音声認識や異常音の検出などで標準的に使われる。構成要素の読み方は、横が時間、縦が周波数、色の濃淡(しばしばdB表示)が強さという約束で、明るい(濃い)ほど強成分と解釈する。音の高さの変化や高周波の立ち上がりなど、時間—周波数の変化が一目で分かるのが利点である。[3][4][5]

STFTに基づく可視化では、「窓長」と「オーバーラップ(ホップ)」の設定が見え方を決める。窓を長くすると周波数分解能は上がるが時間分解能は下がり、窓を短くすると時間分解能は上がるが周波数分解能は下がるというトレードオフがある。実務では、観たい最小の周波数差Δfとサンプリング周波数fsから、分解能Δf≈fs/Nを逆算して窓長Nを決め、変化の検出感度に応じて50%前後のオーバーラップを初期値に調整すると安定しやすい。表示時は振幅を対数(dB)へ変換し、周波数軸を対数表示にする設定も用いられる(高域の見やすさ向上)。[6][7][3]

窓関数は、有限区間で切り出した際の端点不連続が周波数に「にじみ(スペクトルリーク)」を生むのを抑える目的で用いられる。矩形窓は分解能が保たれる一方でリークが大きく、ハンやハミングはリークを抑える代わりにピーク(主ローブ)が広がるという性質がある。計測上の正しいスケールを出すには、パワースペクトル密度(PSD)表示で窓の等価雑音帯域幅(ENBW)補正を行うのが望ましい。HannやHamming、Blackman-Harrisなどの窓には既知のENBW補正係数があり、スペクトルを密度に直す際に用いると比較可能な値になる。[8][9]

パワースペクトル密度(PSD)で公平に比較するには、FFTで得たパワー(振幅二乗)を分解能Δfで割り、さらに窓の補正(ENBWなど)を掛けて1Hz当たりの値に正規化する。メーカーの技術コラムでも、窓補正値Wfを踏まえた換算式を用いること、表示単位はV^2/Hz(または平方根でV/√Hz)などを選べることが示されている。デジタイザの応用資料でも、パワースペクトルをENBW×Δfで割ってPSDに正規化する必要があると説明されている。この正規化により、異なる窓長や分解能でも比較しやすいスペクトル密度が得られる。[10][11]

実装の最小手順は共通している。1) データ読込と時間軸生成、2) 時間波形の可視化(単位とスケールを明示)、3) 解析区間の切り出し、4) 窓関数の適用とFFT、5) 片側スペクトルの作成とdB表示、6) STFTによるスペクトログラム描画、の順で進めるとよい。解析区間をズームして、波形・スペクトル・スペクトログラムの三点セットで同時に可視化すると、時間・周波数・時間周波数の対応が理解しやすい。MATLABやPython(librosaやmatplotlib)には、STFTやdB化、対数周波数軸、カラーバー表示などの関数が揃っており、specshowなどで簡潔に描ける。[2][3]

読み取りの基本も押さえると、解釈が安定する。スペクトログラムで縦に細く続く筋は持続する周波数成分を表し、瞬間的な衝撃は短時間に広帯域が立ち上がる横に薄い帯として現れる。音声では母音のフォルマント帯が横筋で見え、摩擦音は高域の帯で広がる、といった典型が知られている。機械音の診断では、回転数に対応する基本周波数とその高調波、さらに側帯域の有無が手掛かりになり、スペクトログラムとスペクトルを併読すると変化の時刻と原因帯域が結び付けやすい。時間と周波数の分解能のバランス調整は不可欠で、対象によって窓長を変える判断が必要である。[4][5][12][7]

実務上の注意点をいくつか挙げる。- 周波数軸の上限はナイキスト周波数fs/2であり、それを超える表示は意味を持たないため、取り込み設定と表示上限を一致させる。- 目盛りを細かく見せるゼロパディングは補間効果に近く、真の分解能(fs/N)は窓長で決まる点に注意する。- PSD表示では窓補正(ENBW)を考慮し、異なる窓・分解能間での比較を公平にする。- カラースケール(dB範囲)の設定次第で弱い成分が見えたり埋もれたりするため、上下限を目的に合わせて調整する。- 表示の再現性(乱数シード、窓長、ホップ、カラーマップ、単位)を記録し、比較の条件を揃える。[3][6][1][8]

学習や教材作成の観点では、段階的な可視化が有効である。まず時間波形でイベントの位置関係を理解し、次にFFTで全体の周波数分布を確認し、最後にスペクトログラムで「いつその帯域が強くなったのか」を重ねて読む。この三点セットを同一区間で並べると、衝撃・持続・高域化などの特徴が対応づけやすい。加えて、二つの信号の関係を見たい場合は、コヒーレンスや周波数領域の位相差を可視化する手法もあるため、原因—結果の結び付けや同期性の評価に役立つ。[13][14][2]

実装例のヒントとして、Pythonではlibrosa.stftとamplitude_to_db、display.specshowを組み合わせ、y_axis='log'やx_axis='time'を指定して対数周波数軸と時間軸を表示できる。初心者向けのチュートリアルでは、メル尺度などへの変換で表示の形を簡略化する話題も紹介され、用途に応じて可視化の軸や解像度を選べることが示されている。実用記事では、スペクトログラムを使うと二つの図を並べて差分が見えやすくなる点も強調され、比較の道具としての価値が説明されている。[15][14][3]

最後に、品質の要点を整理する。- 時間波形は開始—終了の時間軸を正しく作る。- スペクトルは片側、dB表示、適切な周波数軸を設定する。- スペクトログラムは窓長とオーバーラップのバランス、窓関数とENBW補正の理解、カラースケールの妥当化が鍵である。- 比較はPSDの正規化(Δf・ENBW補正)で公平にし、条件を明記する。- 解釈は三点セット(波形・スペクトル・スペクトログラム)で整合させ、時間と帯域の両面から確認する。これらを守れば、波形とスペクトログラムの可視化は、故障予知において「いつ・どの帯域が・どれだけ」変化したかを確かな根拠で示す強力な道具になる。[11][6][10][1][8][2] [1] https://qiita.com/y__h/items/8363caf27debf51b4144

[2] https://qiita.com/s_yukke/items/c84a84b4ae4291a2fdf8

[3] https://service.ai-prompt.jp/article/ai365-305/

[4] https://acp.amivoice.com/blog/2023-03-06-094430/

[5] https://logicalyze.com/fo-spectrogram-beginners/

[6] https://www.jstage.jst.go.jp/article/jasj/72/12/72_764/_pdf

[7] https://www.cradle.co.jp/media/column/a282

[8] https://www.zhinst.com/jp/blogs/how-control-spectral-leakage-window-functions-labone

[9] https://www.analog.com/media/jp/landing-pages/web_lab/tnj-081.pdf

[10] https://www.onosokki.co.jp/HP-WK/eMM_back/emm182.pdf

[11] https://www.mish.co.jp/wp-content/uploads/2020/08/Application-Example-34_10032019-1.pdf

[12] https://www.owon.co.jp/yl.asp?NewsID=564

[13] https://labo-code.com/python/coherence-pahse/

[14] https://qiita.com/purple_jp/items/7c91a05c547615e9ab89

[15] https://note.com/nishika_inc/n/n609db9be08b7

[16] https://note.com/lebris22/n/n857675bcdfd4

[17] https://www.onosokki.co.jp/HP-WK/eMM_back/emm150.pdf

[18] https://community.cadence.com/cadence_blogs_8/b/jcid/posts/start-your-engines-logic-electrical

[19] https://www.onosokki.co.jp/HP-WK/eMM_back/emm80.pdf

[20] https://www.sp.ipc.i.u-tokyo.ac.jp/~saruwatari/SP20_05.pdf

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

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

おすすめの記事