Changeset 717 in Sophya for trunk/SophyaLib/NTools/fftpserver.cc


Ignore:
Timestamp:
Feb 5, 2000, 6:22:55 PM (26 years ago)
Author:
ansari
Message:

Introduction FFTMayer, debug de FFTPack - Reza 5/2/2000

File:
1 edited

Legend:

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

    r710 r717  
    2626*/
    2727
    28 /*! \fn virtual void FFTServer::fftf(int l, float* inout)
     28/*! \fn virtual void FFTServer::fftf(int l, r_4* inout)
    2929  \param l length of array
    3030  \param inout input array /output forward FFT (original array destroyed)
    3131*/
    32 /*! \fn virtual void FFTServer::fftb(int l, float* inout)
     32/*! \fn virtual void FFTServer::fftb(int l, r_4* inout)
    3333  \param l length of array
    3434  \param inout input array /output backward FFT (original array destroyed)
    3535*/
    36 /*! \fn virtual void FFTServer::fftf(int l, double* inout)
     36/*! \fn virtual void FFTServer::fftf(int l, r_8* inout)
    3737  \param l length of array
    3838  \param inout input array /output forward FFT (original array destroyed)
    3939  \param inout input/output array (original array destroyed)
    4040*/
    41 /*! \fn virtual void FFTServer::fftb(int l, double* inout)
     41/*! \fn virtual void FFTServer::fftb(int l, r_8* inout)
    4242  \param l length of array
    4343  \param inout input array /output backward FFT(original array destroyed)
    4444*/
    45 /*!\fn  virtual void FFTServer::fftf(int l, complex<float>* inout)
     45/*!\fn  virtual void FFTServer::fftf(int l, complex<r_4>* inout)
    4646  \param l length of array
    4747  \param inout input array /output forward FFT (original array destroyed)
    4848*/
    49 /*! \fn virtual void FFTServer::fftb(int l, complex<float>* inout)
     49/*! \fn virtual void FFTServer::fftb(int l, complex<r_4>* inout)
    5050  \param l length of array
    5151  \param inout input array /output backward FFT (original array destroyed)
    5252*/
    53 /*! \fn virtual void FFTServer::fftf(int l, complex<double>* inout)
     53/*! \fn virtual void FFTServer::fftf(int l, complex<r_8>* inout)
    5454  \param l length of array
    5555  \param inout input array /output forward FFT (original array destroyed)
    5656*/
    57 /*! \fn virtual void FFTServer::fftb(int l, complex<double>* inout)
     57/*! \fn virtual void FFTServer::fftb(int l, complex<r_8>* inout)
    5858  \param l length of array
    5959  \param inout input array /output backward FFT(original array destroyed)
     
    6969
    7070FFTPackServer::FFTPackServer()
    71    : FFTServerInterface("FFTServer using FFTPack (C-version) package")
     71   : FFTServerInterface("FFTPackServer using extended FFTPack (C-version) package")
    7272
    7373{
     
    9292}
    9393
     94
    9495void FFTPackServer::FFTForward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out)
    9596{
    9697  out = in;
    9798  fftf(out.NElts(), out.Data());
     99  if (getNormalize()) out *= (1./(r_8)(in.NElts()));
    98100}
    99101
     
    104106}
    105107
     108
     109
    106110void FFTPackServer::FFTForward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out)
    107111{
    108112  out = in;
    109113  fftf(out.NElts(), out.Data());
     114  if (getNormalize()) out *= (1./(r_4)(in.NElts()));
    110115}
    111116
     
    121126  fftf(inout.NElts(), inout.Data());
    122127  ReShapetoCompl(inout, out);
     128  if (getNormalize()) out *= (1./(r_4)(in.NElts()));
    123129}
    124130
     
    128134  fftb(out.NElts(), out.Data());
    129135}
     136
    130137
    131138void FFTPackServer::FFTForward(TVector< r_8 > const & in, TVector< complex<r_8> > & out)
     
    134141  fftf(inout.NElts(), inout.Data());
    135142  ReShapetoCompl(inout, out);
     143  if (getNormalize()) out *= (1./(r_8)(in.NElts()));
    136144}
    137145
     
    142150}
    143151
     152 
    144153
    145154void FFTPackServer::checkint_rfft(int l)
     
    149158  if (ws_rfft) delete[] ws_rfft;  //a transform
    150159  sz_rfft = l;
    151   ws_rfft = new float[2*l+15];
     160  ws_rfft = new r_4[2*l+15];
    152161  rffti_(&l, ws_rfft);
    153162}
     
    159168  if (ws_cfft) delete[] ws_cfft;
    160169  sz_cfft = l;
    161   ws_cfft = new float[4*l+15];
     170  ws_cfft = new r_4[4*l+15];
    162171  cffti_(&l, ws_cfft);
    163172}
     
    169178  if (ws_dfft) delete[] ws_dfft;
    170179  sz_dfft = l;
    171   ws_dfft = new double[2*l+15];
     180  ws_dfft = new r_8[2*l+15];
    172181  dffti_(&l, ws_dfft);
    173182}
     
    179188  if (ws_cdfft) delete[] ws_cdfft;
    180189  sz_cdfft = l;
    181   ws_cdfft = new double[4*l+15];
     190  ws_cdfft = new r_8[4*l+15];
    182191  cdffti_(&l, ws_cdfft);
    183192}
     
    186195   return inverse transformations */
    187196
    188 void FFTPackServer::fftf(int l, float* inout)
     197void FFTPackServer::fftf(int l, r_4* inout)
    189198{
    190199  checkint_rfft(l);
    191200  rfftf_(&l, inout, ws_rfft);
    192   for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2];
    193 }
    194 
    195 void FFTPackServer::fftf(int l, double* inout)
     201  //  for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2];
     202}
     203
     204void FFTPackServer::fftf(int l, r_8* inout)
    196205{
    197206  checkint_dfft(l);
    198207  dfftf_(&l, inout, ws_dfft);
    199   for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2];
    200 }
    201 
    202 void FFTPackServer::fftf(int l, complex<float>* inout)
     208  //  for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2];
     209}
     210
     211void FFTPackServer::fftf(int l, complex<r_4>* inout)
    203212{
    204213  checkint_cfft(l);
    205   cfftf_(&l, (float *)(inout), ws_cfft);
    206 
    207   /*
    208   float* foo = new float[2*l];
    209   int i;
    210   for (i=0;i<l;i++){
    211     foo[2*i]=inout[i].real();
    212     foo[2*i+1]=inout[i].imag();
     214  cfftf_(&l, (r_4 *)(inout), ws_cfft);
     215}
     216
     217void FFTPackServer::fftf(int l, complex<r_8>* inout)
     218{
     219  checkint_cdfft(l);
     220  cdfftf_(&l, (r_8*)(inout), ws_cdfft);
     221}
     222
     223void FFTPackServer::fftb(int l, r_4* inout)
     224{
     225  checkint_rfft(l);
     226  rfftb_(&l, inout, ws_rfft);
     227}
     228
     229void FFTPackServer::fftb(int l, r_8* inout)
     230{
     231  checkint_dfft(l);
     232  dfftb_(&l, inout, ws_dfft);
     233}
     234
     235void FFTPackServer::fftb(int l, complex<r_4>* inout)
     236{
     237  checkint_cfft(l);
     238  cfftb_(&l, (r_4 *)(inout), ws_cfft);
     239}
     240
     241void FFTPackServer::fftb(int l, complex<r_8>* inout)
     242{
     243  checkint_cdfft(l);
     244  cdfftb_(&l, (r_8 *)(inout), ws_cdfft);
     245}
     246
     247// Methodes pour reordonner les donnees
     248
     249/* --Methode-- */
     250void FFTPackServer::ReShapetoReal( TVector< complex<r_8> > const & in, TVector< r_8 >  & out)
     251{
     252  int n = in.NElts();
     253  int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2;
     254  out.ReSize(ncs);
     255  int k;
     256  out(0) = in(0).real();
     257  for(k=1;k<n-1;k++) {
     258    out(2*k-1) = in(k).real();
     259    out(2*k) = in(k).imag();
    213260  }
    214   cfftf_(&l, foo, ws_cfft);
    215   inout[0]=complex<float> (foo[0],foo[1]);
    216   for (i=1;i<l;i++) inout[l-i]= complex<float> (foo[2*i], foo[2*i+1]);
    217   delete[] foo;
    218   */
    219 }
    220 
    221 void FFTPackServer::fftf(int l, complex<double>* inout)
    222 {
    223   checkint_cdfft(l);
    224   cdfftf_(&l, (double*)(inout), ws_cdfft);
    225   /*
    226   double* foo=new double[2*l];
    227   int i;
    228   for (i=0;i<l;i++){
    229     foo[2*i]=inout[i].real();
    230     foo[2*i+1]=inout[i].imag();
     261  if (ncs == n*2-2)  out(ncs-1) = in(n-1).real();
     262  else { out(ncs-2) = in(n-1).real();  out(ncs-1) = in(n-1).imag(); }
     263}
     264
     265/* --Methode-- */
     266void FFTPackServer::ReShapetoReal( TVector< complex<r_4> > const & in, TVector< r_4 >  & out)
     267{
     268  int n = in.NElts();
     269  int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2;
     270  out.ReSize(ncs);
     271  int k;
     272  out(0) = in(0).real();
     273  for(k=1;k<n-1;k++) {
     274    out(2*k-1) = in(k).real();
     275    out(2*k) = in(k).imag();
    231276  }
    232   cdfftf_(&l, foo, ws_cdfft);
    233   inout[0]=complex<double> (foo[0],foo[1]);
    234   for (i=1;i<l;i++) {
    235     inout[l-i]= complex<double> (foo[2*i],foo[2*i+1]);
    236   }
    237   delete[] foo;
    238   */
    239 }
    240 
    241 void FFTPackServer::fftb(int l, float* inout)
    242 {
    243   checkint_rfft(l);
    244   rfftf_(&l, inout, ws_rfft);
    245 }
    246 
    247 void FFTPackServer::fftb(int l, double* inout)
    248 {
    249   checkint_dfft(l);
    250   dfftf_(&l, inout, ws_dfft);
    251 }
    252 
    253 void FFTPackServer::fftb(int l, complex<float>* inout)
    254 {
    255   checkint_cfft(l);
    256   cfftb_(&l, (float *)(inout), ws_cfft);
    257   /*
    258   float* foo = new float[2*l];
    259   int i;
    260   for (i=0;i<l;i++){
    261     foo[2*i]=inout[i].real();
    262     foo[2*i+1]=inout[i].imag();
    263   }
    264   cfftf_(&l, foo, ws_cfft);
    265   for (i=0;i<l;i++) inout[i]=complex<float> (foo[2*i],foo[2*i+1]);
    266   delete[] foo;
    267   */
    268 }
    269 
    270 void FFTPackServer::fftb(int l, complex<double>* inout)
    271 {
    272   checkint_cdfft(l);
    273   cfftb_(&l, (float *)(inout), ws_cfft);
    274   /*
    275   double* foo = new double[2*l];
    276   int i;
    277   for (i=0;i<l;i++){
    278     foo[2*i]=inout[i].real();
    279     foo[2*i+1]=inout[i].imag();
    280   }
    281   cdfftf_(&l, foo, ws_cdfft);
    282   for (i=0;i<l;i++) inout[i]=complex<double> (foo[2*i],foo[2*i+1]);
    283   delete[] foo;
    284   */
    285 }
    286 
     277  if (ncs == n*2-2)  out(ncs-1) = in(n-1).real();
     278  else { out(ncs-2) = in(n-1).real();  out(ncs-1) = in(n-1).imag(); }
     279}
     280
     281
     282/* --Methode-- */
     283void FFTPackServer::ReShapetoCompl(TVector< r_8 > const & in, TVector< complex<r_8> > & out)
     284{
     285  uint_4 n =  in.NElts();
     286  uint_4 ncs = n/2+1;
     287  uint_4 nc = (n%2 != 0) ? n/2+1 : n/2;
     288  out.ReSize(ncs);
     289  out(0) = complex<r_8> (in(0),0.);
     290  int k;
     291  for(int k=1;k<nc;k++)
     292    out(k) =  complex<r_4> (in(2*k-1), in(2*k));
     293  if (n%2 == 0) out(ncs-1) = complex<r_8>(in(n-1), 0.);
     294
     295}
     296
     297/* --Methode-- */
     298void FFTPackServer::ReShapetoCompl(TVector< r_4 > const & in, TVector< complex<r_4> > & out)
     299{
     300  uint_4 n =  in.NElts();
     301  uint_4 ncs = n/2+1;
     302  uint_4 nc = (n%2 != 0) ? n/2+1 : n/2;
     303  out.ReSize(ncs);
     304  out(0) = complex<r_4> (in(0),0.);
     305  int k;
     306  for(int k=1;k<nc;k++)
     307    out(k) =  complex<r_4> (in(2*k-1), in(2*k));
     308  if (n%2 == 0) out(ncs-1) = complex<r_4>(in(n-1), 0.);
     309}
Note: See TracChangeset for help on using the changeset viewer.