Changeset 1390 in Sophya
- Timestamp:
- Feb 9, 2001, 6:08:57 PM (25 years ago)
- Location:
- trunk/SophyaLib/NTools
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/cimage.cc
r1159 r1390 9 9 #include "cimage.h" 10 10 11 /*! 12 \class SOPHYA::Image 13 \ingroup NTools 14 This class specializes the Matrix class, for representing intensity 15 (or grey-level) images. It adds the possibility of defining pixel 16 size and offset. The convention for the acces operator is also 17 changed, compared to the matrix class. 18 */ 19 20 //! Default constructor - Pixel array not allocated 11 21 template <class T> 12 22 Image<T>::Image() … … 18 28 } 19 29 20 template <class T> 21 Image<T>::Image(uint_4 sizx, uint_4 sizy, r_8 szpx, r_8 szpy, r_8 orgx, r_8 orgy) 30 //! Constructor, with specification of the image size, pixel size and offsets 31 template <class T> 32 Image<T>::Image(sa_size_t sizx, sa_size_t sizy, r_8 szpx, r_8 szpy, r_8 orgx, r_8 orgy) 22 33 // Constructeur par defaut. 23 34 : TMatrix<T>(sizy, sizx) … … 27 38 } 28 39 40 //! Copy constructor 29 41 template <class T> 30 42 Image<T>::Image(const Image<T>& a) … … 35 47 } 36 48 49 50 //! Copy constructor with possibility of duplicating the pixel array 51 /*! 52 \param share : if true, the data is shared, duplicated if false. 53 */ 37 54 template <class T> 38 55 Image<T>::Image(const Image<T>& a, bool share) … … 42 59 SetPixelSize(a.XPixSize(), a.YPixSize()); 43 60 } 61 62 //! Destructor 44 63 template <class T> 45 64 Image<T>::~Image() -
trunk/SophyaLib/NTools/cimage.h
r1204 r1390 16 16 namespace SOPHYA { 17 17 18 //! Class for handling images 18 19 template <class T> 19 20 class Image : public TMatrix<T> { … … 21 22 public: 22 23 Image(); 23 Image( uint_4 sizx, uint_4sizy, r_8 szpx=1., r_8 szpy=1., r_8 orgx=0., r_8 orgy=0.);24 Image(sa_size_t sizx, sa_size_t sizy, r_8 szpx=1., r_8 szpy=1., r_8 orgx=0., r_8 orgy=0.); 24 25 Image(const Image<T>& a); 25 26 Image(const Image<T>& a, bool share); … … 28 29 29 30 // Inline element acces methods 30 inline T const& operator()( uint_4 ix,uint_4jy) const;31 inline T& operator()( uint_4 ix,uint_4jy);31 inline T const& operator()(sa_size_t ix, sa_size_t jy) const; 32 inline T& operator()(sa_size_t ix, sa_size_t jy); 32 33 33 inline uint_4 XSize() const {return NCols();} 34 inline uint_4 YSize() const {return NRows();} 34 //! Returns the image size along X (corresponding to the number of columns) 35 inline sa_size_t XSize() const {return NCols();} 36 //! Returns the image size along Y (corresponding to the number of lines) 37 inline sa_size_t YSize() const {return NRows();} 35 38 39 //! Returns the X position, for pixel(0,0) 36 40 inline r_8 XOrg() const {return org_x;} 41 //! Returns the Y position, for pixel(0,0) 37 42 inline r_8 YOrg() const {return org_y;} 38 43 44 //! Returns pixel size along X 39 45 inline r_8 XPixSize() const {return pxsz_x;} 46 //! Returns pixel size along Y 40 47 inline r_8 YPixSize() const {return pxsz_y;} 41 48 42 inline r_8 XPos(uint_4 i) const {return org_x + i*pxsz_x;} 43 inline r_8 YPos(uint_4 j) const {return org_y + j*pxsz_y;} 49 //! Returns the pixel position along X, for pixels with X index \b i 50 inline r_8 XPos(sa_size_t i) const {return org_x + i*pxsz_x;} 51 //! Returns the pixel position along Y, for pixels with Y index \b j 52 inline r_8 YPos(sa_size_t j) const {return org_y + j*pxsz_y;} 44 53 54 //! Set the position for pixel(0,0) 45 55 inline void SetOrg(r_8 orgx=0., r_8 orgy=0.) 46 56 { org_x = orgx; org_y = orgy; } 57 //! Set the pixel size 47 58 inline void SetPixelSize(r_8 szx=1., r_8 szy=1.) 48 59 { pxsz_x = szx; pxsz_y = szy; } … … 53 64 }; 54 65 66 //! () : Return the pixel value (element) for pixel \b ix (column index) and \b jy (line index) 55 67 template <class T> 56 inline T const& Image<T>::operator()( uint_4 ix, uint_4jy) const68 inline T const& Image<T>::operator()(sa_size_t ix, sa_size_t jy) const 57 69 { 58 70 return (TMatrix<T>::operator() (jy, ix)); 59 71 } 60 72 73 //! () : Return the pixel value (element) for pixel \b ix (column index) and \b jy (line index) 61 74 template <class T> 62 inline T & Image<T>::operator()( uint_4 ix, uint_4jy)75 inline T & Image<T>::operator()(sa_size_t ix, sa_size_t jy) 63 76 { 64 77 return (TMatrix<T>::operator() (jy, ix)); … … 82 95 }; 83 96 84 /*! \ingroup Image\fn operator<<(POutPersist&,Image<T>&)97 /*! \ingroup NTools \fn operator<<(POutPersist&,Image<T>&) 85 98 \brief Write Image \b obj into POutPersist stream \b os */ 86 99 template <class T> … … 88 101 { FIO_Image<T> fio(&obj); fio.Write(os); return(os); } 89 102 90 /*! \ingroup Image\fn operator>>(PInPersist&,Image<T>&)103 /*! \ingroup NTools \fn operator>>(PInPersist&,Image<T>&) 91 104 \brief Read Image \b obj from PInPersist stream \b os */ 92 105 template <class T> … … 102 115 103 116 class GeneralFit; 117 //! OBSOLETE - Should not be used - for compatibility with peida in (s)piapp 104 118 class RzImage { 105 119 public: -
trunk/SophyaLib/NTools/fftpserver.cc
r1371 r1390 28 28 FFTPackServer::FFTPackServer() 29 29 : FFTServerInterface("FFTPackServer using extended FFTPack (C-version) package") 30 30 , ckR4(true, true) , ckR8(true, true) 31 31 { 32 32 //the working array and its size for the different … … 56 56 57 57 58 void FFTPackServer::FFTForward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out) 59 { 60 out = in; 61 fftf(out.NElts(), out.Data()); 62 if (getNormalize()) out *= (1./(r_8)(in.NElts())); 63 } 64 65 void FFTPackServer::FFTBackward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out) 66 { 67 out = in; 68 fftb(out.NElts(), out.Data()); 69 } 70 71 72 73 void FFTPackServer::FFTForward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out) 74 { 75 out = in; 76 fftf(out.NElts(), out.Data()); 77 if (getNormalize()) out *= (1./(r_4)(in.NElts())); 78 } 79 80 void FFTPackServer::FFTBackward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out) 81 { 82 out = in; 83 fftb(out.NElts(), out.Data()); 84 } 85 86 void FFTPackServer::FFTForward(TVector< r_4 > const & in, TVector< complex<r_4> > & out) 87 { 88 TVector< r_4 > inout(in, false); 89 fftf(inout.NElts(), inout.Data()); 90 ReShapetoCompl(inout, out); 91 if (getNormalize()) out *= (1./(r_4)(in.NElts())); 92 } 93 94 void FFTPackServer::FFTBackward(TVector< complex<r_4> > const & in, TVector< r_4 > & out) 95 { 96 ReShapetoReal(in, out); 97 fftb(out.NElts(), out.Data()); 98 } 99 100 101 void FFTPackServer::FFTForward(TVector< r_8 > const & in, TVector< complex<r_8> > & out) 102 { 103 TVector< r_8 > inout(in, false); 104 fftf(inout.NElts(), inout.Data()); 105 ReShapetoCompl(inout, out); 106 if (getNormalize()) out *= (1./(r_8)(in.NElts())); 107 } 108 109 void FFTPackServer::FFTBackward(TVector< complex<r_8> > const & in, TVector< r_8 > & out) 110 { 111 ReShapetoReal(in, out); 112 fftb(out.NElts(), out.Data()); 58 void FFTPackServer::FFTForward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out) 59 { 60 ckR8.CheckResize(in, out); 61 out = in; 62 fftf(out.Size(), out.Data()); 63 if (getNormalize()) out *= (1./(r_8)(in.Size())); 64 } 65 66 void FFTPackServer::FFTBackward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out) 67 { 68 ckR8.CheckResize(in, out); 69 out = in; 70 fftb(out.Size(), out.Data()); 71 } 72 73 74 75 void FFTPackServer::FFTForward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out) 76 { 77 ckR4.CheckResize(in, out); 78 out = in; 79 fftf(out.Size(), out.Data()); 80 if (getNormalize()) out *= (1./(r_4)(in.Size())); 81 } 82 83 void FFTPackServer::FFTBackward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out) 84 { 85 ckR4.CheckResize(in, out); 86 out = in; 87 fftb(out.Size(), out.Data()); 88 } 89 90 void FFTPackServer::FFTForward(TArray< r_4 > const & in, TArray< complex<r_4> > & out) 91 { 92 ckR4.CheckResize(in, out); 93 TArray< r_4 > inout(in, false); 94 fftf(inout.Size(), inout.Data()); 95 ckR4.ReShapetoCompl(inout, out); 96 if (getNormalize()) out *= complex<r_4>((1./(r_4)(in.Size())), 0.); 97 } 98 99 void FFTPackServer::FFTBackward(TArray< complex<r_4> > const & in, TArray< r_4 > & out) 100 { 101 ckR4.CheckResize(in, out); 102 ckR4.ReShapetoReal(in, out); 103 fftb(out.Size(), out.Data()); 104 } 105 106 107 void FFTPackServer::FFTForward(TArray< r_8 > const & in, TArray< complex<r_8> > & out) 108 { 109 ckR8.CheckResize(in, out); 110 TArray< r_8 > inout(in, false); 111 fftf(inout.Size(), inout.Data()); 112 ckR8.ReShapetoCompl(inout, out); 113 if (getNormalize()) out *= complex<r_8>((1./(r_8)(in.Size())), 0.); 114 } 115 116 void FFTPackServer::FFTBackward(TArray< complex<r_8> > const & in, TArray< r_8 > & out) 117 { 118 ckR8.CheckResize(in, out); 119 ckR8.ReShapetoReal(in, out); 120 fftb(out.Size(), out.Data()); 113 121 } 114 122 … … 208 216 } 209 217 210 // Methodes pour reordonner les donnees 211 212 /* --Methode-- */ 213 void FFTPackServer::ReShapetoReal( TVector< complex<r_8> > const & in, TVector< r_8 > & out) 214 { 215 int n = in.NElts(); 216 int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 217 out.ReSize(ncs); 218 int k; 219 out(0) = in(0).real(); 220 for(k=1;k<n-1;k++) { 221 out(2*k-1) = in(k).real(); 222 out(2*k) = in(k).imag(); 223 } 224 if (ncs == n*2-2) out(ncs-1) = in(n-1).real(); 225 else { out(ncs-2) = in(n-1).real(); out(ncs-1) = in(n-1).imag(); } 226 } 227 228 /* --Methode-- */ 229 void FFTPackServer::ReShapetoReal( TVector< complex<r_4> > const & in, TVector< r_4 > & out) 230 { 231 int n = in.NElts(); 232 int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 233 out.ReSize(ncs); 234 int k; 235 out(0) = in(0).real(); 236 for(k=1;k<n-1;k++) { 237 out(2*k-1) = in(k).real(); 238 out(2*k) = in(k).imag(); 239 } 240 if (ncs == n*2-2) out(ncs-1) = in(n-1).real(); 241 else { out(ncs-2) = in(n-1).real(); out(ncs-1) = in(n-1).imag(); } 242 } 243 244 245 /* --Methode-- */ 246 void FFTPackServer::ReShapetoCompl(TVector< r_8 > const & in, TVector< complex<r_8> > & out) 247 { 248 uint_4 n = in.NElts(); 249 uint_4 ncs = n/2+1; 250 uint_4 nc = (n%2 != 0) ? n/2+1 : n/2; 251 out.ReSize(ncs); 252 out(0) = complex<r_8> (in(0),0.); 253 for(int k=1;k<nc;k++) 254 out(k) = complex<r_4> (in(2*k-1), in(2*k)); 255 if (n%2 == 0) out(ncs-1) = complex<r_8>(in(n-1), 0.); 256 257 } 258 259 /* --Methode-- */ 260 void FFTPackServer::ReShapetoCompl(TVector< r_4 > const & in, TVector< complex<r_4> > & out) 261 { 262 uint_4 n = in.NElts(); 263 uint_4 ncs = n/2+1; 264 uint_4 nc = (n%2 != 0) ? n/2+1 : n/2; 265 out.ReSize(ncs); 266 out(0) = complex<r_4> (in(0),0.); 267 for(int k=1;k<nc;k++) 268 out(k) = complex<r_4> (in(2*k-1), in(2*k)); 269 if (n%2 == 0) out(ncs-1) = complex<r_4>(in(n-1), 0.); 270 } 218 -
trunk/SophyaLib/NTools/fftpserver.h
r1371 r1390 23 23 24 24 // Transforme unidimensionnel sur des double 25 virtual void FFTForward(T Vector< complex<r_8> > const & in, TVector< complex<r_8> > & out);26 virtual void FFTBackward(T Vector< complex<r_8> > const & in, TVector< complex<r_8> > & out);27 virtual void FFTForward(T Vector< r_8 > const & in, TVector< complex<r_8> > & out);28 virtual void FFTBackward(T Vector< complex<r_8> > const & in, TVector< r_8 > & out);25 virtual void FFTForward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out); 26 virtual void FFTBackward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out); 27 virtual void FFTForward(TArray< r_8 > const & in, TArray< complex<r_8> > & out); 28 virtual void FFTBackward(TArray< complex<r_8> > const & in, TArray< r_8 > & out); 29 29 30 30 // Transforme unidimensionnel sur des float 31 virtual void FFTForward(T Vector< complex<r_4> > const & in, TVector< complex<r_4> > & out);32 virtual void FFTBackward(T Vector< complex<r_4> > const & in, TVector< complex<r_4> > & out);33 virtual void FFTForward(T Vector< r_4 > const & in, TVector< complex<r_4> > & out);34 virtual void FFTBackward(T Vector< complex<r_4> > const & in, TVector< r_4 > & out);31 virtual void FFTForward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out); 32 virtual void FFTBackward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out); 33 virtual void FFTForward(TArray< r_4 > const & in, TArray< complex<r_4> > & out); 34 virtual void FFTBackward(TArray< complex<r_4> > const & in, TArray< r_4 > & out); 35 35 36 36 // Methodes propres a cette classe … … 43 43 virtual void fftf(int_4 l, complex<double>* inout); 44 44 virtual void fftb(int_4 l, complex<double>* inout); 45 46 // Methodes statiques pour reordonner les donnees47 virtual void ReShapetoReal( TVector< complex<r_8> > const & in, TVector< r_8 > & out);48 virtual void ReShapetoReal( TVector< complex<r_4> > const & in, TVector< r_4 > & out);49 50 virtual void ReShapetoCompl(TVector< r_8 > const & in, TVector< complex<r_8> > & out);51 virtual void ReShapetoCompl(TVector< r_4 > const & in, TVector< complex<r_4> > & out);52 45 53 46 protected: … … 68 61 int sz_cdfft; 69 62 r_8* ws_cdfft; 63 64 FFTArrayChecker<r_4> ckR4; 65 FFTArrayChecker<r_8> ckR8; 70 66 }; 71 67 … … 73 69 74 70 75 76 77 71 #endif -
trunk/SophyaLib/NTools/fftservintf.cc
r1371 r1390 6 6 \ingroup NTools 7 7 Defines the interface for FFT (Fast Fourier Transform) operations. 8 Warning: The interface is likely to be changed and simplified,9 using only SOPHYA::TArray Objects.10 8 */ 11 9 … … 22 20 } 23 21 24 /* --Methode-- */ 25 void FFTServerInterface::FFTForward(TVector< complex<r_8> > const &, TVector< complex<r_8> > &) 26 { 27 throw NotAvailableOperation("FFTServer::FFTForward(TVector...) Unsupported operation !"); 28 } 29 30 /* --Methode-- */ 31 void FFTServerInterface::FFTBackward(TVector< complex<r_8> > const &, TVector< complex<r_8> > &) 32 { 33 throw NotAvailableOperation("FFTServer::FFTBackward(TVector...) Unsupported operation !"); 34 } 35 36 /* --Methode-- */ 37 void FFTServerInterface::FFTForward(TVector< r_8 > const &, TVector< complex<r_8> > &) 38 { 39 throw NotAvailableOperation("FFTServer::FFTForward(TVector...) Unsupported operation !"); 40 } 41 42 /* --Methode-- */ 43 void FFTServerInterface::FFTBackward(TVector< complex<r_8> > const &, TVector< r_8 > &) 44 { 45 throw NotAvailableOperation("FFTServer::FFTBackward(TVector...) Unsupported operation !"); 46 } 47 48 /* --Methode-- */ 49 void FFTServerInterface::FFTForward(TMatrix< complex<r_8> > const &, TMatrix< complex<r_8> > &) 50 { 51 throw NotAvailableOperation("FFTServer::FFTForward(TMatrix...) Unsupported operation !"); 52 } 53 54 /* --Methode-- */ 55 void FFTServerInterface::FFTBackward(TMatrix< complex<r_8> > const &, TMatrix< complex<r_8> > &) 56 { 57 throw NotAvailableOperation("FFTServer::FFTBackward(TMatrix...) Unsupported operation !"); 58 } 59 60 /* --Methode-- */ 61 void FFTServerInterface::FFTForward(TMatrix< r_8 > const &, TMatrix< complex<r_8> > &) 62 { 63 throw NotAvailableOperation("FFTServer::FFTForward(TMatrix...) Unsupported operation !"); 64 } 65 66 /* --Methode-- */ 67 void FFTServerInterface::FFTBackward(TMatrix< complex<r_8> > const &, TMatrix< r_8 > &) 68 { 69 throw NotAvailableOperation("FFTServer::FFTBackward(TMatrix...) Unsupported operation !"); 22 // ----------------- Transforme pour les double ------------------- 23 24 /* --Methode-- */ 25 void FFTServerInterface::FFTForward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &) 26 { 27 throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !"); 28 } 29 30 /* --Methode-- */ 31 void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &) 32 { 33 throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !"); 34 } 35 36 /* --Methode-- */ 37 void FFTServerInterface::FFTForward(TArray< r_8 > const &, TArray< complex<r_8> > &) 38 { 39 throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !"); 40 } 41 42 /* --Methode-- */ 43 void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< r_8 > &) 44 { 45 throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !"); 70 46 } 71 47 … … 74 50 75 51 /* --Methode-- */ 76 void FFTServerInterface::FFTForward(TVector< complex<r_4> > const &, TVector< complex<r_4> > &) 77 { 78 throw NotAvailableOperation("FFTServer::FFTForward(TVector r_4 ... ) Unsupported operation !"); 79 } 80 81 /* --Methode-- */ 82 void FFTServerInterface::FFTBackward(TVector< complex<r_4> > const &, TVector< complex<r_4> > &) 83 { 84 throw NotAvailableOperation("FFTServer::FFTBackward(TVector r_4 ... ) Unsupported operation !"); 85 } 86 87 /* --Methode-- */ 88 void FFTServerInterface::FFTForward(TVector< r_4 > const &, TVector< complex<r_4> > &) 89 { 90 throw NotAvailableOperation("FFTServer::FFTForward(TVector r_4 ... ) Unsupported operation !"); 91 } 92 93 /* --Methode-- */ 94 void FFTServerInterface::FFTBackward(TVector< complex<r_4> > const &, TVector< r_4 > &) 95 { 96 throw NotAvailableOperation("FFTServer::FFTBackward(TVector r_4 ... ) Unsupported operation !"); 97 } 98 99 /* --Methode-- */ 100 void FFTServerInterface::FFTForward(TMatrix< complex<r_4> > const &, TMatrix< complex<r_4> > &) 101 { 102 throw NotAvailableOperation("FFTServer::FFTForward(TMatrix r_4 ... ) Unsupported operation !"); 103 } 104 105 /* --Methode-- */ 106 void FFTServerInterface::FFTBackward(TMatrix< complex<r_4> > const &, TMatrix< complex<r_4> > &) 107 { 108 throw NotAvailableOperation("FFTServer::FFTBackward(TMatrix r_4 ... ) Unsupported operation !"); 109 } 110 111 /* --Methode-- */ 112 void FFTServerInterface::FFTForward(TMatrix< r_4 > const &, TMatrix< complex<r_4> > &) 113 { 114 throw NotAvailableOperation("FFTServer::FFTForward(TMatrix r_4 ... ) Unsupported operation !"); 115 } 116 117 /* --Methode-- */ 118 void FFTServerInterface::FFTBackward(TMatrix< complex<r_4> > const &, TMatrix< r_4 > &) 119 { 120 throw NotAvailableOperation("FFTServer::FFTBackward(TMatrix r_4 ... ) Unsupported operation !"); 121 } 122 123 52 void FFTServerInterface::FFTForward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &) 53 { 54 throw NotAvailableOperation("FFTServer::FFTForward(TArray r_4 ... ) Unsupported operation !"); 55 } 56 57 /* --Methode-- */ 58 void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &) 59 { 60 throw NotAvailableOperation("FFTServer::FFTBackward(TArray r_4 ... ) Unsupported operation !"); 61 } 62 63 /* --Methode-- */ 64 void FFTServerInterface::FFTForward(TArray< r_4 > const &, TArray< complex<r_4> > &) 65 { 66 throw NotAvailableOperation("FFTServer::FFTForward(TArray r_4 ... ) Unsupported operation !"); 67 } 68 69 /* --Methode-- */ 70 void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< r_4 > &) 71 { 72 throw NotAvailableOperation("FFTServer::FFTBackward(TArray r_4 ... ) Unsupported operation !"); 73 } 74 75 76 77 /* --Methode-- */ 78 template <class T> 79 FFTArrayChecker<T>::FFTArrayChecker(bool checkpack, bool onedonly) 80 { 81 _checkpack = checkpack; 82 _onedonly = onedonly; 83 } 84 85 /* --Methode-- */ 86 template <class T> 87 FFTArrayChecker<T>::~FFTArrayChecker() 88 { 89 } 90 91 /* --Methode-- */ 92 template <class T> 93 int FFTArrayChecker<T>::CheckResize(TArray< complex<T> > const & in, TArray< complex<T> > & out) 94 { 95 int k; 96 if (in.Size() < 1) 97 throw(SzMismatchError("FFTArrayChecker::CheckResize(complex in, complex out) - Unallocated input array !")); 98 if (_checkpack) 99 if ( !in.IsPacked() ) 100 throw(SzMismatchError("FFTArrayChecker::CheckResize(complex in, complex out) - Not packed input array !")); 101 int ndg1 = 0; 102 for(k=0; k<in.NbDimensions(); k++) 103 if (in.Size(k) > 1) ndg1++; 104 if (_onedonly) 105 if (ndg1++ > 1) 106 throw(SzMismatchError("FFTArrayChecker::CheckResize(complex in, complex out) - Only 1-D array accepted !")); 107 108 sa_size_t sz[BASEARRAY_MAXNDIMS]; 109 for(k=0; k<in.NbDimensions(); k++) 110 sz[k] = in.Size(k); 111 out.ReSize(in.NbDimensions(), sz); 112 113 return(ndg1); 114 } 115 116 /* --Methode-- */ 117 template <class T> 118 int FFTArrayChecker<T>::CheckResize(TArray< T > const & in, TArray< complex<T> > & out) 119 { 120 int k; 121 if (in.Size() < 1) 122 throw(SzMismatchError("FFTArrayChecker::CheckResize(real in, complex out) - Unallocated input array !")); 123 if (_checkpack) 124 if ( !in.IsPacked() ) 125 throw(SzMismatchError("FFTArrayChecker::CheckResize(real in, complex out) - Not packed input array !")); 126 int ndg1 = 0; 127 for(k=0; k<in.NbDimensions(); k++) 128 if (in.Size(k) > 1) ndg1++; 129 if (_onedonly) 130 if (ndg1++ > 1) 131 throw(SzMismatchError("FFTArrayChecker::CheckResize(real in, complex out) - Only 1-D array accepted !")); 132 133 sa_size_t sz[BASEARRAY_MAXNDIMS]; 134 for(k=0; k<in.NbDimensions(); k++) 135 sz[k] = in.Size(k)/2+1; 136 out.ReSize(in.NbDimensions(), sz); 137 138 return(ndg1); 139 } 140 141 /* --Methode-- */ 142 template <class T> 143 int FFTArrayChecker<T>::CheckResize(TArray< complex<T> > const & in, TArray< T > & out) 144 { 145 int k; 146 if (in.Size() < 1) 147 throw(SzMismatchError("FFTArrayChecker::CheckResize(complex in, real out) - Unallocated input array !")); 148 if (_checkpack) 149 if ( !in.IsPacked() ) 150 throw(SzMismatchError("FFTArrayChecker::CheckResize(complex in, real out) - Not packed input array !")); 151 int ndg1 = 0; 152 for(k=0; k<in.NbDimensions(); k++) 153 if (in.Size(k) > 1) ndg1++; 154 if (_onedonly) 155 if (ndg1++ > 1) 156 throw(SzMismatchError("FFTArrayChecker::CheckResize(complex in, real out) - Only 1-D array accepted !")); 157 158 sa_size_t sz[BASEARRAY_MAXNDIMS]; 159 for(k=0; k<in.NbDimensions(); k++) 160 sz[k] = in.Size(k)*2-1; 161 out.ReSize(in.NbDimensions(), sz); 162 163 return(ndg1); 164 165 } 166 167 /* --Methode-- */ 168 template <class T> 169 void FFTArrayChecker<T>::ReShapetoReal( TArray< complex<T> > const & in, TArray< T > & out) 170 { 171 sa_size_t n = in.Size(); 172 // int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 173 sa_size_t ncs = 2*n-1; 174 sa_size_t k; 175 out[0] = in[0].real(); 176 for(k=1;k<n-1;k++) { 177 out[2*k-1] = in[k].real(); 178 out[2*k] = in[k].imag(); 179 } 180 // if (ncs == n*2-2) out[ncs-1] = in[n-1].real(); 181 // else { out[ncs-2] = in[n-1].real(); out[ncs-1] = in[n-1].imag(); } 182 out[ncs-2] = in[n-1].real(); out[ncs-1] = in[n-1].imag(); 183 } 184 185 /* --Methode-- */ 186 template <class T> 187 void FFTArrayChecker<T>::ReShapetoCompl(TArray< T > const & in, TArray< complex<T> > & out) 188 { 189 sa_size_t n = in.Size(); 190 sa_size_t ncs = n/2+1; 191 sa_size_t nc = (n%2 != 0) ? n/2+1 : n/2; 192 out[0] = complex<T> (in[0],0.); 193 for(int k=1;k<nc;k++) 194 out[k] = complex<T> (in[2*k-1], in[2*k]); 195 if (n%2 == 0) out[ncs-1] = complex<r_8>(in[n-1], 0.); 196 } 197 198 199 #ifdef __CXX_PRAGMA_TEMPLATES__ 200 #pragma define_template FFTArrayChecker<r_4> 201 #pragma define_template FFTArrayChecker<r_8> 202 #endif 203 204 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) 205 template class FFTArrayChecker<r_4>; 206 template class FFTArrayChecker<r_8>; 207 #endif -
trunk/SophyaLib/NTools/fftservintf.h
r1371 r1390 45 45 46 46 //--------------------------------------------------- 47 // Transforme 2Dsur des doubles48 virtual void FFTForward(T Matrix< complex<r_8> > const & in, TMatrix< complex<r_8> > & out);49 virtual void FFTBackward(T Matrix< complex<r_8> > const & in, TMatrix< complex<r_8> > & out);50 virtual void FFTForward(T Matrix< r_8 > const & in, TMatrix< complex<r_8> > & out);51 virtual void FFTBackward(T Matrix< complex<r_8> > const & in, TMatrix< r_8 > & out);47 // Transforme N-dim sur des doubles 48 virtual void FFTForward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out); 49 virtual void FFTBackward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out); 50 virtual void FFTForward(TArray< r_8 > const & in, TArray< complex<r_8> > & out); 51 virtual void FFTBackward(TArray< complex<r_8> > const & in, TArray< r_8 > & out); 52 52 53 // Transforme 2D sur des float 54 virtual void FFTForward(TMatrix< complex<r_4> > const & in, TMatrix< complex<r_4> > & out); 55 virtual void FFTBackward(TMatrix< complex<r_4> > const & in, TMatrix< complex<r_4> > & out); 56 virtual void FFTForward(TMatrix< r_4 > const & in, TMatrix< complex<r_4> > & out); 57 virtual void FFTBackward(TMatrix< complex<r_4> > const & in, TMatrix< r_4 > & out); 58 59 53 // Transforme N-dim sur des float 54 virtual void FFTForward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out); 55 virtual void FFTBackward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out); 56 virtual void FFTForward(TArray< r_4 > const & in, TArray< complex<r_4> > & out); 57 virtual void FFTBackward(TArray< complex<r_4> > const & in, TArray< r_4 > & out); 60 58 61 59 protected: … … 66 64 } // Fin du namespace 67 65 66 template <class T> 67 class FFTArrayChecker { 68 public: 69 FFTArrayChecker(bool checkpack=true, bool onedonly=false); 70 virtual ~FFTArrayChecker(); 71 virtual int CheckResize(TArray< complex<T> > const & in, TArray< complex<T> > & out); 72 virtual int CheckResize(TArray< T > const & in, TArray< complex<T> > & out); 73 virtual int CheckResize(TArray< complex<T> > const & in, TArray< T > & out); 74 virtual void ReShapetoReal(TArray< complex<T> > const & in, TArray< T > & out); 75 virtual void ReShapetoCompl(TArray< T > const & in, TArray< complex<T> > & out); 76 77 protected: 78 bool _checkpack; 79 bool _onedonly; 80 }; 81 68 82 #endif
Note:
See TracChangeset
for help on using the changeset viewer.