***Wavelet [#w3f0e1ec]
***Haar [#i6752c3c]
足して2で割る。または√2で割る。

***Daubechie [#t8b4d113]
DaubechieのWaveletはHaarを拡張したもので、D2の時は正規化されたHaarとまったく同じ。D4、D6、D8…と長めのフィルターがある。プログラムするときはすでに係数を計算してあるのを用意して使う。D20くらいまではWebで検索すると見つけられるようです。分解と再構築で同じ係数を使う。~
DaubechieのWaveletはHaarを拡張したもので、D2の時はHaarの基底と同じ。D4、D6、D8…と長めのフィルターがある。プログラムするときはすでに係数を計算してあるのを用意して使う。D20くらいまではWebで検索すると見つけられるようです。分解と再構築で同じ係数を使う。~
D2の時はともかく端のところで折り返さないとならないので、そのへんが微妙に不安な気がする…。

***リンク [#oc34d761]
-http://www.wavelet.org/

***D4 Wavelet Code(Tcl) [#a9f86908]
書き方がわかってきたので練習を兼ねてTclで書いてみた検証用テストプログラム。D4をレベル-1だけ分解と再構築することができます。変換するリストは4の倍数でなければなりません。
 set h0 0.4829629131445341
 set h1 0.8365163037378079
 set h2 0.2241438680420133
 set h3 -0.1294095225512603
 set g0 [expr $h3]
 set g1 [expr -$h2]
 set g2 [expr $h1]
 set g3 [expr -$h0]
 
 
 proc d4_h {a b c d} {
 	global h0 h1 h2 h3
 	return [expr $a*$h0 + $b*$h1 + $c*$h2 + $d*$h3]
 }
 
 proc d4_g {a b c d} {
 	global g0 g1 g2 g3
 	return [expr $a*$g0 + $b*$g1 + $c*$g2 + $d*$g3]
 }
 
 proc d4_ih {a b c d} {
 	global h0 g0 h2 g2
 	return [expr $a*$h2 + $b*$g2 + $c*$h0 + $d*$g0]
 }
 
 proc d4_ig {a b c d} {
 	global h1 g1 h3 g3
 	return [expr $a*$h3 + $b*$g3 + $c*$h1 + $d*$g1]
 }
 
 
 proc dwt {data} {
 	if {[expr [llength $data]%4] != 0} {return}
 	set len [llength $data]
 	
 	lappend data [lindex $data 0] [lindex $data 1]
 	
 	set s [list]
 	set d [list]
 	for {set i 0} {$i < $len} {incr i 2} {
 		set a0 [lindex $data $i]
 		set a1 [lindex $data [expr $i+1]]
 		set a2 [lindex $data [expr $i+2]]
 		set a3 [lindex $data [expr $i+3]]
 		lappend s [d4_h $a0 $a1 $a2 $a3]
 		lappend d [d4_g $a0 $a1 $a2 $a3]
 	}
 	
 	return [concat $s $d]
 }
 
 
 proc idwt {data} {
 	global hlist glist
 	if {[expr [llength $data]%4] != 0} {return}
 	set len [llength $data]
 	set o [list]
 	
 	set s [lrange $data 0 [expr $len/2-1]]
 	set d [lrange $data [expr $len/2] end]
 	set s [concat [lindex $s end] $s]
 	set d [concat [lindex $d end] $d]
 	
 	for {set i 0} {$i<[expr [llength $s]-1]} {incr i} {
 		puts i=$i
 		set a0 [lindex $s $i]
 		set a1 [lindex $d $i]
 		set a2 [lindex $s [expr $i+1]]
 		set a3 [lindex $d [expr $i+1]]
 		lappend o [d4_ih $a0 $a1 $a2 $a3]
 		lappend o [d4_ig $a0 $a1 $a2 $a3]
 	}
 	
 	return $o
 }
 
 
 set data [list 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.]
 set idata [dwt $data]
 set ndata [idwt $idata]
 
 for {set i 0} {$i < [llength $data]} {incr i} {
 	puts [format "%10.5f %10.5f %10.5f" \
 		[lindex $data $i] [lindex $idata $i] [lindex $ndata $i]]
 }
 
出力結果
   1.00000    2.31079    1.00000
   2.00000    5.13922    2.00000
   3.00000    7.96764    3.00000
   4.00000   10.79607    4.00000
   5.00000   13.62450    5.00000
   6.00000   16.45292    6.00000
   7.00000   19.28135    7.00000
   8.00000   20.59403    8.00000
   9.00000   -0.00000    9.00000
  10.00000   -0.00000   10.00000
  11.00000   -0.00000   11.00000
  12.00000   -0.00000   12.00000
  13.00000   -0.00000   13.00000
  14.00000   -0.00000   14.00000
  15.00000   -0.00000   15.00000
  16.00000   -5.65685   16.00000

***コメント [#ncaf6c97]
#comment
----
[[CategoryTclTk]]


HTML convert time: 0.009 sec.