Translate

【python】pythonを使って異なるサンプリング周波数を特定の周波数に合わせる方法【resampy】

こんにちは。

私は理学療法士の領域で仕事をする機会が多く、三次元動作解析装置を使ったデータ計測や解析をよく行います。

その際に、いろいろな計測デバイスを使用するのですが、大抵の場合にはそれぞれの計測デバイスのサンプリング周波数が異なる場合が多いです。例えば床反力計が1000Hzで三次元動作解析装置が100Hzといったのが良い例だと思います。

先ほどの例のようにそれぞれの計測デバイスのサンプリング周波数が1:10のようになっていれば片方のデータ(大抵の場合はサンプリング周波数が細かい方)をダウンサンプリング(例の場合であればデータの取得を1/10にする)させてあげれば簡単にサンプリング周波数を合わせることができます。

しかしながらすべての計測デバイスが同じ倍数上で設定されていれば問題ないのですが、大抵の場合にはそうはいかず、うまくサンプリング間隔を調整できない場合が多いと思います。例えば片方の計測デバイスが1000Hzでもう一つの計測デバイスが240Hzだった場合が挙げられます。

こういった場合には、片方のデータをリサンプリングする必要があります。単純に各データがしっかりと同期されており、片方のデータ長に合わせるようにデータ長に合わせるだけであれば、私が以前紹介したリサンプルの関数で対応することができます。


データが同期されておらずそれぞれのデータ計測タイミングがバラバラでかつ、サンプリング周波数が異なる場合には、サンプリング周波数をそろえた上でデータを同期する必要があります。

今回はサンプリング周波数の調整のうえで後者の例に対応するために使えるpythonパッケージを紹介していこうと思います。

pythonでサンプリング周波数を調整する場合にはresampyがおすすめ。




サンプリング周波数の調整はexcelなどでやろうとするとかなり地獄の作業になることが想定されるのですが、pythonを使うことで意外にも簡単に行うことができます。

pythonではパッケージをインポートすることで機能を拡張することができます。numpyやpandasなどがそれに該当します。

今回もそれらのパッケージと同じように便利なツールをインストールします。その名も「resampy」と呼ばれるパッケージになります。

調べてみるとresampyは音声データのアップサンプリングやダウンサンプリングに使われているみたいですね。それらのデータではかなりのハイサンプリングのデータを扱っているっぽいですが、自分で試した結果、理学療法領域のデータ計測で使うような30Hz-1000Hz帯の計測データでも使用することができました。

resampyのパッケージのインストールには、pipを使用します(Anacondaでパッケージを管理している前提で話を進めます)。

スタートメニューにあるAnaconda Promptを開くと黒い画面(コマンドプロンプト)が出現するので、その黒い画面の中に以下のコマンドをコピペして入力します。

pip install resampy

これでエラー無くコードが走ってくれればresampyのインストールは完了できています。これ以降はpythonコードの頭の部分で【import resampy】と書いておくだけで以降のその.pyファイル(pythonコードが書かれたファイル)でresampyを使用することができます。

resampyは実際のコードでresampy.resample(○○)と使う。

それでは実際にresampyを使用してみましょう。resampyでサンプリング周波数を調整する場合には、resampyの中にある関数の一つである、resampy.resampleを使用します。

実際のコードでは以下のようになります。

data_resampled = resampy.resampy(data,sampling1,samplig2)、とこんな感じで書く感じになります。引数と呼ばれる関数を動かすために必要になるデータは、①リサンプルしたいデータ(dataに相当)、②リサンプル前のサンプリング周波数(sampling1に相当)、③変更後のサンプリング周波数(sampling2に相当)になります。

例えばresampyを使って240Hzのデータを100Hzに変更したい場合には、以下のようなコードになります。

data_resampled = resampy.resampy(data,240,100)

こういう感じのコードになります。

リサンプル処理を行うとデータの同期が可能になる

resampyを使ってデータのリサンプルを行うことで、異なるサンプリング周波数で計測されたデータを同一サンプリングで計測した状態にすることができます。

この処理を行っておくことで、仮に異なるサンプリング周波数で計測されたデータが同期されていなかったとしても、データの同期を図ることができる場合があります。データの同期については次の記事で紹介していこうとおもっているのでよろしくお願いいたします。