\(\newcommand{\AA}{\unicode{x212B}}\)
13.6. XAFS: Wavelet Transforms for XAFS¶
Wavelet transforms extend Fourier transforms, effectively separating
contributions of a waveform into both time and frequency (or, for EXAFS,
\(k\) and \(R\)). A variety of mathematical kernels can be used
for wavelet transforms. There are a few examples in the literature of
applying wavelet transforms to EXAFS data, with the Cauchy wavelet used by
Munoz et al [Munoz, Argoul, and Farges (2003)] being one early application. The
cauchy_wavelet()
function described below follows this work, and
that article should be cited as the reference for this transform.
13.6.1. cauchy_wavelet()
¶
The Continuous Cauchy Wavelet transform of Munoz et al [Munoz, Argoul, and Farges (2003)]
is implemented as the function cauchy_wavelet()
:
- cauchy_wavelet(k, chi, group=None, kweight=0, rmax_out=10)¶
perform a Continuous Cauchy wavelet transform of \(\chi(k)\).
- Parameters:
k – 1-d array of photo-electron wavenumber in \(\rm\AA^{-1}\)
chi – 1-d array of \(\chi\)
group – output Group
rmax_out – highest R for output data (10 \(\rm\AA\))
kweight – exponent for weighting spectra by \(k^{\rm kweight}\)
nfft – value to use for \(N_{\rm fft}\) (2048).
- Returns:
None
– outputs are written to supplied group.
If a
group
argument is provided of if the first argument is a Group, the following data arrays are put into it:array name
meaning
r
uniform array of \(R\), out to
rmax_out
.wcauchy
complex array cauchy transform of \(R\) and \(k\)
wcaychy_mag
magnitude of cauchy transform
wcauchy_re
real part of cauchy transform
wcauchy_im
imaginary part of cauchy transform
It is expected that the input
k
be a uniformly spaced array of values with spacingkstep
, starting a 0.
13.6.2. Wavelet Example¶
Applying the Cauchy wavelet transform to Fe K-edge data of FeO is fairly straightforward:
# wavelet transform in larch
# follows method of Munuz, Argoul, and Farges
f = read_ascii('../xafsdata/feo_xafs.dat')
autobk(f, rbkg=0.9, kweight=2)
kopts = {'xlabel': r'$k \,(\AA^{-1})$',
'ylabel': r'$k^2\chi(k) \, (\AA^{-2})$',
'linewidth': 3, 'title': 'FeO', 'show_legend':True}
xftf(f, kmin=1, kmax=14, kweight=2, dk=4.5, window='Kaiser')
newplot(f.k, f.chi*f.k**2, win=1, label='original data', **kopts)
# do wavelet transform (no window function yet)
cauchy_wavelet(f, kweight=2)
# display wavelet magnitude, real part
# horizontal axis is k, vertical is R
imopts = {'x': f.k, 'y': f.wcauchy_r}
imshow(f.wcauchy_mag, win=1, label='Wavelet Transform: Magnitude', **imopts)
imshow(f.wcauchy_re, win=2, label='Wavelet Transform: Real Part', **imopts)
# plot wavelet projected to k space
plot(f.k, f.wcauchy_re.sum(axis=0), win=1, label='projected wavelet', **kopts)
ropts = kopts
ropts['xlabel'] = r'$R \, (\AA) $'
ropts['ylabel'] = r'$|\chi(R)| \, (\AA^{-3})$'
# plot wavelet projected to R space
newplot(f.r, f.chir_mag, win=2,
label='traditional XAFS FT', **ropts)
plot(f.wcauchy_r, f.wcauchy_mag.sum(axis=1)/6.0, win=2, label='projected wavelet/6 (?)', **ropts)
With results for the Cauchy transforms looking like (here, \(k\)is along the horizontal axis extending to 16 \(\rm\AA^{-1}\), and with \(R\) along the vertical axis, increasing from 0 at the bottom to 10 \(\rm\AA\) at the top.
The projection of the wavelets to \(k\) and \(R\) space looks like: