IGOR Pro は波形データを扱うことを得意としていますが、最近は機器から得られるデータも無駄に細かくて、肥大化する傾向にありますので、「このデータ(ウェーブ)、1,000 ポイントもあるんだけど、適当の間引いて 100 ポイントにしたいなぁ」って思うことありますよね。今回はそんなとき、ちょっと役立ちそうなお話を。

▼ データを間引く

一言で、データを間引くと言っても、いろんな方法がありますよね。今回やってみるのは次の二つ。

  • n ポイントごとに抽出
  • 近傍 m ポイントのデータの平均値

▼ n ポイントごとに抽出

この方法は、以前紹介した、p, q, r, s といったインデックスを使う方法です。

Make/O/N=1000 source
SetScale x 0, 5, source
source= sin(x) + gnoise(.1)
Make/O/N=100 decimated
SetScale x 0, 5, decimated	// (1) 
decimated = source[p*10]	// (2) 

1000ポイントのウェーブ(source)から、10ポイントごとに間引いたウェーブ(decimated)を作っています。途中 (1) では、100ポイントにしても同じデータレンジになるようにスケーリングを設定しています。また (2) が肝で、

for(p=0;p<100;p+=1) decimated[p]= source[p*10]

と同等な処理になっています。

1.png

IGOR Pro バージョン6 以降であれば、Resample 操作関数を使って、

Duplicate/O source, resampled
Resample/DOWN=10/N=1 resampled

とやっても、同じ結果(decimated = resampled)が得られます。Duplicate 操作関数で複製しているので、スケーリングを意識しないで済む分だけ簡単ですね。

▼ 近傍 m ポイントのデータの平均値

前述のように、不要なデータポイントを切り捨てるのではなく、近傍のデータから平均値を計算して間引く方法もありますね。たまたま抽出したポイントが外れ値となってしまうリスクを回避できますが、一方で平均化によって、情報が変異してしまう恐れもあります。

Make/O/N=1000 source
SetScale x 0, 5, source
source= sin(x) + gnoise(.1)
Make/O/N=100 smoothed
SetScale x 0, 5, smoothed
smoothed= mean(source, x, x+9*deltax(source))  // (3)

違うのは (3) の1行だけ。mean 関数を使って、近傍(正確には右側10ポイント)の平均値を得ています。(2) では行インデックス p を使いましたが、(3) では x を使っています。x は、左辺のウェーブの x スケーリングを返します。smoothed は 0~5 のデータレンジを 100 分割した x スケーリングを持っていますので、(3) では、smoothed のある x 値に対応する source の値から、10 ポイント右側のデータを平均する処理が、100回繰り替えされています。deltax 関数で source のデルタを使っているところがポイントです。

2.png

問答無用で10ポイントごとに抽出した場合より、近傍の平均を計算したほうが、グラフの は滑らかになっています。良し悪しは別にして。

さらに、一工夫すれば、右側を平均化するのではなく、左右 5 ポイントずつ平均化することもできますね。

Make/O/N=100 centered
SetScale x 0, 5,centered
centered = mean(source, x-5*deltax(source), x+5*deltax(source))

やはりここでも Resamle が使えて、

Duplicate/O source, resampled2
Resample/DOWN=10/WINF=None/N=11 resampled2 

といった具合です。

▼ おまけ

一定の条件を満たすデータポイントだけを抽出するには Extract 操作関数を使います。

Make/O/N=30 source= x
Extract/O source,dest,source>10 && source<20
print dest

履歴ウィンドウに

dest[0]= {11,12,13,14,15,16,17,18,19}

と出力され、条件式 10 < source < 20 を満たすポイントだけが dest に抽出されていることが分かりますね。

▼ まとめ

データを間引く方法をいくつか紹介しました。今回は地味ですが、それなりに実用的な話題だったとも思いますが、いかがでしょうか?

--
井上@技術部でした。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/480
内容に対しての関連性がみられないものは削除する場合があります

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報