非等間隔サンプリングの表示を正しく
Cosmo-ZのWindowsアプリで、非等間隔サンプリングの場合の表示が正しく行われるようにしました。
地味な作業ですが結構大変です。
下の図は5usのところに1nsの幅のパルスがある図ですが、画面の幅に対して10000:1の細さのパルスなので単純に実装してしまうと描き切れずに消えてしまいます。
かといって1つ1つのポイントを全部書いていると、長いデータ、例えば1000万ポイントの長さの波形を表示しようとしたときに非常に時間がかかってしまいます。
そこで、画面のx座標を1ピクセルずつfor文で回して、その1ピクセルの間に表示すべきデータが複数個あるときには最大値と最小値を結ぶ縦線で描くということにしました。
しかし、画面の時間軸の分解能を上げて「1pixel > サンプリング間隔」になった場合、データがない部分のピクセルを直線で結ばなければならないので、単純にやるとうまくいきません。
すごく試行錯誤して、なんとか、1pixel < サンプリング間隔の場合も、1pixel > サンプリング間隔の場合も、どちらもうまく表示できるようになりました。
また、波形をマウスクリックすることで、サンプリング点の情報も表示されるようになりました。
この機能がどういうときに役に立つかというと、例えば、放射線のイベントの計測などがあります。
放射線の計測では長い時間サンプリングをしますが、イベントが起きている時間は一瞬です。そのためすべてのサンプリングデータを保存するとデータ量が莫大になりますが、イベントが起きている間だけ保存すればデータ量を削減できます。
例えば、下の図は9/21に測定したあるデータですが10分間のデータが映っています。
↑この中の一部を拡大します。
↑まだまだ拡大します。
↑だんだん疎になってきました。
↑2つの波形の塊が見えてきました。
下の図が放射線のパルスのピークをとらえた波形です。
こんな波形が何万とあるのですが、イベントがない部分はごっそりと削減することができます。そういった非等間隔で作られているデータを正しく表示できるようになったというわけです。
| 固定リンク
コメント