cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: FFTW 3.3.5: The Halfcomplex-format DFT cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127:
cannam@127:

cannam@127: Next: , Previous: , Up: More DFTs of Real Data   [Contents][Index]

cannam@127:
cannam@127:
cannam@127: cannam@127:

2.5.1 The Halfcomplex-format DFT

cannam@127: cannam@127:

An r2r kind of FFTW_R2HC (r2hc) corresponds to an r2c DFT cannam@127: cannam@127: cannam@127: cannam@127: (see One-Dimensional DFTs of Real Data) but with “halfcomplex” cannam@127: format output, and may sometimes be faster and/or more convenient than cannam@127: the latter. cannam@127: cannam@127: The inverse hc2r transform is of kind FFTW_HC2R. cannam@127: cannam@127: cannam@127: This consists of the non-redundant half of the complex output for a 1d cannam@127: real-input DFT of size n, stored as a sequence of n real cannam@127: numbers (double) in the format: cannam@127:

cannam@127:

cannam@127: r0, r1, r2, ..., rn/2, i(n+1)/2-1, ..., i2, i1 cannam@127:

cannam@127:

Here, cannam@127: rkis the real part of the kth output, and cannam@127: ikis the imaginary part. (Division by 2 is rounded down.) For a cannam@127: halfcomplex array hc[n], the kth component thus has its cannam@127: real part in hc[k] and its imaginary part in hc[n-k], with cannam@127: the exception of k == 0 or n/2 (the latter cannam@127: only if n is even)—in these two cases, the imaginary part is cannam@127: zero due to symmetries of the real-input DFT, and is not stored. cannam@127: Thus, the r2hc transform of n real values is a halfcomplex array of cannam@127: length n, and vice versa for hc2r. cannam@127: cannam@127:

cannam@127: cannam@127:

Aside from the differing format, the output of cannam@127: FFTW_R2HC/FFTW_HC2R is otherwise exactly the same as for cannam@127: the corresponding 1d r2c/c2r transform cannam@127: (i.e. FFTW_FORWARD/FFTW_BACKWARD transforms, respectively). cannam@127: Recall that these transforms are unnormalized, so r2hc followed by hc2r cannam@127: will result in the original data multiplied by n. Furthermore, cannam@127: like the c2r transform, an out-of-place hc2r transform will cannam@127: destroy its input array. cannam@127:

cannam@127:

Although these halfcomplex transforms can be used with the cannam@127: multi-dimensional r2r interface, the interpretation of such a separable cannam@127: product of transforms along each dimension is problematic. For example, cannam@127: consider a two-dimensional n0 by n1, r2hc by r2hc cannam@127: transform planned by fftw_plan_r2r_2d(n0, n1, in, out, FFTW_R2HC, cannam@127: FFTW_R2HC, FFTW_MEASURE). Conceptually, FFTW first transforms the rows cannam@127: (of size n1) to produce halfcomplex rows, and then transforms the cannam@127: columns (of size n0). Half of these column transforms, however, cannam@127: are of imaginary parts, and should therefore be multiplied by i cannam@127: and combined with the r2hc transforms of the real columns to produce the cannam@127: 2d DFT amplitudes; FFTW’s r2r transform does not perform this cannam@127: combination for you. Thus, if a multi-dimensional real-input/output DFT cannam@127: is required, we recommend using the ordinary r2c/c2r cannam@127: interface (see Multi-Dimensional DFTs of Real Data). cannam@127:

cannam@127:
cannam@127:
cannam@127:

cannam@127: Next: , Previous: , Up: More DFTs of Real Data   [Contents][Index]

cannam@127:
cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: