Changeset 1390 in Sophya


Ignore:
Timestamp:
Feb 9, 2001, 6:08:57 PM (25 years ago)
Author:
ansari
Message:

Modifs interface FFTServer , Reza 9/2/2001

Location:
trunk/SophyaLib/NTools
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/cimage.cc

    r1159 r1390  
    99#include "cimage.h"
    1010
     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
    1121template <class T>
    1222Image<T>::Image()
     
    1828}
    1929
    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
     31template <class T>
     32Image<T>::Image(sa_size_t sizx, sa_size_t sizy, r_8 szpx, r_8 szpy, r_8 orgx, r_8 orgy)
    2233// Constructeur par defaut.
    2334  : TMatrix<T>(sizy, sizx)
     
    2738}
    2839
     40//! Copy constructor
    2941template <class T>
    3042Image<T>::Image(const Image<T>& a)
     
    3547}
    3648
     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*/
    3754template <class T>
    3855Image<T>::Image(const Image<T>& a, bool share)
     
    4259  SetPixelSize(a.XPixSize(), a.YPixSize());
    4360}
     61
     62//! Destructor
    4463template <class T>
    4564Image<T>::~Image()
  • trunk/SophyaLib/NTools/cimage.h

    r1204 r1390  
    1616namespace SOPHYA {
    1717
     18//! Class for handling images
    1819template <class T>
    1920class Image : public TMatrix<T> {
     
    2122public:
    2223  Image();
    23   Image(uint_4 sizx, uint_4 sizy, 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.);
    2425  Image(const Image<T>& a);
    2526  Image(const Image<T>& a, bool share);
     
    2829
    2930  // Inline element acces methods
    30   inline T const& operator()(uint_4 ix,uint_4 jy) const;
    31   inline T&       operator()(uint_4 ix,uint_4 jy);
     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);
    3233
    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();}
    3538
     39  //! Returns the X position, for pixel(0,0)
    3640  inline r_8     XOrg() const {return org_x;}
     41  //! Returns the Y position, for pixel(0,0)
    3742  inline r_8     YOrg() const {return org_y;}
    3843
     44  //! Returns pixel size along X
    3945  inline r_8     XPixSize() const {return pxsz_x;}
     46  //! Returns pixel size along Y
    4047  inline r_8     YPixSize() const {return pxsz_y;}
    4148
    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;}
    4453
     54  //! Set the position for pixel(0,0)
    4555  inline void    SetOrg(r_8 orgx=0., r_8 orgy=0.)
    4656                       { org_x = orgx;  org_y = orgy; } 
     57  //! Set the pixel size
    4758  inline void    SetPixelSize(r_8 szx=1., r_8 szy=1.)
    4859                       { pxsz_x = szx;   pxsz_y = szy; }
     
    5364};
    5465
     66//! () : Return the pixel value (element) for pixel \b ix (column index) and \b jy (line index)
    5567template <class T>
    56 inline T const& Image<T>::operator()(uint_4 ix, uint_4 jy) const
     68inline T const& Image<T>::operator()(sa_size_t ix, sa_size_t jy) const
    5769{
    5870  return (TMatrix<T>::operator() (jy, ix));
    5971}
    6072
     73//! () : Return the pixel value (element) for pixel \b ix (column index) and \b jy (line index)
    6174template <class T>
    62 inline T & Image<T>::operator()(uint_4 ix, uint_4 jy)
     75inline T & Image<T>::operator()(sa_size_t ix, sa_size_t jy)
    6376{
    6477  return (TMatrix<T>::operator() (jy, ix));
     
    8295};
    8396
    84 /*! \ingroup Image \fn operator<<(POutPersist&,Image<T>&)
     97/*! \ingroup NTools \fn operator<<(POutPersist&,Image<T>&)
    8598  \brief Write Image \b obj into POutPersist stream \b os */
    8699template <class T>
     
    88101{ FIO_Image<T> fio(&obj);  fio.Write(os);  return(os); }
    89102
    90 /*! \ingroup Image \fn operator>>(PInPersist&,Image<T>&)
     103/*! \ingroup NTools \fn operator>>(PInPersist&,Image<T>&)
    91104  \brief Read Image \b obj from PInPersist stream \b os */
    92105template <class T>
     
    102115
    103116class GeneralFit;
     117//! OBSOLETE - Should not be used - for compatibility with peida in (s)piapp
    104118class RzImage {
    105119public:
  • trunk/SophyaLib/NTools/fftpserver.cc

    r1371 r1390  
    2828FFTPackServer::FFTPackServer()
    2929   : FFTServerInterface("FFTPackServer using extended FFTPack (C-version) package")
    30 
     30  , ckR4(true, true) , ckR8(true, true)
    3131{
    3232//the working array and its size for the different
     
    5656
    5757
    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());
     58void 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
     66void 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
     75void 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
     83void 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
     90void 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
     99void 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
     107void 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
     116void 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());
    113121}
    114122
     
    208216}
    209217
    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  
    2323
    2424  // Transforme unidimensionnel sur des double
    25   virtual void FFTForward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out);
    26   virtual void FFTBackward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out);
    27   virtual void FFTForward(TVector< r_8 > const & in, TVector< complex<r_8> > & out);
    28   virtual void FFTBackward(TVector< 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);
    2929
    3030  // Transforme unidimensionnel sur des float
    31   virtual void FFTForward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out);
    32   virtual void FFTBackward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out);
    33   virtual void FFTForward(TVector< r_4 > const & in, TVector< complex<r_4> > & out);
    34   virtual void FFTBackward(TVector< 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);
    3535
    3636  //  Methodes propres a cette classe
     
    4343  virtual void fftf(int_4 l, complex<double>* inout);
    4444  virtual void fftb(int_4 l, complex<double>* inout);
    45 
    46 // Methodes statiques pour reordonner les donnees
    47   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);
    5245
    5346 protected:
     
    6861  int sz_cdfft;
    6962  r_8* ws_cdfft;
     63
     64  FFTArrayChecker<r_4> ckR4;
     65  FFTArrayChecker<r_8> ckR8;
    7066};
    7167
     
    7369
    7470
    75 
    76 
    7771#endif
  • trunk/SophyaLib/NTools/fftservintf.cc

    r1371 r1390  
    66  \ingroup NTools
    77  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.
    108*/
    119
     
    2220}
    2321
    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-- */
     25void FFTServerInterface::FFTForward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &)
     26{
     27  throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !");
     28}
     29
     30/* --Methode-- */
     31void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &)
     32{
     33  throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !");
     34}
     35
     36/* --Methode-- */
     37void FFTServerInterface::FFTForward(TArray< r_8 > const &, TArray< complex<r_8> > &)
     38{
     39  throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !");
     40}
     41
     42/* --Methode-- */
     43void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< r_8 > &)
     44{
     45  throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !");
    7046}
    7147
     
    7450
    7551/* --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 
     52void 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-- */
     58void 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-- */
     64void 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-- */
     70void 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-- */
     78template <class T>
     79FFTArrayChecker<T>::FFTArrayChecker(bool checkpack, bool onedonly)
     80{
     81  _checkpack = checkpack;
     82  _onedonly = onedonly;
     83}
     84
     85/* --Methode-- */
     86template <class T>
     87FFTArrayChecker<T>::~FFTArrayChecker()
     88{
     89}
     90
     91/* --Methode-- */
     92template <class T>
     93int 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-- */
     117template <class T>
     118int 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-- */
     142template <class T>
     143int 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-- */
     168template <class T>
     169void 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-- */
     186template <class T>
     187void 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)
     205template class FFTArrayChecker<r_4>;
     206template class FFTArrayChecker<r_8>;
     207#endif
  • trunk/SophyaLib/NTools/fftservintf.h

    r1371 r1390  
    4545
    4646  //---------------------------------------------------
    47   // Transforme 2D sur des doubles
    48   virtual void FFTForward(TMatrix< complex<r_8> > const & in, TMatrix< complex<r_8> > & out);
    49   virtual void FFTBackward(TMatrix< complex<r_8> > const & in, TMatrix< complex<r_8> > & out);
    50   virtual void FFTForward(TMatrix< r_8 > const & in, TMatrix< complex<r_8> > & out);
    51   virtual void FFTBackward(TMatrix< 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);
    5252
    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);
    6058
    6159 protected:
     
    6664} // Fin du namespace
    6765
     66template <class T>
     67class FFTArrayChecker {
     68public:
     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
     77protected:
     78  bool _checkpack;
     79  bool _onedonly;
     80};
     81
    6882#endif
Note: See TracChangeset for help on using the changeset viewer.