%WAVELET 1D Wavelet transform with optional singificance testing
%
% [WAVE,PERIOD,SCALE,COI,SIGNIF,FFT_THEOR] = ...
% wavelet(Y,DT,PAD,DJ,S0,J1,LAG1,SIGLVL)
%
% Computes the wavelet transform of the vector Y (length N),
% with sampling rate DT.
%
% By default, the Morlet wavelet (k0=6) is used.
% The wavelet basis is normalized to have total energy=1 at all scales.
%
%
% INPUTS:
%
% Y = the time series of length N.
% DT = amount of time between each Y value, i.e. the sampling time.
%
% OUTPUTS:
%
% WAVE is the WAVELET transform of Y. This is a complex array
% of dimensions (N,J1+1). FLOAT(WAVE) gives the WAVELET amplitude,
% ATAN(IMAGINARY(WAVE),FLOAT(WAVE) gives the WAVELET phase.
% The WAVELET power spectrum is ABS(WAVE)^2.
% Its units are sigma^2 (the time series variance).
%
%
% OPTIONAL INPUTS:
%
% *** Note *** setting any of the following to -1 will cause the default
% value to be used.
%
% PAD = if set to 1 (default is 0), pad time series with enough zeroes to get
% N up to the next higher power of 2. This prevents wraparound
% from the end of the time series to the beginning, and also
% speeds up the FFT's used to do the wavelet transform.
% This will not eliminate all edge effects (see COI below).
%
% DJ = the spacing between discrete scales. Default is 0.25.
% A smaller # will give better scale resolution, but be slower to plot.
%
% S0 = the smallest scale of the wavelet. Default is 2*DT.
%
% J1 = the # of scales minus one. Scales range from S0 up to S0*2^(J1*DJ),
% to give a total of (J1+1) scales. Default is J1 = (LOG2(N DT/S0))/DJ.
%
% LAG1 = LAG 1 Autocorrelation, used for SIGNIF levels. Default is 0.0
%
% SIGLVL = significance level to use. Default is 0.95
%
%
% OPTIONAL OUTPUTS:
%
% PERIOD = the vector of "Fourier" periods (in time units) that corresponds
% to the SCALEs.
%
% SCALE = the vector of scale indices, given by S0*2^(j*DJ), j=0...J1
% where J1+1 is the total # of scales.
%
% COI = if specified, then return the Cone-of-Influence, which is a vector
% of N points that contains the maximum period of useful information
% at that particular time.
% Periods greater than this are subject to edge effects.
% This can be used to plot COI lines on a contour plot by doing:
% IDL> CONTOUR,wavelet,time,period
% IDL> PLOTS,time,coi,NOCLIP=0
%
% SIGNIF = output significance levels as a function of PERIOD
%
% FFT_THEOR = output theoretical red-noise spectrum as fn of PERIOD
%
%
%----------------------------------------------------------------------------
% Copyright (C) 1995-1998, Christopher Torrence and Gilbert P. Compo
% University of Colorado, Program in Atmospheric and Oceanic Sciences.
% This software may be used, copied, or redistributed as long as it is not
% sold and this copyright notice is reproduced on each copy made. This
% routine is provided as is without any express or implied warranties
% whatsoever.
%
% Notice: Please acknowledge the use of this program in any publications:
% ``Wavelet software was provided by C. Torrence and G. Compo,
% and is available at URL: http://paos.colorado.edu/research/wavelets/''.
%
%----------------------------------------------------------------------------
function [daughter,fourier_factor,coi,dofmin] = ...
wave_bases(mother,k,scale,param);
mother = upper(mother);
n = length(k);
if (strcmp(mother,'MORLET')) %----------------------------------- Morlet
if (param == -1), param = 6.;, end
k0 = param;
expnt = -(scale.*k - k0).^2/2.*(k > 0.);
norm = sqrt(scale*k(2))*(pi^(-0.25))*sqrt(n); % total energy=N [Eqn(7)]
daughter = norm*exp(expnt);
daughter = daughter.*(k > 0.); % Heaviside step function
fourier_factor = (4*pi)/(k0 + sqrt(2 + k0^2)); % Scale-->Fourier [Sec.3h]
coi = fourier_factor/sqrt(2); % Cone-of-influence [Sec.3g]
dofmin = 2; % Degrees of freedom
elseif (strcmp(mother,'PAUL')) %-------------------------------- Paul
if (param == -1), param = 4.;, end
m = param;
expnt = -(scale.*k).*(k > 0.);
norm = sqrt(scale*k(2))*(2^m/sqrt(m*prod(2:(2*m-1))))*sqrt(n);
daughter = norm*((scale.*k).^m).*exp(expnt);
daughter = daughter.*(k > 0.); % Heaviside step function
fourier_factor = 4*pi/(2*m+1);
coi = fourier_factor*sqrt(2);
dofmin = 2;
elseif (strcmp(mother,'DOG')) %-------------------------------- DOG
if (param == -1), param = 2.;, end
m = param;
expnt = -(scale.*k).^2 ./ 2.0;
norm = sqrt(scale*k(2)/gamma(m+0.5))*sqrt(n);
daughter = -norm*(i^m)*((scale.*k).^m).*exp(expnt);
fourier_factor = 2*pi*sqrt(2./(2*m+1));
coi = fourier_factor/sqrt(2);
dofmin = 1;
else
error('Mother must be one of MORLET,PAUL,DOG')
end
return