- Timestamp:
- Feb 15, 2001, 6:58:16 PM (25 years ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/IFFTW/fftwserver.cc
r1403 r1405 3 3 #include "FFTW/rfftw.h" 4 4 5 /*! 6 \class SOPHYA::FFTWServer 7 \ingroup IFFTW 8 An implementation of FFTServerInterface based on FFTW, double 9 precision arrays, using FFTW package, availabale from http://www.fftw.org. 10 Refer to FFTServerInterface for details about FFTServer operations. 11 12 \code 13 #include "fftwserver.h" 14 // ... 15 TMatrix<r_8> in(24,32); 16 TMatrix< complex<r_8> > out; 17 in = RandomSequence(); 18 FFTWServer ffts; 19 ffts.setNormalize(true); // To have normalized transforms 20 cout << " FFTServer info string= " << ffts.getInfo() << endl; 21 cout << "in= " << in << endl; 22 cout << " Calling ffts.FFTForward(in, out) : " << endl; 23 ffts.FFTForward(in, out); 24 cout << "out= " << out << endl; 25 \endcode 26 27 */ 5 28 6 29 #define MAXND_FFTW 5 30 31 namespace SOPHYA { 7 32 8 33 class FFTWServerPlan { … … 27 52 28 53 }; 54 55 } // Fin du namespace 29 56 30 57 FFTWServerPlan::FFTWServerPlan(int n, fftw_direction dir, bool fgreal) … … 40 67 _n = n; 41 68 _dir = dir; 42 if (fgreal) rp = rfftw_create_plan(n, dir, FFTW_ESTIMATE); 43 else p = fftw_create_plan(n, dir, FFTW_ESTIMATE); 69 if (fgreal) { 70 rp = rfftw_create_plan(n, dir, FFTW_ESTIMATE); 71 if (rp == NULL) 72 throw AllocationError("FFTWServerPlan: failed to create plan (rp) !"); 73 } 74 else { 75 p = fftw_create_plan(n, dir, FFTW_ESTIMATE); 76 if (p == NULL) 77 throw AllocationError("FFTWServerPlan: failed to create plan (p) !"); 78 } 79 44 80 } 45 81 … … 62 98 for(k=nd; k<MAXND_FFTW; k++) _nxyz[k] = -10; 63 99 _dir = dir; 64 if (fgreal) rpnd = rfftwnd_create_plan(_nd, _nxyz, dir, FFTW_ESTIMATE); 65 else pnd = fftwnd_create_plan(_nd, _nxyz, dir, FFTW_ESTIMATE); 100 if (fgreal) { 101 rpnd = rfftwnd_create_plan(_nd, _nxyz, dir, FFTW_ESTIMATE); 102 if (rpnd == NULL) 103 throw AllocationError("FFTWServerPlan: failed to create plan (rpnd) !"); 104 } 105 else { 106 pnd = fftwnd_create_plan(_nd, _nxyz, dir, FFTW_ESTIMATE); 107 if (pnd == NULL) 108 throw AllocationError("FFTWServerPlan: failed to create plan (pnd) !"); 109 } 110 66 111 } 67 112 … … 86 131 fftw_destroy_plan(p); 87 132 p = fftw_create_plan(n, _dir, FFTW_ESTIMATE); 133 if (p == NULL) 134 throw AllocationError("FFTWServerPlan::Recreate failed to create plan (p) !"); 88 135 } 89 136 else { 90 137 rfftw_destroy_plan(rp); 91 138 rp = rfftw_create_plan(n, _dir, FFTW_ESTIMATE); 92 } 139 if (rp == NULL) 140 throw AllocationError("FFTWServerPlan::Recreate failed to create plan (rp) !"); 141 } 142 93 143 } 94 144 … … 117 167 fftwnd_destroy_plan(pnd); 118 168 pnd = fftwnd_create_plan(_nd, _nxyz, _dir, FFTW_ESTIMATE); 169 if (pnd == NULL) 170 throw AllocationError("FFTWServerPlan::Recreate failed to create plan (pnd) !"); 119 171 } 120 172 else { 121 173 rfftwnd_destroy_plan(rpnd); 122 174 rpnd = rfftwnd_create_plan(_nd, _nxyz, _dir, FFTW_ESTIMATE); 175 if (rpnd == NULL) 176 throw AllocationError("FFTWServerPlan::Recreate failed to create plan (rpnd) !"); 123 177 } 124 178 -
trunk/SophyaExt/IFFTW/fftwserver.h
r1403 r1405 6 6 7 7 8 // Classe definissant l'interface pour les transformees de Fourier 9 // L'implementation par defaut est vide et lance une exception 8 // Classe implementant l'interface FFTServerInterface en 9 // utilisant FFTW 10 11 namespace SOPHYA { 10 12 11 13 class FFTWServerPlan; … … 44 46 }; 45 47 48 } // Fin du namespace 49 46 50 #endif -
trunk/SophyaLib/BaseTools/dvlist.cc
r1386 r1405 53 53 used to represent FITS headers. The class \b SOPHYA::ObjFileIO<DVList> 54 54 handles serialisation for DVList. (See SOPHYA::PPersist ). 55 55 \sa SOPHYA::ObjFileIO<DVList> 56 57 \code 56 58 // ------- Using DVList objects ------ 57 59 DVList dvl; … … 76 78 77 79 \endcode 78 \sa SOPHYA::ObjFileIO<DVList>79 80 */ 80 81 -
trunk/SophyaLib/HiStats/ntuple.cc
r1371 r1405 16 16 Simple NTuple class (a Table or 2-D data set) with floating value 17 17 columns. 18 \sa SOPHYA::ObjFileIO<NTuple> 19 20 \code 21 #include "ntuple.h" 22 // ... 23 char * names[3] = {"XPos", "YPos", "Val"}; 24 // NTuple (Table) creation with 3 columns 25 NTuple nt(3, names); 26 // Filling the NTuple 27 r_4 x[3]; 28 for(int i=0; i<63; i++) { 29 x[0] = (i%9)-4.; x[1] = (i/9)-3.; x[2] = x[0]*x[0]+x[1]*x[1]; 30 nt.Fill(x); 31 } 32 // Printing table info 33 cout << nt ; 34 // Saving object into a PPF file 35 POutPersist po("nt.ppf"); 36 po << nt ; 37 \endcode 18 38 */ 19 39 … … 32 52 33 53 /* --Methode-- */ 54 //! Default constructor 34 55 //++ 35 56 NTuple::NTuple() … … 46 67 47 68 69 //! Constructor with specification of number of columns and column name 70 /*! 71 \param nvar : Number of columns in the table 72 \param noms : Array of column names (length(name) < 8 characters) 73 \param blk : Optional argument specifying number of table lines 74 in a given data block 75 */ 48 76 //++ 49 77 NTuple::NTuple(int nvar, char** noms, int blk) … … 77 105 } 78 106 107 //! Copy constructor - Copies the table definition and associated data 79 108 // cmv 8/10/99 80 109 //++ … … 108 137 109 138 /* --Methode-- */ 139 //! Constructor with table initialized from a PPF file 110 140 //++ 111 141 NTuple::NTuple(char *flnm) … … 131 161 132 162 /* --Methode-- */ 163 //! Clear the data table definition and deletes the associated data 133 164 void NTuple::Clean() 134 165 { … … 149 180 150 181 /* --Methode-- cmv 08/10/99 */ 182 //! = operator, copies the data table definition and its contents 151 183 //++ 152 184 NTuple& NTuple::operator = (const NTuple& NT) … … 181 213 182 214 /* --Methode-- */ 215 //! Adds an entry (a line) to the table 216 /*! 217 \param x : content of the line to be appended to the table 218 */ 183 219 //++ 184 220 void NTuple::Fill(r_4* x) … … 317 353 318 354 /* --Methode-- */ 355 //! Prints table definition and number of entries 319 356 //++ 320 357 void NTuple::Show(ostream& os) const … … 339 376 340 377 /* --Methode-- */ 378 //! Fills the table, reading lines from an ascii file 379 /*! 380 \param fn : file name 381 \param defval : default value for empty cells in the ascii file 382 */ 341 383 //++ 342 384 int NTuple::FillFromASCIIFile(string const& fn, float defval) … … 544 586 } 545 587 588 /*! 589 \class SOPHYA::ObjFileIO<NTuple> 590 \ingroup HiStats 591 Persistence (serialisation) handler for class NTuple 592 */ 546 593 547 594 /* --Methode-- */ -
trunk/SophyaLib/HiStats/ntuple.h
r1046 r1405 97 97 }; 98 98 99 /*! Prints table information on stream \b s (nt.Show(os)) */ 99 100 inline ostream& operator << (ostream& s, NTuple const & nt) 100 101 { nt.Show(s); return(s); } 101 102 103 /*! Writes the object in the POutPersist stream \b os */ 102 104 inline POutPersist& operator << (POutPersist& os, NTuple & obj) 103 105 { ObjFileIO<NTuple> fio(&obj); fio.Write(os); return(os); } 106 /*! Reads the object from the PInPersist stream \b is */ 104 107 inline PInPersist& operator >> (PInPersist& is, NTuple & obj) 105 108 { ObjFileIO<NTuple> fio(&obj); fio.Read(is); return(is); } -
trunk/SophyaLib/HiStats/xntuple.cc
r1371 r1405 20 20 columns with int, float or string type content. In addition, this class 21 21 can handle large data sets, using swap space on disk. 22 \sa SOPHYA::ObjFileIO<XNTuple> 23 24 \code 25 #include "xntuple.h" 26 // ... 27 char * names[4] = {"X", "X2", "XInt","XStr"}; 28 // XNTuple (Table) creation with 4 columns, of integer, 29 // double(2) and string type 30 XNTuple xnt(2,0,1,1, names); 31 // Filling the NTuple 32 r_8 xd[2]; 33 int_4 xi[2]; 34 char xss[2][32]; 35 char * xs[2] = {xss[0], xss[1]} ; 36 for(int i=0; i<50; i++) { 37 xi[0] = i; xd[0] = i+0.5; xd[1] = xd[0]*xd[0]; 38 sprintf(xs[0],"X=%g", xd[0]); 39 xnt.Fill(xd, NULL, xi, xs); 40 } 41 // Printing table info 42 cout << xnt ; 43 // Saving object into a PPF file 44 POutPersist po("xnt.ppf"); 45 po << xnt ; 46 \endcode 47 22 48 */ 23 49 … … 218 244 //-- 219 245 246 //! Constructor with specification colum types and names 247 /*! 248 \param ndvar : Number of columns with type double (r_8) 249 \param nfvar : Number of columns with type float (r_4) 250 \param nivar : Number of columns with type integer (int_4) 251 \param nsvar : Number of columns with type string 252 \param vnames : Column names (in the order r_8 r_4 int_4 string) 253 (colum names are limited to 31 characters) 254 \param blk : data block size (in number of table lines) 255 \param maxblk : Maximum number of data block in memory 256 \param strsz : string length (for string type columns) 257 */ 220 258 XNTuple::XNTuple(int ndvar, int nfvar, int nivar, int nsvar, 221 259 char** vnames, … … 249 287 250 288 289 //! Constructor with table initialized from a PPF file 251 290 XNTuple::XNTuple(string const& flnm) 252 291 : mNEnt(0), mNBlk(0), mNSwBlk(0), … … 268 307 269 308 309 //! Copy constructor - Copies the table definition and associated data 270 310 XNTuple::XNTuple(XNTuple const& nt) 271 311 : mNEnt(0), mNBlk(0), mNSwBlk(0), … … 294 334 295 335 336 //! Clear the data table definition and deletes the associated data 296 337 void XNTuple::clean() 297 338 { … … 341 382 // Opérateur égal (=) , copie "nt" dans le premier NTuple 342 383 //-- 384 //! Appends an entry (line) to the table 385 /*! 386 \param d_data : double (r_8) line elements 387 \param f_data : float (r_4) line elements 388 \param i_data : integer (int_4) line elements 389 \param s_data : string line elements 390 */ 343 391 void XNTuple::Fill(r_8* d_data, r_4* f_data, int_4* i_data, char** s_data) 344 392 { … … 552 600 //-- 553 601 602 //! Returns the associated DVList object 554 603 DVList& XNTuple::Info() 555 604 { … … 597 646 598 647 648 //! Prints table definition and number of entries 599 649 void XNTuple::Show(ostream& os) const 600 650 { … … 636 686 } 637 687 688 //! NOT YET IMPLEMENTED ! - Fills table from an ascii file 638 689 int XNTuple::FillFromASCIIFile(string const& fn, r_8 ddval, r_4 dfval, 639 690 int dival, const char * dsval) … … 646 697 647 698 699 //! Defines swap file path for XNTuple objects (Default=/tmp) 648 700 void XNTuple::SetSwapPath(char* p) 649 701 { … … 843 895 } 844 896 897 /*! 898 \class SOPHYA::ObjFileIO<XNTuple> 899 \ingroup HiStats 900 Persistence (serialisation) handler for class XNTuple 901 */ 845 902 846 903 void ObjFileIO<XNTuple>::WriteSelf(POutPersist& ppout) const -
trunk/SophyaLib/HiStats/xntuple.h
r1046 r1405 159 159 }; 160 160 161 161 /*! Prints table information on stream \b s (nt.Show(os)) */ 162 162 inline ostream& operator << (ostream& s, XNTuple const & nt) 163 163 { nt.Show(s); return(s); } 164 164 165 /*! Writes the object in the POutPersist stream \b os */ 165 166 inline POutPersist& operator << (POutPersist& os, XNTuple & obj) 166 167 { ObjFileIO<XNTuple> fio(&obj); fio.Write(os); return(os); } 168 /*! Reads the object from the PInPersist stream \b is */ 167 169 inline PInPersist& operator >> (PInPersist& is, XNTuple & obj) 168 170 { ObjFileIO<XNTuple> fio(&obj); fio.Read(is); return(is); } -
trunk/SophyaLib/NTools/fftpserver.cc
r1402 r1405 15 15 necessarily correspond with the equivalent fftpack function. For example, 16 16 fftpack "forward" transformations are in fact inverse fourier transformations. 17 Otherwise, the output is in the fftpack format.18 19 17 20 18 Due to the way that fftpack manages … … 23 21 of differing length, it may be more efficient to create an fftserver object 24 22 for each length. 23 24 \code 25 #include "fftpserver.h" 26 // ... 27 TVector<r_8> in(32); 28 TVector< complex<r_8> > out; 29 in = RandomSequence(); 30 FFTPackServer ffts; 31 ffts.setNormalize(true); // To have normalized transforms 32 cout << " FFTServer info string= " << ffts.getInfo() << endl; 33 cout << "in= " << in << endl; 34 cout << " Calling ffts.FFTForward(in, out) : " << endl; 35 ffts.FFTForward(in, out); 36 cout << "out= " << out << endl; 37 \endcode 25 38 */ 26 39 -
trunk/SophyaLib/NTools/fftservintf.cc
r1402 r1405 6 6 \ingroup NTools 7 7 Defines the interface for FFT (Fast Fourier Transform) operations. 8 Definitions : 9 - Sampling period \b T 10 - Sampling frequency \b fs=1/T 11 - Total number of samples \b N 12 - Frequency step in Fourier space \b =fs/N=1/(N*T) 13 - Component frequencies 14 - k=0 -> 0 15 - k=1 -> 1/(N*T) 16 - k -> k/(N*T) 17 - k=N/2 -> 1/(2*T) (Nyquist frequency) 18 - k>N/2 -> k/(N*T) (or negative frequency -(N-k)/(N*T)) 19 20 For a sampling period T=1, the computed Fourier components correspond to : 21 \verbatim 22 0 1/N 2/N ... 1/2 1/2+1/N 1/2+2/N ... 1-2/N 1-1/N 23 0 1/N 2/N ... 1/2 ... -2/N -1/N 24 \endverbatim 25 26 For complex one-dimensional transforms: 27 \f[ 28 out(i) = F_{norm} \Sigma_{j} \ e^{-2 \pi \sqrt{-1} \ i \ j} \ {\rm (forward)} 29 \f] 30 \f[ 31 out(i) = F_{norm} \Sigma_{j} \ e^{2 \pi \sqrt{-1} \ i \ j} \ {\rm (backward)} 32 \f] 33 i,j= 0..N-1 , where N is the input or the output array size. 34 35 For complex multi-dimensional transforms: 36 \f[ 37 out(i1,i2,...,id) = F_{norm} \Sigma_{j1} \Sigma_{j2} ... \Sigma_{jd} \ 38 e^{-2 \pi \sqrt{-1} \ i1 \ j1} ... e^{-2 \pi \sqrt{-1} \ id \ jd} \ {\rm (forward)} 39 \f] 40 \f[ 41 out(i1,i2,...,id) = F_{norm} \Sigma_{j1} \Sigma_{j2} ... \Sigma_{jd} \ 42 e^{2 \pi \sqrt{-1} \ i1 \ j1} ... e^{2 \pi \sqrt{-1} \ id \ jd} \ {\rm (backward)} 43 \f] 44 45 For real forward transforms, the input array is real, and 46 the output array complex, with Fourier components up to k=N/2. 47 For real backward transforms, the input array is complex and 48 the output array is real. 8 49 */ 9 50 … … 23 64 24 65 /* --Methode-- */ 66 //! Forward Fourier transform for double precision complex data 67 /*! 68 \param in : Input complex array 69 \param out : Output complex array 70 */ 25 71 void FFTServerInterface::FFTForward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &) 26 72 { … … 29 75 30 76 /* --Methode-- */ 77 //! Backward (inverse) Fourier transform for double precision complex data 78 /*! 79 \param in : Input complex array 80 \param out : Output complex array 81 */ 31 82 void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &) 32 83 { … … 35 86 36 87 /* --Methode-- */ 88 //! Forward Fourier transform for double precision real input data 89 /*! 90 \param in : Input real array 91 \param out : Output complex array 92 */ 37 93 void FFTServerInterface::FFTForward(TArray< r_8 > const &, TArray< complex<r_8> > &) 38 94 { … … 41 97 42 98 /* --Methode-- */ 99 //! Backward (inverse) Fourier transform for double precision real output data 100 /*! 101 \param in : Input complex array 102 \param out : Output real array 103 \param usoutsz : if true, use the output array size for computing the inverse FFT. 104 */ 43 105 void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< r_8 > &, bool) 44 106 { … … 50 112 51 113 /* --Methode-- */ 114 //! Forward Fourier transform for complex data 115 /*! 116 \param in : Input complex array 117 \param out : Output complex array 118 */ 52 119 void FFTServerInterface::FFTForward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &) 53 120 { … … 56 123 57 124 /* --Methode-- */ 125 //! Backward (inverse) Fourier transform for complex data 126 /*! 127 \param in : Input complex array 128 \param out : Output complex array 129 */ 58 130 void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &) 59 131 { … … 62 134 63 135 /* --Methode-- */ 136 //! Forward Fourier transform for real input data 137 /*! 138 \param in : Input real array 139 \param out : Output complex array 140 */ 64 141 void FFTServerInterface::FFTForward(TArray< r_4 > const &, TArray< complex<r_4> > &) 65 142 { … … 68 145 69 146 /* --Methode-- */ 147 //! Backward (inverse) Fourier transform for real output data 148 /*! 149 \param in : Input complex array 150 \param out : Output real array 151 \param usoutsz : if true, use the output array size for computing the inverse FFT. 152 */ 70 153 void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< r_4 > &, bool) 71 154 { … … 76 159 77 160 /* --Methode-- */ 161 /*! 162 \class SOPHYA::FFTArrayChecker 163 \ingroup NTools 164 Service class for checking array size and resizing output arrays, 165 to be used by FFTServer classes 166 */ 167 78 168 template <class T> 79 169 FFTArrayChecker<T>::FFTArrayChecker(string msg, bool checkpack, bool onedonly) -
trunk/SophyaLib/NTools/fftservintf.h
r1402 r1405 27 27 virtual FFTServerInterface * Clone() = 0; 28 28 29 //! Set/clear the flag for normalizing Fourier transforms. 29 30 inline void setNormalize(bool fg=false) { _fgnorm = fg; } 31 //! Returns the status of normalization flag for the server 30 32 inline bool getNormalize() const { return(_fgnorm); } 33 //! Returns the information string associated with the server 31 34 inline string getInfo() const { return _info; } 32 35 … … 53 56 }; 54 57 55 } // Fin du namespace56 58 57 59 template <class T> … … 79 81 }; 80 82 83 } // Fin du namespace 84 81 85 #endif
Note:
See TracChangeset
for help on using the changeset viewer.