周波数成分の確認
複数の計測点で得られた時刻歴波形をローパスフィルタ処理によりノイズ除去するサンプルスクリプトstc_filter.omlを紹介します。
入力ファイルとして1列目に時刻、2列目以降に計測データが記録されているとします(sin_noise.csv)。今回は低周波のサイン波に高周波の振動成分が乗っている波形を考えます。
フィルタ処理の前に、別事例で紹介したFFT処理のスクリプトを用いて、周波数成分を確認してみましょう。sTC_FFT_CSV.omlを用いて、sin_noise.csvを処理すると、sin_noise.csv_fft.outが得られます。低周波成分がそれぞれ、1、2、3Hzで、高周波の振動成分が100Hzであることがわかります。100Hzの振動成分をノイズと仮定して、それを除去することを考えます。
バターワースフィルタによるノイズ除去
今回紹介するstc_filter.omlでは、バターワースフィルタを用いて、ノイズを除去するスクリプトです。
スクリプトstc_filter.omlの7行目のfilenameで入力ファイル名を指定します。データの列数は自動で取得します。
次に、stc_filter.omlの9-11行目の入力ファイルの時間刻みdt、カットオフ周波数cutoff_f、フィルタ次数orderを指定します。時間刻みをdt=0とした場合は、20-22行目にて、入力ファイルから初期の時間刻みを自動で取得します。フィルタ処理は、等間隔の時間刻みのデータが基本となります。1/(2*dt)が最大周波数となりますので、カットオフ周波数はそれ以下の値となるよう設定する必要があります。
カットオフ周波数は振幅の倍率が1/√2=0.707となる周波数です。それ以上の周波数帯にて、振動成分が大きく減衰されます。フィルタの次数により、減衰の倍率が変わります。今回は100Hzの振動成分をカットしたいので、カットオフ周波数は50Hzとし、次数は4としました。
フィルタ処理は、24-25行目のフィルタ係数の算出とフィルタ処理で実行できます。バターワース以外のフィルタを使用したい場合は、関数butterを変更します(ベッセルフィルタ:besself、besself3、チェビシェフフィルタ:cheby1、cheby2、楕円フィルタ:ellipなど)。フィルタ処理はfiltfilt関数を用います。filter関数では前から後ろに向かってフィルタ処理を行うので、時間遅れが生じます。filtfilt関数は前から後ろに向かってフィルタ処理を行った後、再度、後ろから前に向かってフィルタ処理を行いますので、時間遅れが生じません。
フィルタ処理した結果を示します。1~3Hzのサイン波のみが表示され、高周波の100Hzの振動成分が取り除かれていることがわかります。
最後に処理したデータをテキストファイルに書き出します。
まとめ
今回はCSVファイルを読み込み、ローパスフィルタ処理によりノイズ除去を行うスクリプトを紹介しました。本サンプルスクリプトおよびサンプル入出力ファイルは下の[サンプルデータのダウンロード]ボタンよりダウンロード可能です。是非、大量のデータをフィルター処理・ノイズ除去したい場合は、Altair Composeおよび本サンプルスクリプトを利用してみてください。
サンプル事例一覧に戻る