next up previous contents index
Next: B..2 Fourier transform window functions Up: B. Fourier Transforms in IFEFFIT Previous: B. Fourier Transforms in IFEFFIT


B..1 Fourier transform Conventions

Many of IFEFFIT's command use Fourier transforms (FT) to perform their tasks. In addition to fftf() and fftr(), which are principly designed to do Fourier transforms, the commands chi_noise(), feffit(), and spline() all do (or can do) Fourier transforms as part of their data processing. The form of the Fourier transform done by all these commands is the same, and is really an XAFS-specific Fourier transform that converts $ \chi$(k) into $ \tilde{\chi}$(R) in the forward direction and $ \tilde{\chi}$(R) into $ \tilde{\chi}$(k) in the reverse direction. The XAFS-specific FT done by these commands will be described in detail shortly. For now, an important point to emphasize is that all these commands share many arguments and grogram variables describing the Fourier transforms. These shared command arguments and program variables are the topic of this section.

The forward XAFS Fourier transform, done with fftf(), transforms $ \chi$(k) to $ \tilde{\chi}$(R). To do this, the $ \chi$(k) data is first multiplied by a k-weighting factor of the form kw and a window function before the actual Fast Fourier transform is performed. The k-weighting factor w is used to ``even out'' the decaying $ \chi$(k) function and to emphasize different k-regions of the EXAFS in the resulting $ \tilde{\chi}$(R). Popular choics for w are 1, 2, and 3.

Formally, the XAFS Fourier transform can be written as

$\displaystyle \tilde{\chi}$(R) = $\displaystyle {{1}\over{\sqrt{2\pi}}}$$\displaystyle \int_{{-\infty}}^{{\infty}}$dkei2kRkw$\displaystyle \tilde{\chi}$(k)$\displaystyle \Omega$(k) (4)
where $ \Omega$(k) is the window function, and w is the k-weighting factor. The window function can take a variety of functional forms, all of which rise from a small value (possible zero) at low-k, rise up to one, and then fall back towards zero at high-k. The window is intended to smooth out any ringing in the resulting FT amplitude while maintaining as much resolution as possible, and will be discussed in more detail in the next section.

A discrete form of the above formula is actually used so that the Fast Fourier Transform algorithm can be exploited. The key point here is that the data is sampled on a finite and uniform grid in k (or R for the back-transform). The k-space grid used throughout IFEFFIT is $ \delta$k = 0.05 Å-1. The array sizes for $ \chi$(k) and $ \tilde{\chi}$(R) are Nfft = 2048, and the data is zero-padded out to high-k (or high-R). The zero-padding for $ \chi$(k) will smooth the data points in R-space, and the zero-padding of $ \tilde{\chi}$(R) will smooth the data in backtransformed-k-space. The grid in R-space is $ \delta$R = $ \pi$/Nfft $ \delta$k, which is then $ \sim$ 0.0307 Å.

For the discrete Fourier transforms, we write kn = n$ \delta$k and Rm = m $ \delta$R, and have

$\displaystyle \tilde{\chi}$(Rm) = $\displaystyle {{i \delta
k}\over{\sqrt{\pi N_{\rm fft}}}}$ $\displaystyle \sum_{{n=1}}^{{N_{\rm fft}}}$$\displaystyle \chi$(kn$\displaystyle \Omega$(knknwe2$\scriptstyle \pi$inm/Nfft (5)
for the forward transform and

$\displaystyle \tilde{\chi}$(kn) = $\displaystyle {{2
i \delta R}\over{\sqrt{\pi N_{\rm fft}}}}$ $\displaystyle \sum_{{m=1}}^{{N_{\rm fft}}}$$\displaystyle \tilde{\chi}$(Rm$\displaystyle \Omega$(Rme-2$\scriptstyle \pi$inm/Nfft (6)
for the back transform. These normalizations preserve the symmetry properties of the Fourier Transforms with conjugate variables k and 2R.

There are few slight complication with these formulas. The first arises from the fact that because the classic EXAFS equation has a term of the form ei2kR or sin(2kR), it customary to use k and 2R as the Fourier conjugate variables while still desiring the R space function to be a function of R. This changes the normalization factors in front of the integral to those above.

The other minor complication is that the ``measured'' $ \chi$(k) derived from $ \mu$(E) and is a strictly real function while the Fourier transform inherently treats $ \chi$(k) as complex functions, signified by the $ \tilde{{ }}$ above the $ \chi$). There is an ambiguity about how to construct the complex $ \tilde{\chi}$(k). In many formal treatments, the measured XAFS is written as the imaginary part of some function, so that constructing $ \tilde{\chi}$(k) as (0,$ \chi_{{\rm measured}}^{}$(k)) might seem a natural choice. For historical reasons, IFEFFIT uses the opposite convention, constructing $ \tilde{\chi}$(k) as ($ \chi_{{\rm measured}}^{}$(k), 0). You can easily override this default however and do transforms assuming $ \chi$(k) is the imaginary part of $ \tilde{\chi}$(k). Normally, one does a forward transform with

  Iff> fftf(real = data.chi)
which sets $ \tilde{\chi}$(k) as ($ \chi_{{\rm data}}^{}$(k), 0). You can use
  Iff> fftf(imag = data.chi)
to construct $ \tilde{\chi}$(k) as (0,$ \chi_{{\rm data}}^{}$(k)).

The Fourier transform requires that the $ \chi$(k) data begin at k = 0. More to the point, the fftf() command assumes that the supplied array for chi starts at k = 0 unless told otherwise. It is important to include the k-array with this keyword. If not given, the $ \chi$ array will be assumed to have it's first point be $ \chi$(k = 0), and then to be input on an even k-grid with spacing 0.05 Å.


next up previous contents index
Next: B..2 Fourier transform window functions Up: B. Fourier Transforms in IFEFFIT Previous: B. Fourier Transforms in IFEFFIT
Matt Newville
2004-02-09