多重解像度解析
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/02/16 06:10 UTC 版)
ナビゲーションに移動 検索に移動 多重解像度解析(たじゅうかいぞうどかいせき、英: multiresolution analysis, MRA)とは、2倍毎の解像度のウェーブレットを用いて離散ウェーブレット変換により解析する手法。スケーリング関数で基底展開された信号列を、半分の解像度のスケーリング関数とウェーブレット関数による基底展開の和に分解する。1989年に Stephane G. Mallat が発表した[1]。
本来は異なる物だが、Mathematica[2] や MATLAB[3] をはじめとして、多くのソフトウェアでは多重解像度解析の事を離散ウェーブレット変換と呼んでいる。離散ウェーブレット変換の本来の定義は、離散ウェーブレット変換の項目を参照。
概要
関数 フィルタ解析のブロックダイアグラム
ダウンサンプリングのオペレータとして 3段階のフィルタバンク
各々のレベルにおいて、低周波と高周波に分解される。 多重解像度解析の周波数領域
リフティングスキーム
1996年に Wim Sweldens が新しい離散ウェーブレット変換の計算方法であるリフティングスキーム(英語版)(英: lifting scheme)を発表した[4]。信号を偶数番目の要素と奇数番目の要素に分け、偶数番目の要素で奇数番目の要素を予測し、予測とのズレを高周波成分とし、残差を低周波成分とする手法である。論文の中で、自由に双直交ウェーブレット関数を定義できること、計算が高速化する事を長所に挙げている。ハールウェーブレットと双直交ウェーブレットを扱える。
定義
閉部分空間の系列 が次の条件1〜5を満たすとき、 は多重解像度解析を成すという。は の閉包を表す。
- ならば
- が存在して が においてRiesz基底を成す。すなわち、任意の に対して数列 がただ一つ存在して、 と表される。さらに定数 が存在して、任意の に対して不等式 が成立する。
最後の条件はより厳しい条件として、
- 5'. が存在して、 が の正規直交基底となる。
が用いられる事も多い。ここではこの条件5'を用いる。
条件1は空間が入れ子になっていることを意味する。条件2は を空間 への直交射影作用素とすると、全ての に対して であることを意味する。条件3は条件1の全ての空間がスケール変換で得られる事を意味する。条件4は平行移動に対して空間が普遍であることを意味する。
閉部分空間の集まりが条件1〜5'を満たすときには、いつでも正規直交ウェーブレット による の基底 が存在し、 が成立する。
プログラム例
Python(ハールウェーブレット)
ハールウェーブレットの離散ウェーブレット変換は下記のリフティングスキーム(英語版)の数式にて行える[5]。入力を x として、 は入力 x の先頭を1番目として偶数番目の要素、つまり、x[1::2]
、 は奇数番目の要素、つまり、x[0::2]
。c が低周波成分(基底関数がスケーリング関数)、d が高周波成分(基底関数がウェーブレット関数)。
ハールウェーブレットの離散ウェーブレット変換のソースコードは下記のようになる。入力は x で NumPy の配列で与える。多重解像度解析をしたい場合は、x = c
して長さが1になるまで繰り返す。 の形の基底関数の係数にしたい場合は、c *= sqrt(2)
と d /= sqrt(2)
をする。
d = x[0::2] - x[1::2]
c = x[1::2] + d / 2
ハールウェーブレットの逆離散ウェーブレット変換のソースコード。
x[1::2] = c - d / 2
x[0::2] = d + x[1::2]
Python(Bior2.2双直交ウェーブレット)
Bior2.2双直交ウェーブレット(2階Bスプライン、線形スプライン)の離散ウェーブレット変換は下記のリフティングスキームの数式にて行える[5]。 は一つ次の要素、 は一つ前の要素を表す。
Bior2.2の離散ウェーブレット変換のソースコード。配列の境界で足りない分は対称パディングで埋めている。
y = np.pad(x, (4, 2), "symmetric")
d = y[2::2] - (y[1:-2:2] + y[3::2]) / 2
c = y[3:-2:2] + (d[:-1] + d[1:]) / 4
d = d[1:]
Bior2.2の逆離散ウェーブレット変換のソースコード。
x[1::2] = c[1:] - (d[:-1] + d[1:]) / 4
x[0] = 2 * d[0] + x[1]
x[2::2] = d[1:-1] + (x[1:-2:2] + x[3::2]) / 2
Java
もっとも単純な例である。ハールウェーブレットによる多重解像度解析をJavaで記述した。
/**
* 注意:このメソッドは input 配列を破壊する。
* input.length は2以上の2のべき乗でないといけない。
*/
public static int[] calc(int[] input) {
int[] output = new int[input.length];
// length は 2^n で n は1つずつ減っていく
for (int length = input.length >> 1; ; length >>= 1) {
for (int i = 0; i < length; i++) {
int a = input[i * 2];
int b = input[i * 2 + 1];
output[i] = a + b;
output[i + length] = a - b;
}
if (length == 1)
return output;
// 次の反復のために配列を入れ替える
System.arraycopy(output, 0, input, 0, length << 1);
}
}
下記コードは上記を逆ウェーブレット変換する。
/**
* 注意:このメソッドは output 配列を破壊する。
* output.length は2以上の2のべき乗でないといけない。
*/
public static int[] inverse(int[] output) {
int[] input = new int[output.length];
for (int length = 1; ; length *= 2) {
for (int i = 0; i < length; i++) {
int a = output[i];
int b = output[i + length];
input[i * 2] = (a + b) / 2;
input[i * 2 + 1] = (a - b) / 2;
}
if (length == output.length >> 1)
return input;
// 次の反復のために配列を入れ替える
System.arraycopy(input, 0, output, 0, length << 1);
}
}
C言語
C言語による、CDF 9/7 ウェーブレット変換(JPEG-2000で利用)のリフティングを用いた高速な実装は、dwt97.c を参照。
関連項目
参照