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
(k)
into
(R) in the forward direction and
(R) into
(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
(k) to
(R). To do this, the
(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
(k) function and to emphasize
different k-regions of the EXAFS in the resulting
(R). Popular
choics for w are 1, 2, and 3.
Formally, the XAFS Fourier transform can be written as
|
|
(4) |
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
k = 0.05 Å-1. The array sizes for
(k) and
(R)
are
Nfft = 2048, and the data is zero-padded out to
high-k (or high-R). The zero-padding for
(k) will smooth the data
points in R-space, and the zero-padding of
(R) will smooth the data
in backtransformed-k-space. The grid in R-space is
R =
/Nfft
k, which is then
0.0307 Å.
For the discrete Fourier transforms, we write
kn = n
k and
Rm = m
R, and have
|
(5) |
|
(6) |
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''
(k) derived from
(E) and is a strictly real function while the Fourier transform
inherently treats
(k) as complex functions, signified by the
above the
). There is an ambiguity about how to construct the
complex
(k). In many formal treatments, the measured XAFS is
written as the imaginary part of some function, so that constructing
(k) as
(0,
(k)) might seem a natural
choice. For historical reasons, IFEFFIT uses the opposite convention,
constructing
(k) as
(
(k), 0). You can
easily override this default however and do transforms assuming
(k) is
the imaginary part of
(k). Normally, one does a forward
transform with
Iff> fftf(real = data.chi)which sets
Iff> fftf(imag = data.chi)to construct
The Fourier transform requires that the
(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
array will be assumed to have it's first point be
(k = 0), and
then to be input on an even k-grid with spacing
0.05 Å.