- KVKV-X
FFT (高速フーリエ変換)
概略
高速フーリエ変換を行うファンクションです
振動センサや音のデータを元に振動パターンを分析して故障の兆候を早期に発見するためにFFTを使用します
FFTの概要
FFTは時間領域の信号を周波数領域に変換する手法です
時間領域の信号は、振幅が時間とともに変化する波形として表現されます
周波数領域では、信号を構成する各周波数成分の振幅と位相として表現されます
FFTを使用することで、信号に含まれる周波数成分を分析することができます
FFTファンクションの処理内容
- サンプリング周波数
信号をデジタル化する際の時間間隔の逆数です
ナイキストの定理により、分析したい最高周波数の2倍以上のサンプリング周波数が必要です
例:100Hzの信号を分析するには、200Hz以上のサンプリング周波数が必要です
- サンプル数
FFTは2のべき乗のサンプル数(256, 512, 1024など)で実行する必要があります
サンプル数が多いほど周波数分解能が向上します
周波数分解能 = サンプリング周波数 ÷ サンプル数
- 窓関数
信号の両端で不連続が生じるのを防ぐために使用します
ハン窓、ハミング窓、ブラックマン窓などがあります
信号の特性に応じて適切なウィンドウ関数を選択します
- FFTの実行
複素数の実部と虚部を計算
振幅スペクトルと位相スペクトルを算出
パワースペクトル密度の計算
データの前処理
デジタルフィルタでノイズを除去
- LPF
- HPF
- BPF
- Notch
- など
これらの要素を適切に設定することで、より正確な周波数分析が可能になります。
デジタルフィルタで解説しています
シンボル
FFT (高速フーリエ変換)

- Data
- サンプリングデータ
- DataSize
- サンプリング数
512 1024 2048 4096 8192 16384 - WindowType
- 窓関数
0:Hamming 1:Hann 2:Blakman 3:Rectangular
- FFTData
- パワースペクトル

- Data
- サンプリングデータ
- WindowType
- 窓関数
0:Hamming 1:Hann 2:Blakman 3:Rectangular
- FFTData
- パワースペクトル
窓関数(WindowType)
| 値 | 窓関数 |
|---|---|
| 0 | ハミング窓 |
| 1 | ハン窓 |
| 2 | ブラックマン窓 |
| それ以外 | 矩形窓 |
Data
FFT分析するアナログデータをサンプル数分の配列にセットして入力します
DataはLREAL型の配列で配列の数は次のサイズにします
- 512
- 1024
- 2048
- 4096
- 8192
- 16384
WindowType
ウィンドウ関数は、FFT分析時に信号の両端で生じる不連続を防ぐために使用されます。
以下のウィンドウ関数から選択できます
- 0: ハミング窓
- 1: ハン窓
- 2: ブラックマン窓
- 3以上: 矩形窓(ウィンドウなし)
各ウィンドウ関数の特徴:
- ハミング窓:ハン窓よりサイドローブが小さく、周波数分解能は若干低下
- ハン窓:一般的な用途に適しており、周波数分解能とサイドローブの抑制のバランスが良い
- ブラックマン窓:サイドローブが非常に小さいが、周波数分解能は低い
FFTData
パワースペクトル密度を出力します
周波数分解能あたりのパワーを表します
周波数分解能 = サンプリング周波数 ÷ サンプル数
配列数は8192ですが、サンプル数の半分の配列に計算結果を出力します
アナログ入力波形からFFTへの波形の変化
検証用で3つの波形の合成したアナログ波形を使用して説明します
- 周波数:50Hz
- 周波数:800Hz
- 周波数:2000Hz
サンプリング周期: 10000Hz
サンプリング数: 2048
アナログ入力波形

ローパスフィルタ(LPF)を掛けた波形
カットオフ周波数=1000Hzを設定して1000Hz以上の周波数を取り除きます

窓関数
窓関数はハミング窓,ハン窓,ブラックマン窓,矩形窓をFFTファンクションの入力で選択できます

矩形窓以外は繰り返しアナログデータをサンプリングしながらFFTの計算をして波形を出力するような場合に繋ぎ目がノイズなってしまうのを防ぐため最初と最後の出力をゼロに近づけています
連続した振動や音を単発でサンプリングするのであれば矩形窓で入力波形をそのまま使います
ここではハミング窓を使っています
FFT波形
ハミング窓の波形をもとにFFTを計算したグラフです (窓関数の計算はファンクションの中で計算しています)
FFTファンクションブロックの実装
ここでは次の3つの周波数を合成したダミーのアナログデータを使用します
ダミーのアナログデータは1スキャンで10個分をAnalogData[]の配列に順番に格納していきます
(実際にはアナログユニットなどからのデータを取得することになります)
- 周波数:50Hz
- 周波数:800Hz
- 周波数:2000Hz
ラダー回路
00069
取得したアナログデータにローパスフィルタ(LPF)を通します
サンプリング周波数 = 10kHz
カットオフ周波数 = 1kHz
LPFファンクションブロックはデジタルフィルタで入手できます
00083
StoreSamplingDataフラグをONすることでサンプリングを開始します
StoreSamplingDataフラグは次のブロックでデータが揃ったらOFFになるので待ちます
00085
StoreSamplingDataフラグがONのときにローパスフィルタ後の値をData[]に貯えます
Data[]のデータが揃ったらStoreSamplingDataをOFFにします
(ここでは要素数2048)
00115
StoreSamplingDataの立下りでFFTの演算を行います
サンプリング数: 2048
窓関数は 0:ハニング窓にしました
演算結果 FFTData
計算で得られたFFTDataをファイルに書き出すか下記の補足のようにExcelにコピペしてグラフを作成しました

分解能: サンプリング周波数/サンプリング数 = 10000/2048 = 4.882813
有効周波数: サンプリング周波数/2 = 10000/2 = 5000Hz
50Hz, 800Hz, 2000Hzが確認できます
00004
取得したアナログデータにローパスフィルタ(LPF)を通します
サンプリング周波数 = 10kHz
カットオフ周波数 = 1kHz
LPFファンクションブロックはデジタルフィルタで入手できます
00005
StoreSamplingDataフラグをONすることでサンプリングを開始します
StoreSamplingDataフラグは次のブロックでデータが揃ったらOFFになるので待ちます
00007
StoreSamplingDataフラグがONのときにローパスフィルタ後の値をData[]に貯えます
Data[]のデータが揃ったらStoreSamplingDataをOFFにします
(ここでは要素数2048)
00008
StoreSamplingDataの立下りでFFTの演算を行います
サンプリング数: 2048
窓関数は 0:ハニング窓にしました
演算結果 FFTData
計算で得られたFFTDataをファイルに書き出すか下記の補足のようにExcelにコピペしてグラフを作成しました

分解能: サンプリング周波数/サンプリング数 = 10000/2048 = 4.882813
有効周波数: サンプリング周波数/2 = 10000/2 = 5000Hz
50Hz, 800Hz, 2000Hzが確認できます
補足
配列のモニタ値をExcelに貼り付けたかった...
スマートなやり方が分からなかったのでこんなやり方になった
メニューバーから「モニタ/シミュレータ」-「デバイス値一括変更/読出し」
Ctrl+Iでインクリメント挿入を必要な配列分を繰り返し

PLC-全項目読出しのあと
Ctrl+A で全選択のあとコピー(Ctrl+C)してExcelの貼り付けたいセルにペースト(Ctrl+V)



