- Timestamp:
- Oct 23, 2007, 12:20:08 PM (18 years ago)
- Location:
- trunk/SophyaExt/IFFTW
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/IFFTW/fftw3server.cc
r3000 r3359 14 14 //! Constructor - If preserve_input==true, input arrays will not be overwritten. 15 15 FFTWServer::FFTWServer(bool preserve_input) 16 : FFTServerInterface("FFTServer using FFTW3 package") 17 , ckR8("FFTWServer - ", true, false), 18 _preserve_input(preserve_input) 16 #ifdef ALSO_FFTW_FLOAT_EXTSOP 17 : FFTServerInterface("FFTServer using FFTW3 package (r_4 and r_8)") , 18 #else 19 : FFTServerInterface("FFTServer using FFTW3 package (r_8 only)") , 20 #endif 21 ckR8("FFTWServer - ", true, false), 22 ckR4("FFTWServer - ", true, false), 23 _preserve_input(preserve_input) 19 24 { 20 25 } … … 219 224 } 220 225 226 227 #ifdef ALSO_FFTW_FLOAT_EXTSOP 228 /* --------------------------------------------------------------------------- 229 We define here single precision (float) version of FFTWServr methods 230 Needs the libfftw3f.a , in addition to libfftw3.a 231 --------------------------------------------------------------------------- */ 232 /* --Methode-- */ 233 void 234 FFTWServer::FFTForward(TArray< complex<r_4> > & in, TArray< complex<r_4> > & out) 235 { 236 int rank = ckR4.CheckResize(in, out); 237 if (rank == 1) { // One dimensional transform 238 fftwf_plan p = fftwf_plan_dft_1d(in.Size(), (fftwf_complex *)in.Data(), 239 (fftwf_complex *)out.Data(), 240 FFTW_FORWARD, FFTW_ESTIMATE); 241 if (p == NULL) 242 throw ParmError("FFTWServer::FFTForward( complex<r_4>, complex<r_4> ) Error creating fftwf_plan"); 243 fftwf_execute(p); 244 fftwf_destroy_plan(p); 245 } 246 else { // Multi dimensional 247 if (in.NbDimensions() > MAXND_FFTW) 248 throw ParmError("FFTWServer::FFTForward( complex<r_4>, complex<r_4> ) rank > MAXND_FFTW !"); 249 int sz[MAXND_FFTW]; 250 FillSizes4FFTW(in, sz); 251 fftwf_plan p = fftwf_plan_dft(rank, sz, 252 (fftwf_complex *)in.Data(), (fftwf_complex *)out.Data(), 253 FFTW_FORWARD, FFTW_ESTIMATE); 254 if (p == NULL) 255 throw ParmError("FFTWServer::FFTForward( complex<r_4>, complex<r_4> ) Error creating fftwf_plan"); 256 fftwf_execute(p); 257 fftwf_destroy_plan(p); 258 } 259 if(this->getNormalize()) out=out/complex<r_4>((double)in.Size(),0.); 260 return; 261 } 262 263 /* --Methode-- */ 264 void FFTWServer::FFTBackward(TArray< complex<r_4> > & in, TArray< complex<r_4> > & out) 265 { 266 int rank = ckR4.CheckResize(in, out); 267 if (rank == 1) { // One dimensional transform 268 fftwf_plan p = fftwf_plan_dft_1d(in.Size(), (fftwf_complex *)in.Data(), 269 (fftwf_complex *)out.Data(), 270 FFTW_BACKWARD, FFTW_ESTIMATE); 271 if (p == NULL) 272 throw ParmError("FFTWServer::FFTBackward( complex<r_4>, complex<r_4> ) Error creating fftwf_plan"); 273 fftwf_execute(p); 274 fftwf_destroy_plan(p); 275 } 276 else { // Multi dimensional 277 if (in.NbDimensions() > MAXND_FFTW) 278 throw ParmError("FFTWServer::FFTBackward( complex<r_4>, complex<r_4> ) rank > MAXND_FFTW !"); 279 int sz[MAXND_FFTW]; 280 FillSizes4FFTW(in, sz); 281 fftwf_plan p = fftwf_plan_dft(rank, sz, 282 (fftwf_complex *)in.Data(), (fftwf_complex *)out.Data(), 283 FFTW_BACKWARD, FFTW_ESTIMATE); 284 if (p == NULL) 285 throw ParmError("FFTWServer::FFTBackward( complex<r_4>, complex<r_4> ) Error creating fftwf_plan"); 286 fftwf_execute(p); 287 fftwf_destroy_plan(p); 288 } 289 290 return; 291 } 292 293 294 void FFTWServer::FFTForward(TArray< r_4 > & in, TArray< complex<r_4> > & out) 295 { 296 int rank = ckR4.CheckResize(in, out); 297 if (rank == 1) { // One dimensional transform 298 fftwf_plan p = fftwf_plan_dft_r2c_1d(in.Size(), in.Data(), 299 (fftwf_complex *)out.Data(), 300 FFTW_ESTIMATE); 301 if (p == NULL) 302 throw ParmError("FFTWServer::FFTForward(r_4, complex<r_4> ) Error creating fftwf_plan"); 303 fftwf_execute(p); 304 fftwf_destroy_plan(p); 305 306 307 } 308 else { // Multi dimensional 309 if (in.NbDimensions() > MAXND_FFTW) 310 throw ParmError("FFTWServer::FFTForward(r_4, complex<r_4> ) rank > MAXND_FFTW !"); 311 int sz[MAXND_FFTW]; 312 FillSizes4FFTW(in, sz); 313 fftwf_plan p = fftwf_plan_dft_r2c(rank, sz, in.Data(), 314 (fftwf_complex *)out.Data(), 315 FFTW_ESTIMATE); 316 if (p == NULL) 317 throw ParmError("FFTWServer::FFTForward(r_4, complex<r_4> ) Error creating fftwf_plan"); 318 fftwf_execute(p); 319 fftwf_destroy_plan(p); 320 } 321 if(this->getNormalize()) out=out/complex<r_4>((double)in.Size(),0.); 322 return; 323 324 } 325 326 327 328 void FFTWServer::FFTBackward(TArray< complex<r_4> > & in, TArray< r_4 > & out, 329 bool usoutsz) 330 { 331 // ATTENTION dans les TF (Complex->Reel), c'est la taille logique de la TF 332 // qu'il faut indiquer lors de la creation des plans, cad taille tableau reel 333 int rank = ckR4.CheckResize(in, out, usoutsz); 334 bool share = (_preserve_input) ? false : true; 335 TArray< complex<r_4> > inp(in, share); 336 if (rank == 1) { // One dimensional transform 337 fftwf_plan p = fftwf_plan_dft_c2r_1d(out.Size(), (fftwf_complex *)inp.Data(), 338 out.Data(), 339 FFTW_ESTIMATE); 340 if (p == NULL) 341 throw ParmError("FFTWServer::FFTBackward(r_4, complex<r_4> ) Error creating fftwf_plan"); 342 fftwf_execute(p); 343 fftwf_destroy_plan(p); 344 } 345 else { // Multi dimensional 346 if (in.NbDimensions() > MAXND_FFTW) 347 throw ParmError("FFTWServer::FFTBackward(r_4, complex<r_4> ) rank > MAXND_FFTW !"); 348 int sz[MAXND_FFTW]; 349 FillSizes4FFTW(out, sz); 350 fftwf_plan p = fftwf_plan_dft_c2r(rank, sz, (fftwf_complex *)inp.Data(), 351 out.Data(), 352 FFTW_ESTIMATE); 353 if (p == NULL) 354 throw ParmError("FFTWServer::FFTBackward(r_4, complex<r_4> ) Error creating fftwf_plan"); 355 fftwf_execute(p); 356 fftwf_destroy_plan(p); 357 } 358 return; 359 } 360 361 362 363 /* --Methode-- */ 364 void FFTWServer::ReShapetoReal(TArray< complex<r_4> > const & ina, TArray< r_4 > & outa, 365 bool usz) 366 { 367 TVector< complex<r_4> > in(ina); 368 TVector< r_4> out(outa); 369 int n = in.NElts(); 370 r_4 thr = FFTArrayChecker<r_4>::ZeroThreshold(); 371 sa_size_t ncs; 372 if (usz) { 373 if ( (out.NElts() != 2*n-1) && (out.NElts() != 2*n-2) ) 374 throw SzMismatchError("FFTWServer::ReShapetoReal(..., true) - Wrong output array size "); 375 ncs = out.NElts(); 376 } 377 else { 378 ncs = ( (in(n-1).imag() < -thr) || (in(n-1).imag() > thr) ) ? 379 ncs = 2*n-1 : ncs = 2*n-2; 380 381 if (out.NElts() != ncs) { 382 cerr << " DEBUG-FFTWServer::ReShapetoReal() ncs= " << ncs 383 << " out.NElts()= " << out.NElts() << endl; 384 throw SzMismatchError("FFTWServer::ReShapetoReal() - Wrong output array size !"); 385 } 386 } 387 // if (ncs == 2*n-2) { 388 out(0) = in(0).real(); 389 for(int k=1; k<n; k++) { 390 out(k) = in(k).real(); 391 out(ncs-k) = in(k).imag(); 392 } 393 if (ncs == 2*n-2) 394 out(n-1) = in(n-1).real(); 395 396 // for(int k=0; k<out.NElts(); k++) cout << "ReShapetoReal out " << k << " " << out(k) << endl; 397 } 398 399 400 /* --Methode-- */ 401 void FFTWServer::ReShapetoCompl(TArray< r_4 > const & ina, TArray< complex<r_4> > & outa) 402 { 403 TVector< r_4> in(ina); 404 TVector< complex<r_4> > out(outa); 405 406 sa_size_t n = in.NElts(); 407 sa_size_t ncs = n/2+1; 408 sa_size_t nc = (n%2 != 0) ? n/2+1 : n/2; 409 if (out.NElts() != ncs) 410 throw SzMismatchError("FFTWServer::ReShapetoCompl() - Wrong output array size !"); 411 412 out(0) = complex<r_4> (in(0),0.); 413 for(int k=1; k<ncs; k++) 414 out(k) = complex<r_4>(in(k), in(n-k)); 415 if (n%2 == 0) out(ncs-1) = complex<r_4>(in(n/2), 0.); 416 417 } 418 419 #endif -
trunk/SophyaExt/IFFTW/fftwserver.h
r3000 r3359 24 24 virtual FFTServerInterface * Clone(); 25 25 26 // Transforme unidimensionnelle , N-dimensionnel 26 // Transforme unidimensionnelle , N-dimensionnel (double precision - r_8) 27 27 virtual void FFTForward(TArray< complex<r_8> > & in, TArray< complex<r_8> > & out); 28 28 virtual void FFTBackward(TArray< complex<r_8> > & in, TArray< complex<r_8> > & out); … … 31 31 bool usoutsz=false); 32 32 33 // Methodes statiques pour reordonner les donnees en 1-D 33 // Methodes statiques pour reordonner les donnees en 1-D (double precision - r_8) 34 34 static void ReShapetoReal(TArray< complex<r_8> > const & in, TArray< r_8 > & out, bool usz); 35 35 static void ReShapetoCompl(TArray< r_8 > const & in, TArray< complex<r_8> > & out); 36 36 37 #ifdef ALSO_FFTW_FLOAT_EXTSOP 38 /* --------------------------------------------------------------------------- 39 Declare and compile single precision (float) version of FFTWServr methods 40 Needs the libfftw3f.a , in addition to libfftw3.a 41 --------------------------------------------------------------------------- */ 42 43 // Transforme unidimensionnelle , N-dimensionnel (single precision - r_4) 44 virtual void FFTForward(TArray< complex<r_4> > & in, TArray< complex<r_4> > & out); 45 virtual void FFTBackward(TArray< complex<r_4> > & in, TArray< complex<r_4> > & out); 46 virtual void FFTForward(TArray< r_4 > & in, TArray< complex<r_4> > & out); 47 virtual void FFTBackward(TArray< complex<r_4> > & in, TArray< r_4 > & out, 48 bool usoutsz=false); 49 50 // Methodes statiques pour reordonner les donnees en 1-D (single precision - r_4) 51 static void ReShapetoReal(TArray< complex<r_4> > const & in, TArray< r_4 > & out, bool usz); 52 static void ReShapetoCompl(TArray< r_4 > const & in, TArray< complex<r_4> > & out); 53 54 #endif 55 37 56 protected: 38 #ifdef FFTW_V2_EXTSOP 57 58 #ifndef FFTW_V2_EXTSOP 59 /* For FFTW >= V3 */ 60 FFTArrayChecker<r_8> ckR8; 61 FFTArrayChecker<r_4> ckR4; 62 bool _preserve_input; // if true, input arrays not overwritten 63 64 #else 65 /* For FFTW V2 */ 39 66 FFTWServerPlan * _p1df; 40 67 FFTWServerPlan * _p1db; … … 46 73 FFTWServerPlan * _pndrf; 47 74 FFTWServerPlan * _pndrb; 48 #endif 75 49 76 FFTArrayChecker<r_8> ckR8; 50 77 bool _preserve_input; // if true, input arrays not overwritten 78 79 #endif 51 80 }; 52 81
Note:
See TracChangeset
for help on using the changeset viewer.