(解析メモ)等間隔でサンプルされてない信号の処理(簡単な整形だけ)
サンプリングレートが一定でない信号を解析しようとすると割と困る。普通の信号解析の教科書が扱っている信号は、大抵サンプリングレートが一定なので。
自分の場合は特に心拍RR間隔だけど、たとえば心拍数のトレンドを求めようとローパスフィルターとか移動平均フィルターとか書けようと思っても、カットオフ周波数ってこの場合どう考えれば良いの?とか、しばらく上手くデータ取れてなかったみたいなときは時間的にだいぶ離れたサンプルが隣り合うことになるけどそこどうするの?とか。
ありがたいことにmatlab先生はそこのところちゃんとカバーしてくれていた。その記録。
多くのグラフ系関数は横軸にdatetimeの配列を受け付けてくれる
データと一緒にタイムスタンプを記録していれば安心。横軸用のデータとしてタイムスタンプのベクトルを放り込めば、遠くのデータは遠くに、近くのデータは近くにプロットしてくれる。
なおタイムスタンプのベクトルは、matlab R2019aからは自動でdatetime形式と認識してくれるようになった模様(少なくとも私がよく使う心拍計=myBeatの出力形式に関しては)。R2018bまではテキストの入ったセル配列と認識されてたので変換する必要があってめちゃくちゃめんどくさかったんですが。古いバージョン使ってる人は今すぐアップグレードしましょう(トータルヘッドアカウントを契約してくれている弊社に感謝)
日付と期間のプロット - MATLAB & Simulink - MathWorks 日本
外れ値検出などもdatetime形式の横軸を考慮して動かせる
たとえば
のリンクからName, Valueの組み合わせをよく見ると、'SamplePoints'というオプションがある。つまり、たとえば
TF = isoutlier(x, 'movmean', 'minutes(5)', 'SamplePoints', tx) (xは対象の信号、txは信号の各値に対応するタイムスタンプのベクトル)のように入力すれば、5分の時間窓による移動平均値をベースに外れ値判定をしてくれる。
データの外れ値を検出 - MATLAB isoutlier - MathWorks 日本
データの外れ値の検出と置き換え - MATLAB filloutliers - MathWorks 日本
等間隔にリサンプルすることもできる
していいのかどうかよくわからないけど、等間隔データとしてリサンプルすることもできる模様。まあでもRR間隔の周波数解析にFFTが使われることもあるので、怒られはしないのかもしれない。詳しい理屈はよく知りません(だれか教えて下さい)。resample関数を使う。
から先の入力例がそれ(xは対象の信号、txは信号の各値に対応するタイムスタンプのベクトル)。
と入力すればtyとしてresample後のタイムスタンプも返してくれるらしい。便利。
均一または不均一なデータを新しい固定レートでリサンプリング - MATLAB resample - MathWorks 日本
一様にサンプリングされていない信号のリサンプリング - MATLAB & Simulink Example - MathWorks 日本
一様にサンプリングされていない信号のスペクトル解析 - MATLAB & Simulink Example - MathWorks 日本
その他
詳しくはわからないけどtimetableの整理とか言うドキュメンテーションが。
欠損または重複する時間および非等間隔の時間をもつ timetable の整理 - MATLAB & Simulink - MathWorks 日本
他にもいくつか適当にリンクをたどっていくと、なるほど医療データ(患者さんに「月1回検査しましょう」→30日ごと?31日ごと?)とか自然観察データ(悪天候のため観測不能)とかではサンプリング間隔を一定にしようがないケースはちょいちょいあるんだなとわかった。気象データなんかも野ざらしのセンサーがたまに壊れたりしたらなるのかな。琵琶湖の水位とかも観測所がお休みだったりするし。
こういうタイプの信号処理ってまとまったテキストあるのかなあ。上の処理でとりあえず見た目を整えることはできるけど、もうちょっと高度なことしようと思ったときにどういう影響が出てくるのかよくわからないのはちょっと気持ち悪い。まあこういうのはフィールド寄りのデータが多そうなので、理論的にどうこうできるものではないのかもだけど。