cannam@167: cannam@167: cannam@167: cannam@167: cannam@167:
cannam@167:cannam@167: Next: Real even/odd DFTs (cosine/sine transforms), Previous: More DFTs of Real Data, Up: More DFTs of Real Data [Contents][Index]
cannam@167:An r2r kind of FFTW_R2HC
(r2hc) corresponds to an r2c DFT
cannam@167:
cannam@167:
cannam@167:
cannam@167: (see One-Dimensional DFTs of Real Data) but with “halfcomplex”
cannam@167: format output, and may sometimes be faster and/or more convenient than
cannam@167: the latter.
cannam@167:
cannam@167: The inverse hc2r transform is of kind FFTW_HC2R
.
cannam@167:
cannam@167:
cannam@167: This consists of the non-redundant half of the complex output for a 1d
cannam@167: real-input DFT of size n
, stored as a sequence of n
real
cannam@167: numbers (double
) in the format:
cannam@167:
cannam@167: r0, r1, r2, ..., rn/2, i(n+1)/2-1, ..., i2, i1 cannam@167:
cannam@167: cannam@167:Here,
cannam@167: rk
cannam@167: is the real part of the kth output, and
cannam@167: ik
cannam@167: is the imaginary part. (Division by 2 is rounded down.) For a
cannam@167: halfcomplex array hc[n]
, the kth component thus has its
cannam@167: real part in hc[k]
and its imaginary part in hc[n-k]
, with
cannam@167: the exception of k
==
0
or n/2
(the latter
cannam@167: only if n
is even)—in these two cases, the imaginary part is
cannam@167: zero due to symmetries of the real-input DFT, and is not stored.
cannam@167: Thus, the r2hc transform of n
real values is a halfcomplex array of
cannam@167: length n
, and vice versa for hc2r.
cannam@167:
cannam@167:
Aside from the differing format, the output of
cannam@167: FFTW_R2HC
/FFTW_HC2R
is otherwise exactly the same as for
cannam@167: the corresponding 1d r2c/c2r transform
cannam@167: (i.e. FFTW_FORWARD
/FFTW_BACKWARD
transforms, respectively).
cannam@167: Recall that these transforms are unnormalized, so r2hc followed by hc2r
cannam@167: will result in the original data multiplied by n
. Furthermore,
cannam@167: like the c2r transform, an out-of-place hc2r transform will
cannam@167: destroy its input array.
cannam@167:
Although these halfcomplex transforms can be used with the
cannam@167: multi-dimensional r2r interface, the interpretation of such a separable
cannam@167: product of transforms along each dimension is problematic. For example,
cannam@167: consider a two-dimensional n0
by n1
, r2hc by r2hc
cannam@167: transform planned by fftw_plan_r2r_2d(n0, n1, in, out, FFTW_R2HC,
cannam@167: FFTW_R2HC, FFTW_MEASURE)
. Conceptually, FFTW first transforms the rows
cannam@167: (of size n1
) to produce halfcomplex rows, and then transforms the
cannam@167: columns (of size n0
). Half of these column transforms, however,
cannam@167: are of imaginary parts, and should therefore be multiplied by i
cannam@167: and combined with the r2hc transforms of the real columns to produce the
cannam@167: 2d DFT amplitudes; FFTW’s r2r transform does not perform this
cannam@167: combination for you. Thus, if a multi-dimensional real-input/output DFT
cannam@167: is required, we recommend using the ordinary r2c/c2r
cannam@167: interface (see Multi-Dimensional DFTs of Real Data).
cannam@167:
cannam@167: Next: Real even/odd DFTs (cosine/sine transforms), Previous: More DFTs of Real Data, Up: More DFTs of Real Data [Contents][Index]
cannam@167: