$$\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 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 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 spacing kstep, 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

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,

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:
The Cauchy Wavelet transform projected to $$k$$ and $$R$$ space. In the left hand panel, the original EXAFS $$k^2\chi(k)$$ is shown for comparison.