2007年04月13日 (Fri)

Excel VBAでデジタル信号処理。

ここ数週間、Excelのデータプロット問題に悩まされている。

詳細はこの辺とかでも触れた通り、仕事で測定しているデータのサンプル数が多過ぎてマトモにプロット出来ないのだ。んでもってWord貼り付け用にIllustratorでEPS化しようにも、データが重くて処理がコケる。
そこで、今日は昨晩紙の上で練っておいたアルゴリズムVBA実装し、データの間引きに挑戦してみた。

そもそも、単純な間引き処理であれば10行置きにデータ読み込むとか、移動平均取るとかいった安直な方法で片付けてしまえば済む話。しかし、今回対象としている測定データはパルス状に混入しているノイズデータが結構重要で、単純に移動平均や間引きを行ってしまうと貴重なデータが欠落してしまう。
そこで、ローパスフィルタを噛ませつつもデシベルのデカいノイズ成分だけ残してやるというのが本件の非常に厄介な所。

んで、考案したアルゴリズムというのがコレ↓

  1. 測定データを一定間隔で区切る
  2. 各区間の両端点を結ぶ線分に対し、区間内の全ての点との距離を算出
  3. 線分からの距離が閾値を超えた点にフラグを立てる
  4. フラグの立った点間で再度データを区切り、2以下の処理を繰り返す
  5. 4の処理が終了した時点でフラグの立っている特長点だけを抜き出し、データをプロットする

一見巧くいきそうなのだが、実際やってみると過渡領域の再現性が悪くなったり、頂点数が全然減らなかったり。コーディング自体は予想に反してほぼ一発でOKだったのだが、その後の閾値調整が難航。
結果的にはグラフの形状を極めて良好に保ったままサンプル数を1/6程度まで減らす事に成功したのだが、一番最初に区切った区間に因ってかなり間引き量に差が出てしまい、キレイさっぱり点が無くなってしまった区間もあれば殆ど点が消えなかった区間もあり。確かに定常域に乗ってしまっていたノイズ成分はいい具合に再現されていたものの、6万サンプル処理するのに1分近く掛かってこの程度の結果というのはちょっと残念。

ホントは本気でローパスフィルタ掛けてノイズ部分だけ弾くようなアルゴリズム組めればいいんだけど、自分信号処理専門じゃないしよく分からん。かと言って、勉強する時間なんてある筈もなければ今更勉強する気にもなれない。ただ、持ち合わせている知識を結集して小物を作るのはそれなりに楽しい作業である。
少なくともポリシー持って精密測定やっている手前「移動平均取ればノイズなんて関係無い」「温度の絶対値なんてアテにならないから変動だけ見ればいい」なんて平然と抜かす先輩社員と一緒にされては困る。ノイズが乗ってしまうのであればまずはノイズ対策を施すべきだし、絶対温度が測定出来ていない事自体を正当化するのは明らかに誤りである。矢張りノイズも絶対変動量も大事なのだ。

取り敢えず今のままだとIllustratorにすんなり持ち込める程データが軽く出来ていないので、再度アルゴリズムを練り直す予定。流石に移動平均てのはアテにし難いので、もうちょっとマシに直線近似して巧くデータ馴染ませて、デカいノイズだけ閾値設けて取り出す方向で。
ソースの骨組みだけは今日組んだものが流用出来る筈なので、月曜半日使えば仕上がると思う。多分。

…こんな私ですが一応メカ屋なのよ…。

Copyright © 2007 Team Flame Magician, All rights reserved.