はじめに
- 前回はPywaveletでウェーブレットObjectを作るまで
- 今回は実際にDWTを実装
1次のDWT(深さ1のDWT)
とりあえずDWTとIDWTを実装してみる。
簡単のためまずHaarウェーブレットで実装。(1次のDaubechiesウェーブレットはHaarウェーブレットと同じらしい)
import pywt
a = [1,2,3,4,5,6,7,8]
(cA,cD) = pywt.dwt(a,'db1')
# cA = array([ 2.12132034, 4.94974747, 7.77817459, 10.60660172])
# cD = array([-0.70710678, -0.70710678, -0.70710678, -0.70710678])
b = pywt.idwt(cA,cD,'db1')
# b = array([1., 2., 3., 4., 5., 6., 7., 8.])
確かにできてる。
cAは近似係数(Approximation Coefficients)、cDは詳細係数(Detail Coefficients)。
近似係数は隣り合う数の平均に$\sqrt2$をかけたもの。
詳細係数は隣り合う数の差分を$\sqrt2$で割ったもの。
なぜ$\sqrt2$をかけたり割ったりしてるかは不明。。。
多重解像度分析
深さを増やしていく。pywt.wavedecを使ってウェーブレット変換する。
何次のDWTまでできるか(深さはどれくらいか)はpywt.dwt_max_levelによって計算。
Coeffs = pywt.wavedec(a,'db1')
# Coeff = [array([12.72792206]),
# array([-5.65685425]),
# array([-2., -2.]),
# array([-0.70710678, -0.70710678, -0.70710678, -0.70710678])]
depth = pywt.dwt_max_level(len(a),len(pywt.Wavelet('db1')))
# depth = 3
深さ3でDWTができた。
DWTの最大次数は下の式で導出できるらしい。
$$ maxlevel = \left[ log_2{\frac{datalength}{filterlength-1}}\right]$$
今回はdatalengthが8、filterlengthが2なので最大次数は3。
ちなみに[]がガウス記号。
終わりに
- 離散ウェーブレット変換を実装した