MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / fft_r2c

Function fft_r2c

src/backend/cpu/fft.cpp:112–152  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

110
111template<typename Tc, typename Tr>
112Array<Tc> fft_r2c(const Array<Tr> &in, const int rank) {
113 dim4 odims = in.dims();
114 odims[0] = odims[0] / 2 + 1;
115 Array<Tc> out = createEmptyArray<Tc>(odims);
116
117 auto func = [=](Param<Tc> out, const af::dim4 oDataDims, CParam<Tr> in,
118 const af::dim4 iDataDims) {
119 af::dim4 idims = in.dims();
120
121 auto t_dims = computeDims(rank, idims);
122 auto in_embed = computeDims(rank, iDataDims);
123 auto out_embed = computeDims(rank, oDataDims);
124
125 const af::dim4 istrides = in.strides();
126 const af::dim4 ostrides = out.strides();
127
128 using ctype_t = typename fftw_real_transform<Tc, Tr>::ctype_t;
129 using plan_t = typename fftw_real_transform<Tc, Tr>::plan_t;
130 plan_t plan;
131
132 fftw_real_transform<Tc, Tr> transform;
133
134 int batch = 1;
135 for (int i = rank; i < 4; i++) { batch *= idims[i]; }
136
137 plan = transform.create(
138 rank, t_dims.data(), batch, const_cast<Tr *>(in.get()),
139 in_embed.data(), static_cast<int>(istrides[0]),
140 static_cast<int>(istrides[rank]),
141 reinterpret_cast<ctype_t *>(out.get()), out_embed.data(),
142 static_cast<int>(ostrides[0]), static_cast<int>(ostrides[rank]),
143 FFTW_ESTIMATE);
144
145 transform.execute(plan);
146 transform.destroy(plan);
147 };
148
149 getQueue().enqueue(func, out, out.getDataDims(), in, in.getDataDims());
150
151 return out;
152}
153
154template<typename Tr, typename Tc>
155Array<Tr> fft_c2r(const Array<Tc> &in, const dim4 &odims, const int rank) {

Callers

nothing calls this directly

Calls 8

computeDimsFunction · 0.70
getQueueFunction · 0.50
dimsMethod · 0.45
stridesMethod · 0.45
createMethod · 0.45
getMethod · 0.45
enqueueMethod · 0.45
getDataDimsMethod · 0.45

Tested by

no test coverage detected