Discrete Wavelet Transform (DWT)

Generate filter coefficients

Generate Debauchies filter coefficients of order n (n = even)

PDB[n_, y_] := Sum[Binomial[n - 1 + k, k] y^k, {k, 0, n - 1}]

DaubechiesFilter[n_, prec_:20] := Module[{poly, r, small, z, l}, poly = PDB[n/ ... ientList[poly, z]//Reverse ; l/Sqrt[l . l] // Chop]/;EvenQ[n] && n≥2

Generate Haar filter coefficients

HaarFilter[] := {1, 1}/Sqrt[2] // N ;

Generate high-pass filter coefficients from low-pass filter coefficients

HighPassFilter[filter_] := Table[(-1)^i, {i, 0, Length[filter] - 1}] * Reverse[filter] ;

Generate inverse filter coefficients from low-pass filter coefficients

InverseFilter[filter_] := Module[{n, lpf, hpf}, n = Length[filter] ; l ... n - 2] // Transpose)[[n - 1]] ] /; EvenQ[Length[filter]] && Length[filter] >0 ;

Decimation functions

Decimation for DWT (1D)

Decimate1D[data_] := First /@ Partition[data, 2] ;

Decimation for inverse DWT (1D)

InverseDecimate1D[data_] := Last /@ Partition[data, 2] ;

1D Discrete Wavelet Transform (DWT)

1D DWT at specified level

Wavelet1DLevel[data_, filter_, level_] := Module[{lpf, hpf, nd, d1, d2}, lpf = ... cimate1D} ; Join[Flatten[w1], d2] ] ] ] /; EvenQ[Length[filter]] ;

1D DWT

Wavelet1D[data_, filter_, levels_:Complete] := Module[{l2}, If[levels  ... vels] ; Fold[Wavelet1DLevel[#1, filter, #2] &, data, Table[i, {i, 1, l2}]] ] ;

Inverse 1D DWT at single level

InverseWavelet1DLevel[data_, filter_, level_] := Module[{lpf, hpf, nd, d1, d2}, ᡝ ... imate1D} ; Join[Flatten[Transpose[w1]], d2] ] ] /; EvenQ[Length[filter]] ;

Inverse 1D DWT

InverseWavelet1D[data_, filter_, levels_:Complete] := Module[{l2}, If[levels & ... 2371;Fold[InverseWavelet1DLevel[#1, filter, #2] &, data, Table[i, {i, l2, 1, -1}]] ] ;

2D Discrete Wavelet Transform (DWT)

2D DWT for one level (operates on whole input matrix)

WaveletOneLevel2D[m_, filter_] := Module[{w1, w2}, w1 = Wavelet1DLevel[#, filt ... [#, filter, 1] & /@ Transpose[w1] ; w2 // Transpose]/; EvenQ[Length[filter]] ;

2D DWT at specified level

This function assumes a square matrix with dimensions n × n, where n = 2^i, i = {2, 3, 4, ...}

Wavelet2DLevel[m_, filter_, level_] := Module[{dim, n, ll, hl, lh, hh, llw}, I ... #62371;BlockMatrix[{{llw, lh}, {hl, hh}}] ] ] ] /; EvenQ[Length[filter]] ;

2D DWT (uncompiled, slow)

Wavelet2D[data_, filter_, levels_] := Fold[Wavelet2DLevel[#1, filter, #2] &, data, Table[i, {i, 1, levels}]] ;

2D DWT (compiled, fast)

WaveletTransform2D = Compile[{{m, _Real, 2}, {filter, _Real, 1}, {level, _Integer}}, Wavelet2D[m, filter, level]] ;

Inverse 2D DWT for one level (operates on whole input matrix)

InverseWaveletOneLevel2D[m_, filter_] := Module[{w1, w2}, w1 = InverseWavelet1 ... 2 = InverseWavelet1DLevel[#, filter, 1] & /@ Transpose[w1] ]/; EvenQ[Length[filter]] ;

Inverse 2D DWT at specified level

This function assumes a square matrix with dimensions n × n, where n = 2^i, i = {2, 3, 4, ...}

InverseWavelet2DLevel[m_, filter_, level_] := Module[{dim, n, ll, hl, lh, hh, llw}, &# ... #62371;BlockMatrix[{{llw, lh}, {hl, hh}}] ] ] ] /; EvenQ[Length[filter]] ;

Inverse 2D DWT (uncompiled, slow)

InverseWavelet2D[data_, filter_, levels_] := Fold[InverseWavelet2DLevel[#1, filter, #2] &, data, Table[i, {i, levels, 1, -1}]] ;

Inverse 2D DWT (compiled, fast)

InverseWaveletTransform2D = Compile[{{m, _Real, 2}, {filter, _Real, 1}, {level, _Integer}}, InverseWavelet2D[m, filter, level]] ;

Visualization functions

Extract bands at specified level from 2D DWT

This function assumes a square matrix with dimensions n × n, where n = 2^i, i = {2, 3, 4, ...}

ExtractBands[mw_, level_] := Module[{n1, n2, ll, lh, hl, hh}, n2 = Length[mw]/ ... #62371;hh = TakeMatrix[mw, {n1 + 1, n1 + 1}, {n2, n2}] ;  {{ll, lh}, {hl, hh}} ] ;

Helper functions (visualize signed wavelet coefficients, or magnitudes only)

Magnitude[a_] := Abs[a] ; Signed[a_] := a ;

Construct visualization for one level of 2D DWT

RowBox[{RowBox[{VisualizeOneLevel[mw_, level_, g_:Null, f_:Signed, opts___], :=, , Row ... 2754;, RowBox[{-, 0.02}]}], ,,  , DisplayFunctionIdentity}], ]}]}]}], , ]}]}], ;}]

Display 2D DWT (w/specified number of levels)

The output of this function is controlled by three main things: (1) levels = number of levels in 2D DWT; (2) f = {Signed, Magnitude} - display signed wavelet coefficients or magnitudes of coefficients only; (3) the PlotRange -> Automatic option (default) gives more detail, while the PlotRange -> All option adjusts output range to not clip coefficients (less detail).

ShowWaveletTransform2D[mw_, levels_, f_:Signed, opts___] := Module[{gl, dsp, opts2}, & ... #62371;Show[#[[1]], opts2, #[[2]], ImageSize500] & /@ Transpose[{gl, dsp}] ] ;

Visualize 2D DWT levels

RowBox[{RowBox[{VisualizePyramidOneLevel[ndim_, level_, g_:Null, opts___], :=, , RowBo ... sSpacing, , 0.05}], ,,  , DisplayFunctionIdentity}], ]}]}]}], , ]}]}], ;}]

ShowPyramid2D[levels_, opts___] := Module[{gl, dsp, opts2}, gl = Drop[FoldList ... #62371;Show[#[[1]], opts2, #[[2]], ImageSize500] & /@ Transpose[{gl, dsp}] ] ;

Visualize 1D DWT bands

ConstructOneBand1D[{{r1_, r2_}, h_}, colors_] :=  {colors[[h]], Rectangle[{r1, 0}, {r2, 1}]} ;

VisualizeBands1D[level_, opts___] := Module[{ht, rt, m, cols}, cols = {Green,  ... [Graphics[ConstructOneBand1D[#, cols] & /@ m], AspectRatioAutomatic, opts] ] ;


Created by Mathematica  (February 16, 2004)