

「整理整頓が得意な人ほど、fft分析を使わずに損しています。」
fft分析の「FFT」とは、Fast Fourier Transformの略称で、日本語では高速フーリエ変換と呼ばれます。一言で言えば、「時間の流れで観測した複雑な波形を、周波数ごとに分解して可視化する手法」です。
私たちの身の回りにある音、振動、電気信号はすべて「波」です。そしてその波の正体は、複数の「単純な正弦波(サイン波)」が重なり合ったものです。たとえばギターの弦を弾いた時の音は、1つの周波数だけではなく、基本音と倍音が複雑に混ざり合って成り立っています。fft分析とは、まさにその「混ざり合い」を解きほぐして「どの周波数が、どのくらいの強さで含まれているか」を一目で示してくれる分析手法です。
つまり時間軸→周波数軸への変換です。
横軸を「時間」から「周波数(Hz)」に変換することで、グラフ上にピークが表れ、その信号がどの周波数成分でできているかが瞬時に判断できます。たとえば3Hz、9Hz、20Hzにそれぞれ鋭いピークが立っていれば、その波形はこの3つの周波数成分が混じり合っていることを意味します。
フーリエ変換そのものは18世紀のフランス人数学者ジョゼフ・フーリエが考案した数学的な手法であり、理論的には無限時間のデータが必要でした。しかし1965年、J.W.CooleyとJ.W.Tukeyにより、データ点数を2のn乗にとることで計算量を劇的に削減するアルゴリズムが提案されました。これがFFT(高速フーリエ変換)です。
数字で見ると驚きがあります。データ数が1024点の場合、通常のフーリエ変換では1,048,576回の掛け算が必要ですが、FFTではたった10,240回に短縮されます。これは100分の1以下の計算量です。この革命的な効率化のおかげで、リアルタイムでの信号処理や、手元のPCでの分析が現実的になりました。
FFTは「速く計算するための工夫」、これだけ覚えておけばOKです。
参考リンク(フーリエ変換の歴史とFFTの仕組みについて詳しく解説)。
小野測器 - 技術レポート FFTアナライザーについて(page 1)
fft分析を正しく理解するうえで、混乱しやすいのが「フーリエ変換」「DFT」「FFT」の3つの概念の違いです。これらはすべて「時間信号を周波数に変換する」という目的は同じですが、扱う対象と計算方法が異なります。
まずフーリエ変換(FT:Fourier Transform)は、連続したアナログ信号(無限に続く連続波形)を周波数領域に変換する数学的な手法そのものです。理論的な概念であり、実際のコンピュータでそのまま計算することはできません。
次に離散フーリエ変換(DFT:Discrete Fourier Transform)は、コンピュータが扱えるデジタル信号(0と1で区切られた離散的なデータ)を周波数領域に変換する方法です。アナログ信号をセンサーで測定してデジタル数値に変換したデータが入力になります。コンピュータでの処理が可能になりましたが、計算量が非常に多いという問題がありました。
そして高速フーリエ変換(FFT:Fast Fourier Transform)は、このDFTを「高速に」計算するためのアルゴリズムです。FFTはDFTを計算するための効率的な「手順書」であって、別の変換ではありません。これが重要な点です。
3つの関係は下記のように整理できます。
フーリエ変換とFFTの違いは、「理論」と「実装」の差です。
現場で「FFT解析」と言われる場合、ほぼ必ずこのFFTアルゴリズムを使ったDFT計算を指しています。また、FFTアナライザーとは、センサーから取得したアナログ信号をデジタルサンプリングし、FFTアルゴリズムで即座に周波数スペクトルを表示する計測器です。「スペクトルアナライザー」とも呼ばれます。
参考リンク(フーリエ変換の種類と違いを数式なしで図解解説)。
KLV株式会社 - 周波数解析におけるフーリエ変換をわかりやすく解説
fft分析を実行すると、横軸が「周波数(Hz)」、縦軸が「振幅(信号の大きさ)」のグラフ(スペクトル)が得られます。このグラフをどう読むかが実際の活用において最も重要です。
グラフを見るときのポイントは3つです。
実際の活用例を見てみましょう。ある建物の床で歩行時に「フワフワとした揺れ」の問題が発生したとします。振動を測定してFFT分析したところ、7.5Hzにはっきりとした鋭いピークが現れました。事前調査でその床の固有振動数(共振しやすい周波数)も7.5Hzだったことがわかっていたため、「歩行の振動が床の固有振動数と一致して共振現象が起きている」と診断できました。その後、制振装置を設置して7.5Hz成分を低減したところ、振動の大きさが対策前の4分の1にまで減少しました。
これが「時間波形だけを見ていてはわからない情報」です。時間波形では「揺れている」という事実はわかっても、「なぜ揺れているのか」の原因がわかりません。スペクトルが原則です。
工場の生産ラインでも同様です。軸受(ベアリング)が正常な状態では特定の周波数にピークが現れます。しかし軸受に損傷が起き始めると、損傷に関連する別の周波数にピークが出現します。これをFFT分析で監視することで、目視では発見できない「壊れかけ」の段階で部品交換を行い、突発的な設備停止を未然に防げます。
fft分析から「故障の場所」が特定できることも意外ですね。
時間波形のオーバオール値(全体の振動レベル)だけを測定していた場合、異常の初期段階では変化が小さすぎて気づけません。一方、FFT分析で特定の周波数成分を監視することで、微小な異常でも検出が可能です。これがfft分析が予防保全(設備を壊れる前にメンテナンスする考え方)において特に重視される理由です。
参考リンク(実際のFFT振動分析例と制振対策の具体的な事例)。
ヤクモ株式会社 - 振動・騒音分析の基礎(2)FFT分析まるわかりガイド
fft分析を実際に使いこなすためには、「落とし穴」となる3つの重要な概念を押さえておく必要があります。知らずに使うと、分析結果が正確でも意味のない数字になりかねません。
① サンプリング定理とナイキスト周波数
fft分析の入力データは、センサーで測定したアナログ信号をデジタルに変換(サンプリング)したものです。サンプリングとは「一定間隔でデータを取得すること」で、1秒あたりの取得回数をサンプリング周波数(単位:Hz)と呼びます。
ここで重要なのがサンプリング定理(ナイキスト定理)です。「信号に含まれる最高周波数の2倍以上のサンプリング周波数が必要」というルールです。たとえば1000Hzまでの成分を正確に分析したいなら、サンプリング周波数は最低でも2000Hz以上が必要です。このサンプリング周波数の半分の値をナイキスト周波数といい、fft分析で取得できる最大の周波数を意味します。これが条件です。
ナイキスト周波数を超えた成分が存在すると、「折り返しひずみ(エイリアシング)」という誤りが発生し、本来存在しない周波数にピークが現れてしまいます。
② リーケージ(スペクトル漏れ)
fft分析は「有限の長さに切り取ったデータ」に対して計算します。このデータを「永遠に繰り返されるもの」として処理するため、切り取りの端と端がちょうどつながっていない場合、不連続な「段差」が生じます。この段差が周波数領域では広がりを持ったノイズとして現れ、本来1本のはずのピークが広がって見えてしまいます。これがリーケージ(漏れ)です。これは痛いですね。
③ 窓関数(Window Function)
リーケージを抑制するために使われるのが窓関数です。切り取ったデータの両端を緩やかにゼロに近づけるように重みをかけ、不連続をなくす処理です。代表的な窓関数として、一般的な用途に適したハン窓(Hann窓)と、高精度な測定に向いたブラックマン・ハリス(Blackman–Harris)窓があります。
ただし窓関数を使うとトレードオフがあります。ハン窓を使った場合、スペクトルリーケージは大幅に減りますが、信号パワーが元の3/8に低下し、周波数分解能も下がります。そのため、信号の形をざっくり把握したいならハン窓、SNR(信号対雑音比)を高精度に測定したいならブラックマン・ハリス窓、というように目的に合わせて選ぶことが大切です。
| 窓関数の種類 | 特徴 | 主な用途 |
|---|---|---|
| 矩形窓(なし) | 分解能最高・リーケージ最悪 | 信号周期がデータ長に一致するとき |
| ハン窓(Hann) | バランスが良い | 一般的なFFT評価・振動・音響 |
| ハミング窓(Hamming) | ハンに似るが端点を0にしない | 音声解析 |
| ブラックマン・ハリス窓 | リーケージ最強抑制 | 高精度ADC評価・ノイズ特性測定 |
「どの窓関数を使うかは目的次第」が基本です。
参考リンク(スペクトルリーケージと窓関数の仕組みを詳しく解説)。
nanaloglab - 窓関数とは?スペクトルリーケージの原因と対策を解説
fft分析を学んだら、実際に手を動かしてみるのが理解を深める最短ルートです。Pythonには「NumPy」と「SciPy」という無料のライブラリがあり、これらを使えば複雑な数式を理解していなくても、数行のコードでfft分析を実装できます。これは使えそうです。
NumPyのFFT機能である`numpy.fft.fft()`は最もシンプルな実装方法です。以下は基本的なコード例です。
```python
import numpy as np
import matplotlib.pyplot as plt
# サンプリング条件の設定
fs = 1000 # サンプリング周波数 1000Hz
T = 1.0 # 計測時間 1秒
N = int(fs * T) # データ点数 1000点
t = np.linspace(0, T, N, endpoint=False)
# 50Hzと120Hzの正弦波を合成した信号を作成
freq1, freq2 = 50, 120
signal = np.sin(2 * np.pi * freq1 * t) + 0.5 * np.sin(2 * np.pi * freq2 * t)
# FFT実行
fft_result = np.fft.fft(signal)
freqs = np.fft.fftfreq(N, d=1/fs)
# 振幅スペクトルを計算(正の周波数のみ)
amplitude = np.abs(fft_result:N//2) * 2 / N
# グラフ表示
plt.figure(figsize=(10, 4))
plt.plot(freqs:N//2, amplitude)
plt.xlabel("周波数 Hz")
plt.ylabel("振幅")
plt.title("FFT解析結果")
plt.grid(True)
plt.show()
```
このコードを実行すると、横軸に周波数、縦軸に振幅のグラフが出力されます。50Hzと120Hzにはっきりとしたピークが現れ、その高さの比率も元の信号の強さ(1:0.5)に対応していることが確認できます。
SciPyを使う場合は`scipy.fft.fft()`が利用可能です。SciPyのFFTは内部の最適化が施されており、特に大きなデータや繰り返し処理の多い用途ではNumPyよりも高速に動作する場合があります。また、SciPyの`signal`モジュールには短時間FFT(STFT)の実装である`ShortTimeFFT`クラスも含まれており、時間の経過とともに周波数が変化する信号(例:エンジン回転数が上昇するときの音)を分析する場合に非常に便利です。
Pythonでの実用的な活用例として代表的なものをまとめます。
NumPyもSciPyも無料で使えます。
fft分析の実装で最初につまずきやすい点は「サンプリング周波数の設定」と「振幅の正規化」です。`numpy.fft.fft()`が返す値は複素数なので、`np.abs()`で絶対値(振幅)を取り出す必要があります。また正の周波数のみを使う場合はデータの前半(`:N//2`)を使い、振幅を正確に得るには`2/N`で割り算(正規化)を忘れないようにしましょう。正規化は必須です。
参考リンク(PythonでのFFT実装とSciPyを使った周波数解析の詳細)。
WATLAB - PythonでFFT実装!SciPyのフーリエ変換まとめ