Chapter Fourty-eight

第48話



前回までに作ってきた分解と再構成のサブVIを少し修正したら、Haar以外のウェーブレットでもうまく動作している。色々な条件で解析を試してみるには、ある程度使い勝手を考えた使って気持ちのいいツールにしていたほうが良いと思い、冬休みに入ってからウェーブレット解析のVIを完成させた。

まず、入力波形、分解した成分ごとの波形、再構成した波形などのグラフを見やすいように配置すると画面がグラフだらけになってしまうので、グラフに表示させるデータを選択できるようにする。
次に、分解した成分をそのまま再構成するのでは意味のあるVIとは言えないので、各成分ごとに係数をかけてから再構成できるようにしたい。もちろん係数の変更と再構成を自由に実行できれば係数を試行錯誤で決定できるのでなお良い。
処理条件がルーチンワーク的に決まったらサブVIとして一括処理ができるようにもしておきたい。

一つ一つの要求は特殊なものではなく、普段使うVIにもあったら使いやすくなる機能だ。データを収集して解析をして結果を出す、という流れからは枝葉とも言える部分であるが、手になじむツールにしておけば気持ちがいいだけではなく、操作よりも本質的な部分に注意を払うことができたり、迅速に結果を得たりすることができる。
反面、使い勝手を考えながらダイアグラムを作ると、たいていの場合は複雑な分かりにくいダイアグラムになってしまう。人間の思考、判断はストレートには進まず、行きつ戻りつするものだからだろうか。
このあたりのプログラミング方法はLabVIEWの方言と言えないこともないので、くどくならない範囲で説明していこう。

1)グラフの選択表示
今回は波形グラフを使ったのだが、マルチプロットとシングルプロットを選択的に表示させるときはシングルプロットをマルチプロットのデータ型にする必要がある。マルチプロットの型は"クラスターのアレイ"なのでシングルプロットをビルドアレイに接続すると同じ型になる。簡単な例としてSinとSincデータのマルチプロットと三角波のシングルプロットを選択して表示できるようにしてみよう。

2)インタラクティブな係数選択
係数を選んで処理結果を見ながら最終的な係数を決定していく場合にはホワイルループを使う。ケース0で係数を選択して、ケース1でそれらの積を計算するという例でVIを作ってみよう。

但し、このままでは、詳しく見ようとして拡大してもループが回るたびにグラフが書き直されてしまう。それを避けるにはホワイルループの内側にもう一つケース構造を作って選択の値が変更されたときだけ処理が実行されるようにすればよい。選択の値が変更されていないときはなにも動作する必要がないので500msecぐらいのwait をかけておけば、他のVIも支障なく動作させられる。

3)サブVIとしての一括処理
サブVIとして自動で動作する場合には、ケース構造をシーケンス構造と同じように順番に動作するようにすればよい。もっと美しく配線できるとは思うが、とりあえず希望の動作が期待できる。サブVIとして使うときは"自動"のスイッチをTrueにし、表示を見ながら係数を決めるときはFalseにすればよい。

前置きはこのくらいにしてWavelet.viを紹介させてもらおう。

Haar以外のウェーブレットもDigital Filterから選択できる。入力波形は常時上のグラフに表示され、下のグラフは解像度分解された状態が一覧できる。display Selectで各波形を単独で選択して表示したり、再構成した結果を表示することができる。左側のFiddlerを操作することで各成分を任意に減衰させることができる。

ダイアグラムは分解レベルに応じてFiddlerの要素数を設定したり、単独でグラフ表示するLevel入力も必要なレベルだけを表示するようにしてあり、先ほど説明した例よりさらに分かりにくくなっている。ウェーブレット解析の本質ではないところで複雑になっているので適当にハショッテ見て欲しい。

大部分は操作性のための配線だが、一つだけ本質に近いところで変更を加えている。前回までは分解により各解像度で得られた結果を2次元配列で受け取っていた。ウェーブレット変換は変換前後で総データ数が変わらないのだが、分解が進むにつれてデータ数が少なくなるにもかかわらず2次元配列で出力すると無駄に膨大なメモリを使ってしまうことになる。そのため、プログラムの手間は増えるがデータを1次元配列にまとめてデータの開始位置とサイズをキーとしてデータにアクセスすることにした。この場合、部分的な要素の置換を多用することになるのでサブVIとしてReplaceElements.viを作った。

解像度を下げるたびにデータ数が半分になっていく規則なのでプログラムがシンプルにできていたが、最後に残った残差成分のデータ数は最後の解像度データのデータ数と同じなので、特別な処理が必要になった。これもワイアリングがごちゃごちゃする原因になったが、大きなデータの中の部分的な周波数変化を捕らえられるというのがウェーブレット解析の売り文句のような気もするので、メモリを有効に使う工夫は重要だ。

まだまだ、細部までに神経が行き届いていないが、徐々に改良を進めるということで今回は出来上がりとしよう。
次回は、実際にどんなことができるのか試してみよう。

See you!


Nigel Yamaguchi

戻る