ウェーブレット変換(ウェーブレットへんかん、英: wavelet transformation)は、周波数解析の手法の一つ。基底関数として、ウェーブレット関数を用いる。フーリエ変換によって周波数特性を求める際に失われる時間領域の情報を、この変換においては残すことが可能である。フーリエ変換でも窓関数を用いる窓フーリエ変換で時間領域の情報は残せたが、窓幅を周波数に合わせて固定する必要があるため、広い周波数領域の解析には向かなかった。ウェーブレット変換では、基底関数の拡大縮小を行うので、広い周波数領域の解析が可能である。しかし、不確定性原理によって精度には限界がある。フーリエ変換では、N をデータのサイズとしたときに N logN のオーダーで計算量が増える(O(N logN))が、ウェーブレット変換では O(N) の計算量でできる利点がある。
VP6、JPEG 2000、信号解析、量子力学、フラクタル等の多くの分野に応用されている。
基本的には、小さい波(ウェーブレット)を拡大縮小、平行移動して足し合わせることで、与えられた入力の波形を表現しようとする手法。ある信号が与えられた時に、時間的に局在した周波数成分を知りたい場合でも、フーリエ解析においては、サイン波、コサイン波を拡大縮小して足し合わせることで入力を表現しようとしていたが、波が局在化していないため、時系列の情報が失われていた。
フーリエ変換の式に窓を掛け、とするのがフーリエ変換における局在化の一般的な手法である。この場合、周波数によって窓の幅が変わることがない。そのため、例えばの様な波を解析しようとした場合、広い窓を取るとサイン波の周波数ははっきりとするが、パルスの波の情報はぼやける。逆に窓を狭くすればパルスの波ははっきりとするが、サイン波の周波数が見えにくくなるといったことがおこる。
ウェーブレット変換では、周波数に合わせてウェーブレットの幅が変化するので、周波数解像度が格段に良くなる。
ウェーブレット変換は連続量を扱う連続ウェーブレット変換が基本だが、計算機上では連続量を扱うのが難しい。このため信号を無理やり連続ウェーブレット変換の式に従って計算すると、かなりの情報が失われ、逆変換ができなくなる。そこで、逆変換を考慮した形のウェーブレット変換を離散ウェーブレット変換という。
連続ウェーブレット変換は逆変換を持たないものの、離散ウェーブレット変換よりも緻密な解析ができるという特徴がある。離散ウェーブレット変換は一度変換した情報を加工して逆変換することで、ノイズの除去などに応用することができる。
ウェーブレットは以下の許容条件を満たす。即ち、をのフーリエ変換として、
もしならば、そのフーリエ変換は連続であり、上の許容条件はつまりの時にのみ満たされる。
この許容条件を満たすウェーブレットに対しウェーブレット変換が以下の様に定義される。
ここで、はscale、はtranslationを表す。を、マザーウェーブレットと言う。
元の関数は、以下の式で得られる。
例えばウェーブレットにはメキシカンハット関数(英語版)や、
変形ガウシアンなどがある。
連続ウェーブレット変換は、FFT(高速フーリエ変換)を用いて計算できる。数値計算で連続ウェーブレット変換を求める場合、スケールパラメータ を変化させながら、マザーウェーブレット と信号 のフーリエ変換を計算し、畳み込みを計算した後、逆フーリエ変換によって時間領域に戻す事で連続ウェーブレット変換を求める事が出来る。
離散ウェーブレット変換は、元信号を高周波成分と低周波成分に分解し、分解された低周波成分をまた高周波成分と低周波成分に分解するという処理を繰り返し行うことと等価である。そのため多重解像度解析とも呼ばれる。離散ウェーブレット変換は可逆変換であるため、変換そのものに圧縮効果は無いが、変換画像の効率的な符号化方式が開発されたため画像圧縮方式であるJPEG 2000に利用されるようになった。
連続ウェーブレット変換で用いたウェーブレットに対し、
として離散化を行う。但しとする。の値はウェーブレットに対して適切に選ぶ事になる。この場合連続ウェーブレット変換と異なり、単位の分解公式を用いる事が出来ないため、別の方法で元の関数を復元する必要がある。
離散ウェーブレット変換例(ハールウェーブレット)
をマザーウェーブレットとして用いるならアルゴリズムは
for freq in 適当な範囲:
for pos in データの範囲:
sum = 0
for t in データの範囲:
sum += data[t] * phi((t-pos)/freq)
result[pos][freq] = sum / sqrt(freq)
となるが、tについてのイテレーションに関してphiが明らかに0になる範囲を省くことができるので実際には
for freq in 適当な範囲:
for pos in データの範囲:
sum = 0
for t in range(pos-freq, pos+freq):
if t < pos:
sum += data[t]
else:
sum -= data[t]
result[pos][freq] = sum / sqrt(freq)
となる。これがフーリエ解析より計算量が少なくて済むことの大きな原因である。(アルゴリズムの解説のための擬似コードであり添え字の範囲チェックなどがないことに注意)
多重解像度解析とは、2倍毎の解像度のウェーブレットを用いて解析する手法。
- Riesz基底を成すを、とそのフーリエ変換が適度に速く減衰しと成るように取る。
- 直交化をする。即ち、新たな関数を作る。
- に対し、を満たすを用いて、とする。