離散ウェーブレット変換
出典: フリー百科事典『ウィキペディア(Wikipedia)』
離散ウェーブレット変換(りさん-へんかん、Discrete wavelet transform, DWT)は、数値解析や関数解析において、離散的にサンプリングされたウェーブレットを用いたウェーブレット変換である。
目次 |
[編集] 概要
もっとも最初のDWTは、ハンガリーの数学者Alfréd Haarによって示された。 これは、2nの長さを持つ数列が入力されると、隣接した値の差分と和を求めるものである。この処理は再帰的に行われ、和の数列は次の処理の入力となる。最終的には、2n − 1の差分値と一つの和の値を得る。
この単純なDWTは、ウェーブレットの一般的な特性を示している。離散ウェーブレット変換の計算量はO(n)である。また、この変換は、時間及び周波数の両方の特性をつかむことができる。これら2つの特徴は、FFTと比較した場合のDWTの大きな特徴である。
もっとも一般的な離散ウェーブレット変換は、ベルギーの数学者Ingrid Daubechies(ドベシーもしくはドブシー)によって1988に証明された。この証明では、解像度が以前のスケールの2倍となっていく漸化式によって、もっとも密にサンプリングされたマザーウェーブレットを生成している。彼女の講義資料には、Daubechies waveletと呼ばれるウェーブレットファミリーが提供されており、その中の最初のウェーブレットはHaarウェーブレットである。このあと、これをベースとした多くのウェーブレットが開発された。
離散ウェーブレット変換の別の表現としては、Stationaryウェーブレット変換 (ダウンサンプリングが無い離散ウェーブレット変換)がある。また、関連した変換としては、ウェーブレットパケットや複素数離散ウェーブレット変換がある。
離散ウェーブレット変換は、科学・工学・数学・計算機科学の分野で数多くの応用が存在する。 顕著な例としては、信号符号化やデータ圧縮などに用いられる。特に画像圧縮に対してはモスキートノイズが理論上ほとんど発生しないため、JPEG 2000のアルゴリズムにも採用されている。
[編集] 定義
[編集] 1レベルの変換
信号xのDWTは、一組のフィルターを通すことによって計算される。
信号は、インパルス応答がgであるローパスフィルタと、同じくhであるハイパスフィルタを利用して分解される。得られた出力は、ハイパスフィルタから得たものを詳細係数(detail coefficients)、ローパスフィルタから得たものを近似係数(approximation coefficients)とよぶ。これら2つのフィルタは互いに密接な関係があり、quadrature mirror filterとして知られたものである。
次に、半分にダウンサンプリングを行う。
この分解によって、時間解像度は元の信号の半分になり、周波数解像度は2倍となる。これは、ハイゼンベルグの不確定性原理を満たしている。
ダウンサンプリングのオペレータとしてを使う。
以上の式をまとめると以下のようになる。
しかしながら、x * gの計算の後にダウンサンプリングがあるため、計算に無駄がある。
Lifting schemeは、この点を改善している。
[編集] カスケード計算およびフィルタバンク
この分解は、近似係数を再び分解することによって繰り返される。 これは、異なる時間周波数の局在性を持った部分空間を枝とする二分木によって表すことが出来る。 これはフィルタバンクとして知られているものである。
各々のレベルにおいて、低周波と高周波に分解される。 2nの長さの入力信号は、nのレベルに分解される。
16サンプルの信号を例にとる。周波数レンジは0からfnであり、3レベルまで分解するとすると
Level | Frequencies | Samples |
---|---|---|
3 | 0 to fn / 8 | 4 |
fn / 8 to fn / 4 | 4 | |
2 | fn / 4 to fn / 2 | 8 |
1 | fn / 2 to fn | 16 |
[編集] プログラム例
もっとも単純な例である。 Haar waveletをJavaによって記述した。
public static int[] invoke(int[] input){ //WARNING: This will destroy the contents of the input array //This function assumes input.length=2^n, n>1 int[] output = new int[input.length]; for(int length = input.length >> 1; ; length >>= 1){ //length=2^n, WITH DECREASING n for(int i = 0; i < length; i++) { int sum = input[i*2]+input[i*2+1]; int difference = input[i*2]-input[i*2+1]; output[i] = sum; output[length+i] = difference; } if (length == 1) return output; //Swap arrays to do next iteration System.arraycopy(output, 0, input, 0, length<<1); } }
C言語による、CDF 9/7 wavelet transform (JPEG-2000で利用)のリフティングを用いた高速な実装は、ここに見られる。
[編集] References
Stéphane Mallat, A Wavelet Tour of Signal Processing