TR-mbed 1.0
Loading...
Searching...
No Matches
ei_fftw_impl.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2009 Mark Borgerding mark a borgerding net
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10namespace Eigen {
11
12namespace internal {
13
14 // FFTW uses non-const arguments
15 // so we must use ugly const_cast calls for all the args it uses
16 //
17 // This should be safe as long as
18 // 1. we use FFTW_ESTIMATE for all our planning
19 // see the FFTW docs section 4.3.2 "Planner Flags"
20 // 2. fftw_complex is compatible with std::complex
21 // This assumes std::complex<T> layout is array of size 2 with real,imag
22 template <typename T>
23 inline
24 T * fftw_cast(const T* p)
25 {
26 return const_cast<T*>( p);
27 }
28
29 inline
30 fftw_complex * fftw_cast( const std::complex<double> * p)
31 {
32 return const_cast<fftw_complex*>( reinterpret_cast<const fftw_complex*>(p) );
33 }
34
35 inline
36 fftwf_complex * fftw_cast( const std::complex<float> * p)
37 {
38 return const_cast<fftwf_complex*>( reinterpret_cast<const fftwf_complex*>(p) );
39 }
40
41 inline
42 fftwl_complex * fftw_cast( const std::complex<long double> * p)
43 {
44 return const_cast<fftwl_complex*>( reinterpret_cast<const fftwl_complex*>(p) );
45 }
46
47 template <typename T>
48 struct fftw_plan {};
49
50 template <>
52 {
53 typedef float scalar_type;
56 fftw_plan() :m_plan(NULL) {}
57 ~fftw_plan() {if (m_plan) fftwf_destroy_plan(m_plan);}
58
59 inline
64 inline
69 inline
74 inline
80
81 inline
86 inline
91
92 };
93 template <>
95 {
96 typedef double scalar_type;
98 ::fftw_plan m_plan;
99 fftw_plan() :m_plan(NULL) {}
100 ~fftw_plan() {if (m_plan) fftw_destroy_plan(m_plan);}
101
102 inline
107 inline
112 inline
117 inline
123 inline
128 inline
133 };
134 template <>
136 {
137 typedef long double scalar_type;
140 fftw_plan() :m_plan(NULL) {}
141 ~fftw_plan() {if (m_plan) fftwl_destroy_plan(m_plan);}
142
143 inline
148 inline
153 inline
158 inline
164 inline
169 inline
174 };
175
176 template <typename _Scalar>
178 {
179 typedef _Scalar Scalar;
180 typedef std::complex<Scalar> Complex;
181
182 inline
183 void clear()
184 {
185 m_plans.clear();
186 }
187
188 // complex-to-complex forward FFT
189 inline
190 void fwd( Complex * dst,const Complex *src,int nfft)
191 {
193 }
194
195 // real-to-complex forward FFT
196 inline
197 void fwd( Complex * dst,const Scalar * src,int nfft)
198 {
200 }
201
202 // 2-d complex-to-complex
203 inline
204 void fwd2(Complex * dst, const Complex * src, int n0,int n1)
205 {
206 get_plan(n0,n1,false,dst,src).fwd2(fftw_cast(dst), fftw_cast(src) ,n0,n1);
207 }
208
209 // inverse complex-to-complex
210 inline
211 void inv(Complex * dst,const Complex *src,int nfft)
212 {
214 }
215
216 // half-complex to scalar
217 inline
218 void inv( Scalar * dst,const Complex * src,int nfft)
219 {
221 }
222
223 // 2-d complex-to-complex
224 inline
225 void inv2(Complex * dst, const Complex * src, int n0,int n1)
226 {
227 get_plan(n0,n1,true,dst,src).inv2(fftw_cast(dst), fftw_cast(src) ,n0,n1);
228 }
229
230
231 protected:
233
235
236 typedef std::map<int64_t,PlanData> PlanMap;
237
239
240 inline
241 PlanData & get_plan(int nfft,bool inverse,void * dst,const void * src)
242 {
243 bool inplace = (dst==src);
244 bool aligned = ( (reinterpret_cast<size_t>(src)&15) | (reinterpret_cast<size_t>(dst)&15) ) == 0;
245 int64_t key = ( (nfft<<3 ) | (inverse<<2) | (inplace<<1) | aligned ) << 1;
246 return m_plans[key];
247 }
248
249 inline
250 PlanData & get_plan(int n0,int n1,bool inverse,void * dst,const void * src)
251 {
252 bool inplace = (dst==src);
253 bool aligned = ( (reinterpret_cast<size_t>(src)&15) | (reinterpret_cast<size_t>(dst)&15) ) == 0;
254 int64_t key = ( ( (((int64_t)n0) << 30)|(n1<<3 ) | (inverse<<2) | (inplace<<1) | aligned ) << 1 ) + 1;
255 return m_plans[key];
256 }
257 };
258
259} // end namespace internal
260
261} // end namespace Eigen
EIGEN_DEVICE_FUNC const InverseReturnType inverse() const
Definition ArrayCwiseUnaryOps.h:411
float * p
Definition Tutorial_Map_using.cpp:9
void inplace(bool square=false, bool SPD=false)
Definition inplace_decomposition.cpp:17
T * fftw_cast(const T *p)
Definition ei_fftw_impl.h:24
::int64_t int64_t
Definition Meta.h:59
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
Definition BandTriangularSolver.h:13
Definition ei_fftw_impl.h:178
void fwd(Complex *dst, const Complex *src, int nfft)
Definition ei_fftw_impl.h:190
PlanData & get_plan(int nfft, bool inverse, void *dst, const void *src)
Definition ei_fftw_impl.h:241
void inv(Scalar *dst, const Complex *src, int nfft)
Definition ei_fftw_impl.h:218
void clear()
Definition ei_fftw_impl.h:183
void fwd2(Complex *dst, const Complex *src, int n0, int n1)
Definition ei_fftw_impl.h:204
std::map< int64_t, PlanData > PlanMap
Definition ei_fftw_impl.h:236
void inv(Complex *dst, const Complex *src, int nfft)
Definition ei_fftw_impl.h:211
void inv2(Complex *dst, const Complex *src, int n0, int n1)
Definition ei_fftw_impl.h:225
void fwd(Complex *dst, const Scalar *src, int nfft)
Definition ei_fftw_impl.h:197
PlanData & get_plan(int n0, int n1, bool inverse, void *dst, const void *src)
Definition ei_fftw_impl.h:250
fftw_plan< Scalar > PlanData
Definition ei_fftw_impl.h:232
PlanMap m_plans
Definition ei_fftw_impl.h:238
std::complex< Scalar > Complex
Definition ei_fftw_impl.h:180
Eigen::numext::int64_t int64_t
Definition ei_fftw_impl.h:234
_Scalar Scalar
Definition ei_fftw_impl.h:179
fftw_plan()
Definition ei_fftw_impl.h:99
double scalar_type
Definition ei_fftw_impl.h:96
void inv(scalar_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:118
void fwd(complex_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:103
::fftw_plan m_plan
Definition ei_fftw_impl.h:98
void inv(complex_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:108
void inv2(complex_type *dst, complex_type *src, int n0, int n1)
Definition ei_fftw_impl.h:129
void fwd(complex_type *dst, scalar_type *src, int nfft)
Definition ei_fftw_impl.h:113
void fwd2(complex_type *dst, complex_type *src, int n0, int n1)
Definition ei_fftw_impl.h:124
fftw_complex complex_type
Definition ei_fftw_impl.h:97
~fftw_plan()
Definition ei_fftw_impl.h:100
float scalar_type
Definition ei_fftw_impl.h:53
void fwd(complex_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:60
void inv2(complex_type *dst, complex_type *src, int n0, int n1)
Definition ei_fftw_impl.h:87
void inv(complex_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:65
void fwd2(complex_type *dst, complex_type *src, int n0, int n1)
Definition ei_fftw_impl.h:82
void fwd(complex_type *dst, scalar_type *src, int nfft)
Definition ei_fftw_impl.h:70
fftw_plan()
Definition ei_fftw_impl.h:56
fftwf_complex complex_type
Definition ei_fftw_impl.h:54
void inv(scalar_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:75
~fftw_plan()
Definition ei_fftw_impl.h:57
fftwf_plan m_plan
Definition ei_fftw_impl.h:55
void inv2(complex_type *dst, complex_type *src, int n0, int n1)
Definition ei_fftw_impl.h:170
void fwd(complex_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:144
void fwd2(complex_type *dst, complex_type *src, int n0, int n1)
Definition ei_fftw_impl.h:165
void inv(scalar_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:159
void fwd(complex_type *dst, scalar_type *src, int nfft)
Definition ei_fftw_impl.h:154
~fftw_plan()
Definition ei_fftw_impl.h:141
void inv(complex_type *dst, complex_type *src, int nfft)
Definition ei_fftw_impl.h:149
fftwl_complex complex_type
Definition ei_fftw_impl.h:138
fftwl_plan m_plan
Definition ei_fftw_impl.h:139
fftw_plan()
Definition ei_fftw_impl.h:140
long double scalar_type
Definition ei_fftw_impl.h:137
Definition ei_fftw_impl.h:48
Definition ForwardDeclarations.h:17