annotate src/fftw-3.3.3/rdft/rdft.h @ 83:ae30d91d2ffe

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