リサンプリングのみ
複数の計測点で得られた時刻歴波形のデータの時間刻みを線形補間により変更するサンプルスクリプトstc_resampling.omlを紹介します。
入力ファイルとして1列目に時刻、2列目以降に計測データが記録されているとします(sin_noise.csv)。低周波の1~3Hzサイン波に96Hzの振動成分が乗っている波形を考えます。
元のファイルは時間刻みdt=0.001sec、サンプリング周波数1/dt=1000Hzです。時間刻みをdt=1/100、サンプリング周波数100Hzに変更してみましょう。
スクリプトstc_resampling.omlの7行目のfilenameで入力ファイル名を指定します。データの列数は自動で取得します。
次に、stc_ resampling.omlの9行目で新しい時間刻みdt_rを指定します。今回はdt_r=1/100とします。
22行目のinterp1関数で線形補間を行い、新しい時間刻みでの値を取得します。スプライン補間を用いた場合はオプションの’linear’を’spline’に変更します。
新しい時間刻みでのグラフが得られます。
最後に処理したデータをテキストファイルに書き出します。
リサンプリング後の周波成分の確認
別事例で紹介したFFT処理のスクリプトを用いて、リサンプリング後の波形の周波数成分を確認します。sTC_FFT_txt.omlを用いて、sin_noise.csv_resamp.outを処理すると、sin_noise.csv_resamp.out_fft.outが得られます。元々、低周波の1~3Hzサイン波に96Hzの振動成分が乗っている波形だったものが、リサンプリングにより1~4Hzの波形に変化していることがわかります。こうなってしまうと、元々の低周波1~3Hzのサイン波を抽出することはできません。このように、リサンプリングのより波形の形が変わってしまうことを、折り返し誤差、エイリアシングと呼ばれます。
ローパスフィルタ+リサンプリング
サンプリング周波数の1/2をナイキスト周波数と呼び、そのサンプリングで表せる最大周波数となります。したがって、元のサンプリング周波数は1000Hzなので、500Hzまでの周波数の波形を表現でき、リサンプリング後のサンプリング周波数は100Hzなので、50Hzまでの周波数の波形を表現できます。
今回エイリアシングが生じ、波形の形が変わってしまったのは、元々の波形にリサンプリング後のナイキスト周波数50Hzより大きな周波数の波形(96Hz)が含まれていたためです。正しい波形を得るには、50Hz以上の波形はそもそも表現できないので、リサンプリング前に取り除く必要があります。
別事例で紹介したフィルタ処理のスクリプトを用いて、先に96Hzの振動成分を除去した後に、100HzでリサンプリングするスクリプトsTC_resampling_filter.omlを紹介します。
スクリプトstc_resampling.omlの7行目のfilenameで入力ファイル名を指定します。データの列数は自動で取得します。
次に、stc_ resampling.omlの9行目で新しい時間刻みdt_rを指定します。今回はdt_r=1/100とします。
リサンプリングの周波数に合わせて、カットオフ周波数を設定します。1/(dt_r*2)=50Hz以下にする必要があります。フィルタ特性により50Hz以上が完全に除去できるわけではないので、通常、50Hzより小さい値を指定します。本スクリプトでは0.5倍の25Hzとなるよう指定しています。
その後、フィルタ処理およびリサンプリング処理が行われ、新しい時間刻みでのグラフが得られます。低周波1~3Hzの波形の形を変えずに、リサンプリングできていることがわかります。
まとめ
今回はCSVファイルを読み込み、リサンプリングを行うスクリプトを紹介しました。また、元の波形にリサンプリングの周波数では表現できない高周波の波形が含まれる場合は、エイリアシングを回避するため、ローパスフィルタ処理ののち、リサンプリングを行うスクリプトを紹介しました。本サンプルスクリプトおよびサンプル入出力ファイルは下の[サンプルデータのダウンロード]ボタンよりダウンロード可能です。是非、大量のデータをリサンプリングしたい場合は、Composeおよび本サンプルスクリプトを利用してみてください。
サンプル事例一覧に戻る