今回のテーマの再構成は逆の手順で、どんどん合成していく。もちろん、合成する前にノイズに相当する成分の除去や、興味のある周波数成分の抽出などの信号処理を行うことができる。
a0, a1, a2, a3というデータをHaarウエーブレットで分解したとき、低周波成分b0,
b1、高周波成分c0, c1は次のようになる。
b0 = (a0+a1)/2, b1 = (a2+a3)/2
c0 = (a0-a1)/2, c1 = (a2-a3)/2
上の式を逆に解くと元のデータに戻すことができる。これは簡単で、
b0+c0, b0-c0, b1+c1, b1-c1 を計算をするとa0, a1, a2, a3 になる。
再構成の部分をフィルター処理の手順で書くと、
1)アップサンプリング
b0, b1およびc0, c1の間に0を挿入する。その結果
b0, b1 →b0, 0, b1, 0
c0, c1 →c0, 0, c1, 0
2)フィルター処理
b0, 0, b1, 0 にフィルター[1, 1]でのコンボリューションをかけると
b0, b0, b1, b1, 0 となる。
c0, 0, c1, 0 にフィルター[1, -1]でのコンボリューションをかけると
c0, -c0, c1, -c1, 0 となる。
3)和
(b0, b0, b1, b1, 0) + (c0, -c0, c1, -c1, 0) = (b0+c0, b0-c0, b1+c1,
b1-c1, 0)
最後の0はコンボリューションにより派生したものだから無視すると狙い通りの結果が得られたことになる。
これをLabVIEWで書くと
コンボリューションのために要素が追加になっているが、分解されたものが完全に再構成されている。
実際のサブVIでは以下のように必要な個数だけ切り出して数を合わせている。
分解して再構成するだけの無意味なVIだが、再構成する時のデータの渡し方に注意して欲しい。
分解のサブVIの上の出力端子は低解像度データで、ループの中で次の入力となる。高解像度データは、ループの出口で積み重ねられて2次元配列の形になる。再構成は、残差に相当する低解像度データをシフトレジスタの入力に接続し、高解像度の2次元配列データを下から1次元配列として取り出す。
再構成する前に、高解像度データを必要に応じて変更できるように改造すれば、ある程度実用的なものになっていくだろう。
次回は、Haar以外のウェーブレットについて動作を確認してみようと思う。