Chapter Fourty-five

第45話



さて、いよいよ離散ウェーブレット変換にはいろう。窮すれば通ず、とはよく言ったもので、良い本を見つけることができた。コロナ社から発行されている「ディジタル画像処理入門」(酒井 幸市 著)が最終章にウェーブレット変換を取り上げていて、24ページでコンパクトに説明している。

今回は入門編の定番になっているハールウェーブレットのVIを作ってみよう。

ハール関数は以下のようにシンプルな関数だ。

ψ(x) = 1 ; 0 ≦x <0.5
ψ(x) = -1 ; 0.5 ≦x <1
ψ(x) = 0 ; x <0 および1 ≦x

滑らかではないのが欠点だが、おかげ様で計算は簡単だ。連続ウェーブレット解析の場合と同様に、この基本関数をスケールとシフトすることにより解析を進めていくのだが、離散という名前の通り、スケールは2倍あるいは1/2ずつ、シフトはスケールの幅でおこなう。倍々でスケールした例は下のグラフのようなものだ。下から幅2,4,8,16,32というふうにスケールを変えている。

下のグラフは幅8のスケールで、シフトした例だ。

それぞれの関数を特定できるように記号を決めよう。

例えば幅2のハール関数は
ψ-1,0(x) = 1 ; 0 ≦x <1
ψ-1,0(x) = -1 ; 1 ≦x <2
ψ-1,0(x) = 0 ; x <0 および2≦ x
となる。始めに出てきたψ(x)で表すと、ψ-1,0(x) = ψ(2^(-1)*x)と書ける。

これをスケール幅だけ右にシフトした関数は
ψ-1,1(x) = 1 ; 2 ≦x <3
ψ-1,1(x) = -1 ; 3≦ x <4
ψ-1,1(x) = 0 ; x <2 および4≦ x
となる。これもψ(x)で表すと、ψ-1,1(x) = ψ(2^(-1)*x-1)と書ける。

同様に幅4のハール関数は
ψ-2,0(x) = 1 ; 0 ≦x <2
ψ-2,0(x) = -1 ; 2 ≦x <4
ψ-2,0(x) = 0 ; x <0 および4≦ x
となる。これもψ(x)で表すと、ψ-2,0(x) = ψ(2^(-2)*x)と書ける。

一般的には、ψj,k(x)と書こう。
任意の信号はこれらのハール関数ψj,k(x)と信号の平均値C0で書き換えることができる。

Signal[0,n] = C0 + Sigma j,k {Cj,k*ψj,k(x)}

Cj,k = Sigma i {Signal[i] * ψj,k(i)}/2
とは、言ってみても実感が伴わないので、いくつかの例を試してみよう。

左の配列が信号のデータで、上のグラフにデータを表示させる。下のグラフにはハール関数の係数を表示させている。この例では、j=-2でひとつシフトさせたハール関数の係数が10になっている。
これの例は、入力したデータがSignal[0,15] =10*ψ-2,1(x)なので一目瞭然だ。

次の例では少しだけデータを変更した。データはSignal[0,15] =-5*ψ-1,0(x) + 10*ψ-2,1(x)なので、j=-1のプロットが0と1でー5になっている。グラフの見方は伝わっただろうか?

さて、次の例は入力データの単純さに比べて複雑な結果になっている。一番目の例から信号の位相が一つずれたことにより、多くの関数を動員して表現している。

分解の結果を数式にまとめると次のようになる。

Signal[0,15] =-5*ψ-1,1(x) +10*ψ-1,2(x) -5*ψ-1,3(x) -2.5*ψ-2,0(x) +2.5*ψ-2,1(x) +2.5*ψ-3,0(x)

計算の過程を下のグラフに表示してみよう。黒いプロットは入力された信号だ。

青いプロットはj=-1の計算後の残差を示している。例えば、信号をψ-1,1(x)で処理するとSignal[2]=0、Signal[3]=10なので、C-1,1 = {0*1 + 10*(-1) }/2 = -5 となり、信号からの差分は、差分1[2]=5、差分1[3]=5となる。

このようにして得られた青いプロットをj=-2で処理すると、残差は赤いプロットになる。これをさらにj=-3で処理すると残差がゼロとなる。全平均がゼロではない場合には、平均値C0が残る。

ダイアグラムは、データ数から何段階まで分解するかを決めて、分解のループを回す。Haar分解と書かれたアイコンで、係数と残差の計算を行い、残差は次のループで入力になる。

Haar分解と書かれたアイコンのVIは次のようなものだ。

分解のレベル(n)が入力されると、スケールの幅が計算される。

スケールの半分の幅でそれぞれ平均値を計算し、それらの差の1/2が係数になる。信号との対応が見やすいようにスケール幅で配列を作る。ループでは2次元配列になるので、ReshapeArrayで1次元配列に直す。

信号から係数の値を引いて差分データを作る。

*****************************************************************

今回は連続ウェーブレットからの類推が容易な方法でVIを作成してみた。次回は、デジタルフィルターの考え方でVIを作ってみよう。

See you!


Nigel Yamaguchi

戻る