離散ウェーブレット変換をわかりやすく
解説事項
- 離散ウェーブレット変換(多重解像度解析に同じ[1])
- (余談)ウェーブレットパケット分解
そもそものウェーブレット変換や連続ver.の解説は前回参照
離散ウェーブレット変換を一言で
- 信号を周波数帯域ごとの成分に段階的に分割していく
- 分割は冗長性がなく,逆変換が可能である
離散ウェーブレット変換(DWT)
DWTは,連続WTを冗長性なく離散化したものと捉えるとよく,以下のフィルタリングと等価になる.DWTでは信号にフィルタをかけて高周波成分(detail coefficient)と低周波成分(approximation coefficient)の2つの時系列を得る.さらに低周波成分を2分し,これを続けていく.周波数領域で言えば左下図(出典)のように,2分割を繰り返すことに相当する.時系列データのフローとしては右下図がわかりやすいかもしれない.分割の深さをレベルと呼び,例えばレベル3なら4つの時系列が出力される.なおこのフィルタはマザーウェーブレットから算出される.以上の操作は「多重解像度解析」とも呼ばれる.
DWTの式
フィルタリングによる高周波成分と低周波成分への分解は,ウェーブレット関数
この
となる.スケーリング関数は常に一項存在し,ウェーブレット成分でない「残り」と捉えても良い.ウェーブレット関数
である.
では,この式の意味を理解しよう.スケール
と表せることを考えると(前回参照),式(2)と照らし合わせて
という関係がわかる.つまり,分解のレベル
レベル1では,図中で黄色の高周波なウェーブレット関数の成分を求め,残り下半分がスケーリング関数の成分に対応する.レベル2ではスケールが倍,すなわち周波数が半分のウェーブレットの成分(図中で緑)を求めるが,シフトが倍になることで時間解像度が半分になっている.このような分割を2進分割と呼ぶ.分割が深まるごとに低周波側の周波数解像度を上げながら,時間解像度が下がる様がわかるだろう.
Pythonでの実装と確認
DWTをPythonで実装する.さらに,得られた帯域ごとの成分列の長さを確認する
import numpy as np
import pywt
# 1次元のデータを作成(長さ256)
data = np.random.randn(256)
# 離散ウェーブレット変換
wavelet = 'db1' # マザーウェーブレットを指定(ここはなんでも良い)
coeffs = pywt.wavedec(data, wavelet, level=3)
# 各成分の長さをprint
print(f"level 3 approx. coef. : len = {len(coeffs[0])}")
print(f"level 3 detail coef. : len = {len(coeffs[1])}")
print(f"level 2 detail coef. : len = {len(coeffs[2])}")
print(f"level 1 detail coef. : len = {len(coeffs[3])}")
出力は以下となった
level 3 approx. coef. : len = 32
level 3 detail coef. : len = 32
level 2 detail coef. : len = 64
level 1 detail coef. : len = 128
レベルが深いほど係数が短いのは,時間解像度が低くなっていることを意味する.さらには,32+32+64+128=256(元の信号長)であることから,離散ウェーブレット変換が冗長性なく信号を分解していることが窺える.このことを特にHaarウェーブレットで説明しているこちらの記事も参照されたい.
(余談)ウェーブレットパケット分解(WPD)
離散WTは低周波成分を段階的に分解していった一方で,WPDは高周波数成分も同様に分解していく.すなわち周波数方向の分割は2進分割ではなく等間隔になり,周波数領域全体を等しく分解できる.処理の流れは下図(出典)の通り,ただしLPFはローパスフィルタ,HPFはハイパスフィルタ.
ただし時間解像度は一律になるため,ウェーブレット変換の旨みである可変解像度はなくなってしまう.
参考
- ウェーブレット変換の基礎と応用事例
- ウェーブレット変換の総まとめ
- Wavelets-based Feature Extraction
- 多重解像度解析(Wiki)
- 数理科学 ウェーブレットビギナーズガイド(東京電機大学出版局)
-
本来離散WTは「離散化したウェーブレット変換」だが,巷ではその特別な場合である多重解像度解析を指すことが多い ↩︎
Discussion