comparison src/fftw-3.3.3/rdft/rdft.h @ 95:89f5e221ed7b

Add FFTW3
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 20 Mar 2013 15:35:50 +0000
parents
children
comparison
equal deleted inserted replaced
94:d278df1123f9 95:89f5e221ed7b
1 /*
2 * Copyright (c) 2003, 2007-11 Matteo Frigo
3 * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 *
19 */
20
21 #ifndef __RDFT_H__
22 #define __RDFT_H__
23
24 #include "ifftw.h"
25 #include "codelet-rdft.h"
26
27 #ifdef __cplusplus
28 extern "C"
29 {
30 #endif /* __cplusplus */
31
32 /* problem.c: */
33 typedef struct {
34 problem super;
35 tensor *sz, *vecsz;
36 R *I, *O;
37 #if defined(STRUCT_HACK_KR)
38 rdft_kind kind[1];
39 #elif defined(STRUCT_HACK_C99)
40 rdft_kind kind[];
41 #else
42 rdft_kind *kind;
43 #endif
44 } problem_rdft;
45
46 void X(rdft_zerotens)(tensor *sz, R *I);
47 problem *X(mkproblem_rdft)(const tensor *sz, const tensor *vecsz,
48 R *I, R *O, const rdft_kind *kind);
49 problem *X(mkproblem_rdft_d)(tensor *sz, tensor *vecsz,
50 R *I, R *O, const rdft_kind *kind);
51 problem *X(mkproblem_rdft_0_d)(tensor *vecsz, R *I, R *O);
52 problem *X(mkproblem_rdft_1)(const tensor *sz, const tensor *vecsz,
53 R *I, R *O, rdft_kind kind);
54 problem *X(mkproblem_rdft_1_d)(tensor *sz, tensor *vecsz,
55 R *I, R *O, rdft_kind kind);
56
57 const char *X(rdft_kind_str)(rdft_kind kind);
58
59 /* solve.c: */
60 void X(rdft_solve)(const plan *ego_, const problem *p_);
61
62 /* plan.c: */
63 typedef void (*rdftapply) (const plan *ego, R *I, R *O);
64
65 typedef struct {
66 plan super;
67 rdftapply apply;
68 } plan_rdft;
69
70 plan *X(mkplan_rdft)(size_t size, const plan_adt *adt, rdftapply apply);
71
72 #define MKPLAN_RDFT(type, adt, apply) \
73 (type *)X(mkplan_rdft)(sizeof(type), adt, apply)
74
75 /* various solvers */
76
77 solver *X(mksolver_rdft_r2c_direct)(kr2c k, const kr2c_desc *desc);
78 solver *X(mksolver_rdft_r2c_directbuf)(kr2c k, const kr2c_desc *desc);
79 solver *X(mksolver_rdft_r2r_direct)(kr2r k, const kr2r_desc *desc);
80
81 void X(rdft_rank0_register)(planner *p);
82 void X(rdft_vrank3_transpose_register)(planner *p);
83 void X(rdft_rank_geq2_register)(planner *p);
84 void X(rdft_indirect_register)(planner *p);
85 void X(rdft_vrank_geq1_register)(planner *p);
86 void X(rdft_buffered_register)(planner *p);
87 void X(rdft_generic_register)(planner *p);
88 void X(rdft_rader_hc2hc_register)(planner *p);
89 void X(rdft_dht_register)(planner *p);
90 void X(dht_r2hc_register)(planner *p);
91 void X(dht_rader_register)(planner *p);
92 void X(dft_r2hc_register)(planner *p);
93 void X(rdft_nop_register)(planner *p);
94 void X(hc2hc_generic_register)(planner *p);
95
96 /****************************************************************************/
97 /* problem2.c: */
98 /*
99 An RDFT2 problem transforms a 1d real array r[n] with stride is/os
100 to/from an "unpacked" complex array {rio,iio}[n/2 + 1] with stride
101 os/is. R0 points to the first even element of the real array.
102 R1 points to the first odd element of the real array.
103
104 Strides on the real side of the transform express distances
105 between consecutive elements of the same array (even or odd).
106 E.g., for a contiguous input
107
108 R0 R1 R2 R3 ...
109
110 the input stride would be 2, not 1. This convention is necessary
111 for hc2c codelets to work, since they transpose even/odd with
112 real/imag.
113
114 Multidimensional transforms use complex DFTs for the
115 noncontiguous dimensions. vecsz has the usual interpretation.
116 */
117 typedef struct {
118 problem super;
119 tensor *sz;
120 tensor *vecsz;
121 R *r0, *r1;
122 R *cr, *ci;
123 rdft_kind kind; /* assert(kind < DHT) */
124 } problem_rdft2;
125
126 problem *X(mkproblem_rdft2)(const tensor *sz, const tensor *vecsz,
127 R *r0, R *r1, R *cr, R *ci, rdft_kind kind);
128 problem *X(mkproblem_rdft2_d)(tensor *sz, tensor *vecsz,
129 R *r0, R *r1, R *cr, R *ci, rdft_kind kind);
130 problem *X(mkproblem_rdft2_d_3pointers)(tensor *sz, tensor *vecsz,
131 R *r, R *cr, R *ci, rdft_kind kind);
132 int X(rdft2_inplace_strides)(const problem_rdft2 *p, int vdim);
133 INT X(rdft2_tensor_max_index)(const tensor *sz, rdft_kind k);
134 void X(rdft2_strides)(rdft_kind kind, const iodim *d, INT *rs, INT *cs);
135 INT X(rdft2_complex_n)(INT real_n, rdft_kind kind);
136
137 /* verify.c: */
138 void X(rdft2_verify)(plan *pln, const problem_rdft2 *p, int rounds);
139
140 /* solve.c: */
141 void X(rdft2_solve)(const plan *ego_, const problem *p_);
142
143 /* plan.c: */
144 typedef void (*rdft2apply) (const plan *ego, R *r0, R *r1, R *cr, R *ci);
145
146 typedef struct {
147 plan super;
148 rdft2apply apply;
149 } plan_rdft2;
150
151 plan *X(mkplan_rdft2)(size_t size, const plan_adt *adt, rdft2apply apply);
152
153 #define MKPLAN_RDFT2(type, adt, apply) \
154 (type *)X(mkplan_rdft2)(sizeof(type), adt, apply)
155
156 /* various solvers */
157
158 solver *X(mksolver_rdft2_direct)(kr2c k, const kr2c_desc *desc);
159
160 void X(rdft2_vrank_geq1_register)(planner *p);
161 void X(rdft2_buffered_register)(planner *p);
162 void X(rdft2_rdft_register)(planner *p);
163 void X(rdft2_nop_register)(planner *p);
164 void X(rdft2_rank0_register)(planner *p);
165 void X(rdft2_rank_geq2_register)(planner *p);
166
167 /****************************************************************************/
168
169 /* configurations */
170 void X(rdft_conf_standard)(planner *p);
171
172 #ifdef __cplusplus
173 } /* extern "C" */
174 #endif /* __cplusplus */
175
176 #endif /* __RDFT_H__ */