1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
|
@cindex DWT, see wavelet transforms
@cindex wavelet transforms
@cindex transforms, wavelet
This chapter describes functions for performing Discrete Wavelet
Transforms (DWTs). The library includes wavelets for real data in both
one and two dimensions. The wavelet functions are declared in the header
files @file{gsl_wavelet.h} and @file{gsl_wavelet2d.h}.
@menu
* DWT Definitions::
* DWT Initialization::
* DWT Transform Functions::
* DWT Examples::
* DWT References::
@end menu
@node DWT Definitions
@section Definitions
@cindex DWT, mathematical definition
The continuous wavelet transform and its inverse are defined by
the relations,
@iftex
@tex
\beforedisplay
$$
w(s, \tau) = \int_{-\infty}^\infty f(t) * \psi^*_{s,\tau}(t) dt
$$
\afterdisplay
@end tex
@end iftex
@ifinfo
@example
w(s,\tau) = \int f(t) * \psi^*_@{s,\tau@}(t) dt
@end example
@end ifinfo
@noindent
and,
@tex
\beforedisplay
$$
f(t) = \int_0^\infty ds \int_{-\infty}^\infty w(s, \tau) * \psi_{s,\tau}(t) d\tau
$$
\afterdisplay
@end tex
@ifinfo
@example
f(t) = \int \int_@{-\infty@}^\infty w(s, \tau) * \psi_@{s,\tau@}(t) d\tau ds
@end example
@end ifinfo
@noindent
where the basis functions @c{$\psi_{s,\tau}$}
@math{\psi_@{s,\tau@}} are obtained by scaling
and translation from a single function, referred to as the @dfn{mother
wavelet}.
The discrete version of the wavelet transform acts on equally-spaced
samples, with fixed scaling and translation steps (@math{s},
@math{\tau}). The frequency and time axes are sampled @dfn{dyadically}
on scales of @math{2^j} through a level parameter @math{j}.
@c The wavelet @math{\psi}
@c can be expressed in terms of a scaling function @math{\varphi},
@c
@c @tex
@c \beforedisplay
@c $$
@c \psi(2^{j-1},t) = \sum_{k=0}^{2^j-1} g_j(k) * \bar{\varphi}(2^j t-k)
@c $$
@c \afterdisplay
@c @end tex
@c @ifinfo
@c @example
@c \psi(2^@{j-1@},t) = \sum_@{k=0@}^@{2^j-1@} g_j(k) * \bar@{\varphi@}(2^j t-k)
@c @end example
@c @end ifinfo
@c @noindent
@c and
@c
@c @tex
@c \beforedisplay
@c $$
@c \varphi(2^{j-1},t) = \sum_{k=0}^{2^j-1} h_j(k) * \bar{\varphi}(2^j t-k)
@c $$
@c \afterdisplay
@c @end tex
@c @ifinfo
@c @example
@c \varphi(2^@{j-1@},t) = \sum_@{k=0@}^@{2^j-1@} h_j(k) * \bar@{\varphi@}(2^j t-k)
@c @end example
@c @end ifinfo
@c @noindent
@c The functions @math{\psi} and @math{\varphi} are related through the
@c coefficients
@c @c{$g_{n} = (-1)^n h_{L-1-n}$}
@c @math{g_@{n@} = (-1)^n h_@{L-1-n@}}
@c for @c{$n=0 \dots L-1$}
@c @math{n=0 ... L-1},
@c where @math{L} is the total number of coefficients. The two sets of
@c coefficients @math{h_j} and @math{g_i} define the scaling function and
@c the wavelet.
The resulting family of functions @c{$\{\psi_{j,n}\}$}
@math{@{\psi_@{j,n@}@}}
constitutes an orthonormal
basis for square-integrable signals.
The discrete wavelet transform is an @math{O(N)} algorithm, and is also
referred to as the @dfn{fast wavelet transform}.
@node DWT Initialization
@section Initialization
@cindex DWT initialization
@tindex gsl_wavelet_type
The @code{gsl_wavelet} structure contains the filter coefficients
defining the wavelet and any associated offset parameters.
@deftypefun {gsl_wavelet *} gsl_wavelet_alloc (const gsl_wavelet_type * @var{T}, size_t @var{k})
@tindex gsl_wavelet
This function allocates and initializes a wavelet object of type
@var{T}. The parameter @var{k} selects the specific member of the
wavelet family. A null pointer is returned if insufficient memory is
available or if a unsupported member is selected.
@end deftypefun
The following wavelet types are implemented:
@deffn {Wavelet} gsl_wavelet_daubechies
@deffnx {Wavelet} gsl_wavelet_daubechies_centered
@cindex Daubechies wavelets
@cindex maximal phase, Daubechies wavelets
This is the Daubechies wavelet family of maximum phase with @math{k/2}
vanishing moments. The implemented wavelets are
@c{$k=4, 6, \dots, 20$}
@math{k=4, 6, @dots{}, 20}, with @var{k} even.
@end deffn
@deffn {Wavelet} gsl_wavelet_haar
@deffnx {Wavelet} gsl_wavelet_haar_centered
@cindex Haar wavelets
This is the Haar wavelet. The only valid choice of @math{k} for the
Haar wavelet is @math{k=2}.
@end deffn
@deffn {Wavelet} gsl_wavelet_bspline
@deffnx {Wavelet} gsl_wavelet_bspline_centered
@cindex biorthogonal wavelets
@cindex B-spline wavelets
This is the biorthogonal B-spline wavelet family of order @math{(i,j)}.
The implemented values of @math{k = 100*i + j} are 103, 105, 202, 204,
206, 208, 301, 303, 305 307, 309.
@end deffn
@noindent
The centered forms of the wavelets align the coefficients of the various
sub-bands on edges. Thus the resulting visualization of the
coefficients of the wavelet transform in the phase plane is easier to
understand.
@deftypefun {const char *} gsl_wavelet_name (const gsl_wavelet * @var{w})
This function returns a pointer to the name of the wavelet family for
@var{w}.
@end deftypefun
@c @deftypefun {void} gsl_wavelet_print (const gsl_wavelet * @var{w})
@c This function prints the filter coefficients (@code{**h1}, @code{**g1}, @code{**h2}, @code{**g2}) of the wavelet object @var{w}.
@c @end deftypefun
@deftypefun {void} gsl_wavelet_free (gsl_wavelet * @var{w})
This function frees the wavelet object @var{w}.
@end deftypefun
The @code{gsl_wavelet_workspace} structure contains scratch space of the
same size as the input data and is used to hold intermediate results
during the transform.
@deftypefun {gsl_wavelet_workspace *} gsl_wavelet_workspace_alloc (size_t @var{n})
@tindex gsl_wavelet_workspace
This function allocates a workspace for the discrete wavelet transform.
To perform a one-dimensional transform on @var{n} elements, a workspace
of size @var{n} must be provided. For two-dimensional transforms of
@var{n}-by-@var{n} matrices it is sufficient to allocate a workspace of
size @var{n}, since the transform operates on individual rows and
columns. A null pointer is returned if insufficient memory is available.
@end deftypefun
@deftypefun {void} gsl_wavelet_workspace_free (gsl_wavelet_workspace * @var{work})
This function frees the allocated workspace @var{work}.
@end deftypefun
@node DWT Transform Functions
@section Transform Functions
This sections describes the actual functions performing the discrete
wavelet transform. Note that the transforms use periodic boundary
conditions. If the signal is not periodic in the sample length then
spurious coefficients will appear at the beginning and end of each level
of the transform.
@menu
* DWT in one dimension::
* DWT in two dimension::
@end menu
@node DWT in one dimension
@subsection Wavelet transforms in one dimension
@cindex DWT, one dimensional
@deftypefun int gsl_wavelet_transform (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{stride}, size_t @var{n}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
@deftypefunx int gsl_wavelet_transform_forward (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{stride}, size_t @var{n}, gsl_wavelet_workspace * @var{work})
@deftypefunx int gsl_wavelet_transform_inverse (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{stride}, size_t @var{n}, gsl_wavelet_workspace * @var{work})
These functions compute in-place forward and inverse discrete wavelet
transforms of length @var{n} with stride @var{stride} on the array
@var{data}. The length of the transform @var{n} is restricted to powers
of two. For the @code{transform} version of the function the argument
@var{dir} can be either @code{forward} (@math{+1}) or @code{backward}
(@math{-1}). A workspace @var{work} of length @var{n} must be provided.
For the forward transform, the elements of the original array are
replaced by the discrete wavelet
transform @c{$f_i \rightarrow w_{j,k}$}
@math{f_i -> w_@{j,k@}}
in a packed triangular storage layout,
where @var{j} is the index of the level
@c{$j = 0 \dots J-1$}
@math{j = 0 ... J-1}
and
@var{k} is the index of the coefficient within each level,
@c{$k = 0 \dots 2^j - 1$}
@math{k = 0 ... (2^j)-1}.
The total number of levels is @math{J = \log_2(n)}. The output data
has the following form,
@tex
\beforedisplay
$$
(s_{-1,0}, d_{0,0}, d_{1,0}, d_{1,1}, d_{2,0},\cdots, d_{j,k},\cdots, d_{J-1,2^{J-1} - 1})
$$
\afterdisplay
@end tex
@ifinfo
@example
(s_@{-1,0@}, d_@{0,0@}, d_@{1,0@}, d_@{1,1@}, d_@{2,0@}, ...,
d_@{j,k@}, ..., d_@{J-1,2^@{J-1@}-1@})
@end example
@end ifinfo
@noindent
where the first element is the smoothing coefficient @c{$s_{-1,0}$}
@math{s_@{-1,0@}}, followed by the detail coefficients @c{$d_{j,k}$}
@math{d_@{j,k@}} for each level
@math{j}. The backward transform inverts these coefficients to obtain
the original data.
These functions return a status of @code{GSL_SUCCESS} upon successful
completion. @code{GSL_EINVAL} is returned if @var{n} is not an integer
power of 2 or if insufficient workspace is provided.
@end deftypefun
@node DWT in two dimension
@subsection Wavelet transforms in two dimension
@cindex DWT, two dimensional
The library provides functions to perform two-dimensional discrete
wavelet transforms on square matrices. The matrix dimensions must be an
integer power of two. There are two possible orderings of the rows and
columns in the two-dimensional wavelet transform, referred to as the
``standard'' and ``non-standard'' forms.
The ``standard'' transform performs a complete discrete wavelet
transform on the rows of the matrix, followed by a separate complete
discrete wavelet transform on the columns of the resulting
row-transformed matrix. This procedure uses the same ordering as a
two-dimensional Fourier transform.
The ``non-standard'' transform is performed in interleaved passes on the
rows and columns of the matrix for each level of the transform. The
first level of the transform is applied to the matrix rows, and then to
the matrix columns. This procedure is then repeated across the rows and
columns of the data for the subsequent levels of the transform, until
the full discrete wavelet transform is complete. The non-standard form
of the discrete wavelet transform is typically used in image analysis.
The functions described in this section are declared in the header file
@file{gsl_wavelet2d.h}.
@deftypefun {int} gsl_wavelet2d_transform (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_transform_forward (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_transform_inverse (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
These functions compute two-dimensional in-place forward and inverse
discrete wavelet transforms in standard form on the
array @var{data} stored in row-major form with dimensions @var{size1}
and @var{size2} and physical row length @var{tda}. The dimensions must
be equal (square matrix) and are restricted to powers of two. For the
@code{transform} version of the function the argument @var{dir} can be
either @code{forward} (@math{+1}) or @code{backward} (@math{-1}). A
workspace @var{work} of the appropriate size must be provided. On exit,
the appropriate elements of the array @var{data} are replaced by their
two-dimensional wavelet transform.
The functions return a status of @code{GSL_SUCCESS} upon successful
completion. @code{GSL_EINVAL} is returned if @var{size1} and
@var{size2} are not equal and integer powers of 2, or if insufficient
workspace is provided.
@end deftypefun
@deftypefun {int} gsl_wavelet2d_transform_matrix (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_transform_matrix_forward (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_transform_matrix_inverse (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
These functions compute the two-dimensional in-place wavelet transform
on a matrix @var{a}.
@end deftypefun
@deftypefun {int} gsl_wavelet2d_nstransform (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_nstransform_forward (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_nstransform_inverse (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
These functions compute the two-dimensional wavelet transform in
non-standard form.
@end deftypefun
@deftypefun {int} gsl_wavelet2d_nstransform_matrix (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_nstransform_matrix_forward (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
@deftypefunx {int} gsl_wavelet2d_nstransform_matrix_inverse (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
These functions compute the non-standard form of the two-dimensional
in-place wavelet transform on a matrix @var{a}.
@end deftypefun
@node DWT Examples
@section Examples
The following program demonstrates the use of the one-dimensional
wavelet transform functions. It computes an approximation to an input
signal (of length 256) using the 20 largest components of the wavelet
transform, while setting the others to zero.
@example
@verbatiminclude examples/dwt.c
@end example
@noindent
The output can be used with the @sc{gnu} plotutils @code{graph} program,
@example
$ ./a.out ecg.dat > dwt.txt
$ graph -T ps -x 0 256 32 -h 0.3 -a dwt.txt > dwt.ps
@end example
@iftex
The graphs below show an original and compressed version of a sample ECG
recording from the MIT-BIH Arrhythmia Database, part of the PhysioNet
archive of public-domain of medical datasets.
@sp 1
@center @image{dwt-orig,3.4in}
@center @image{dwt-samp,3.4in}
@quotation
Original (upper) and wavelet-compressed (lower) ECG signals, using the
20 largest components of the Daubechies(4) discrete wavelet transform.
@end quotation
@end iftex
@node DWT References
@section References and Further Reading
The mathematical background to wavelet transforms is covered in the
original lectures by Daubechies,
@itemize @w{}
@item
Ingrid Daubechies.
Ten Lectures on Wavelets.
@cite{CBMS-NSF Regional Conference Series in Applied Mathematics} (1992),
SIAM, ISBN 0898712742.
@end itemize
@noindent
An easy to read introduction to the subject with an emphasis on the
application of the wavelet transform in various branches of science is,
@itemize @w{}
@item
Paul S. Addison. @cite{The Illustrated Wavelet Transform Handbook}.
Institute of Physics Publishing (2002), ISBN 0750306920.
@end itemize
@noindent
For extensive coverage of signal analysis by wavelets, wavelet packets
and local cosine bases see,
@itemize @w{}
@item
S. G. Mallat. @cite{A wavelet tour of signal processing} (Second
edition). Academic Press (1999), ISBN 012466606X.
@end itemize
@noindent
The concept of multiresolution analysis underlying the wavelet transform
is described in,
@itemize @w{}
@item
S. G. Mallat.
Multiresolution Approximations and Wavelet Orthonormal Bases of L@math{^2}(R).
@cite{Transactions of the American Mathematical Society}, 315(1), 1989, 69--87.
@end itemize
@itemize @w{}
@item
S. G. Mallat.
A Theory for Multiresolution Signal Decomposition---The Wavelet Representation.
@cite{IEEE Transactions on Pattern Analysis and Machine Intelligence}, 11, 1989,
674--693.
@end itemize
@noindent
The coefficients for the individual wavelet families implemented by the
library can be found in the following papers,
@itemize @w{}
@item
I. Daubechies.
Orthonormal Bases of Compactly Supported Wavelets.
@cite{Communications on Pure and Applied Mathematics}, 41 (1988) 909--996.
@end itemize
@itemize @w{}
@item
A. Cohen, I. Daubechies, and J.-C. Feauveau.
Biorthogonal Bases of Compactly Supported Wavelets.
@cite{Communications on Pure and Applied Mathematics}, 45 (1992)
485--560.
@end itemize
@noindent
The PhysioNet archive of physiological datasets can be found online at
@uref{http://www.physionet.org/} and is described in the following
paper,
@itemize @w{}
@item
Goldberger et al.
PhysioBank, PhysioToolkit, and PhysioNet: Components
of a New Research Resource for Complex Physiologic
Signals.
@cite{Circulation} 101(23):e215-e220 2000.
@end itemize
|