TITLE(wd @@ Discrete wavelet transform (decomposition). )
This function performs the decomposition stage of Mallat's pyramid algorithm
(Mallat 1989),
i.e. the discrete wavelet transform. The actual transform is performed
by some C code, this is dynamically linked into S (if your machine can
do this, if it can't then tough!).
USAGE(
wd(data, filter.number=2, family="DaubExPhase", bc="periodic",
    verbose=F)
)
ARGUMENTS(
ARG(data@@)
A vector containing the data you wish to decompose. The length of this
vector must be a power of 2.
ARG(filter.number@@)
This selects the wavelet that you want to use in the decomposition.
By default this is 2, the Daubechies orthonormal compactly supported
wavelet N=2 (Daubechies (1988)), extremal phase family.
ARG(family@@)
specifies the family of wavelets that you want to use. The options are
"DaubExPhase" and "DaubLeAsymm". The "DaubExPhase" wavelets were provided
with previous versions of wavethresh.
ARG(bc@@)
specifies the boundary handling. If bc=="periodic" the default, then the
function you decompose is assumed to be periodic on it's interval of definition,
if bc=="symmetric" then the function beyond its boundaries is assumed to
be a symmetric reflection of the function in the boundary. The symmetric
option was the implicit default in releases previous to 2.2. 
ARG(verbose@@)
Controls the printing of "informative" messages whilst the computations
progress. Such messages are generally annoying so it is turned off by default.
)
PARA BOLD(VALUE)
An object of class LANG(wd). See "wd.object" for details.
Basically, this object is a list with the following components
ARG(C@@)
Vector of sets of successively smoothed data. The pyramid structure of Mallat
is stacked so that it fits into a vector. The function LANG(accessC)
should be used to extract a set for a particular level.
ARG(D@@)
Vector of sets of wavelet coefficients at different resolution levels.
Again, Mallat's pyramid structure is stacked into a vector.
The function LANG(accessD) should be used to extract the coefficients
for a particular resolution level.
ARG(nlevels@@)
The number of resolution levels. This depends on the length of the data
vector. If length(data)=2^m, then there will be m resolution levels.
This means there will be m levels of wavelet coefficients (indexed
0,1,2,...,(m-1)), and m+1 levels of smoothed data (indexed 0,1,2,...,m).
ARG(fl.dbase@@)
There is more information stored in the C and D than is described above.
In the decomposition LANG(`extra)' coefficients are generated that help take
care of the boundary effects, this database lists where these start and
finish, so the "true" data can be extracted.
ARG(filter@@)
A list containing information about the filter
ARG(bc@@)
How the boundaries were handled.
PARA BOLD(SIDE EFFECTS)
The appropriate C object code is loaded if it isn't. 
The code implements Mallat's pyramid algorithm (Mallat 1989).
Essentially it works like this: you start off with some data cm,
which is a real vector of length 2^m, say.
Then from this you obtain two vectors of length 2^(m-1). One of these
is a set of smoothed data, c(m-1), say. This looks like a smoothed version
of cm. The other is a vector, d(m-1), say.
This corresponds to the detail removed
in smoothing cm to c(m-1). More precisely, they are the coefficients of the
wavelet expansion corresponding to the highest resolution wavelets in the
expansion. Similarly, c(m-2) and d(m-2) are obtained from c(m-1), etc. until
you reach c0 and d0.
All levels of smoothed data are stacked into a single vector for memory
efficiency and ease of transport across the SPlus-C interface.
The smoothing is performed directly by convolution with the wavelet filter
(filter.select(n)\$H, essentially low-pass filtering), and then dyadic
decimation (selecting every other datum, see Vaidyanathan (1990)).
The detail extraction is performed by the mirror filter of H, which
we call G and is a bandpass filter.
G and H are also known quadrature mirror filters.
There are now two methods of handling "boundary problems". If you know
that your function is periodic (on it's interval) then use the
bc="periodic" option, if you think that the function is symmetric
reflection about each boundary then use bc="symmetric".
If you don't know then it is wise to experiment with both methods,
in any case, if you don't have very much data don't infer too much about
your decomposition! If you have loads of data then don't infer too much
about the boundaries. It can be easier to interpret the wavelet coefficients
from a bc="periodic" decomposition, so that is now the default. 
Numerical Recipes implements some of the wavelets code, in particular
we have compared our code to "wt1" and "daub4" on page 595. We are
pleased to announce that our code gives the same answers!
The only difference that you might notice is that one of the coefficients,
at the beginning or end of the decomposition,
always appears in the "wrong" place. This is not so, when you assume
periodic boundaries you can imagine the function defined on a circle
and you can basically place the coefficient at the beginning or the
end (because there is no beginning or end, as it were).
 
PARA BOLD(RELEASE)
Release 2.2
Copyright Guy Nason 1993
PARA BOLD(REFERENCES)
Any book on wavelets, especially
Chui, C. K. (1992)
An Introduction to Wavelets.
Academic Press, London.
Daubechies, I. (1988)
Orthonormal bases of compactly supported wavelets
Communications on Pure and Applied Mathematics, Vol. 41, 909-996
Mallat, S. G. (1989)
A theory for multiresolution signal decomposition: the wavelet representation
IEEE Transactions on Pattern Analysis and Machine Intelligence.
Vol. 11, Number 7 674-693.
Vaidyanathan, P. P. (1990)
Multirate digital filters, filter banks, polyphase networks and applications:
a tutorial.
Proceedings of the IEEE, Vol. 78, Number 1, 56-93
PARA BOLD(SEE ALSO)
LANG(wr), LANG(accessC), LANG(accessD), LANG(filter.select), LANG(plot), LANG(dyn.load)
LANG(threshold)
BLANK

PARA BOLD( )
BLANK

EXAMPLES(
#
# Decompose test.data and plot the wavelet coefficients
#
> wds <- wd(test.data)
> plot(wds)
)
PARA ITALIC(File automatically converted from S(-PLUS) help format)
