LoginSignup
2
5

More than 5 years have passed since last update.

PyWaveletを使ったDWTへの入り口(2)

Posted at

はじめに

  • 前回は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。
ちなみに[]がガウス記号。

終わりに

  • 離散ウェーブレット変換を実装した
2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5