Xmipp  v3.23.11-Nereus
Classes | Macros | Functions
FFTW Fourier transforms
Collaboration diagram for FFTW Fourier transforms:

Classes

class  FourierTransformer
 
class  CorrelationAux
 

Macros

#define POWER_SPECTRUM   0
 
#define AMPLITUDE_SPECTRUM   1
 

Functions

void FFT_magnitude (const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
 
void FFT_phase (const MultidimArray< std::complex< double > > &v, MultidimArray< double > &phase)
 
void radial_magnitude (const MultidimArray< double > &v, MultidimArray< std::complex< double > > &V, MultidimArray< double > &radialMagnitude)
 
template<typename T >
void auto_correlation_vector (const MultidimArray< T > &Img, MultidimArray< double > &R)
 
template<typename T >
void correlation_vector (const MultidimArray< T > &m1, const MultidimArray< T > &m2, MultidimArray< double > &R)
 
void fast_correlation_vector (const MultidimArray< std::complex< double > > &FFT1, const MultidimArray< std::complex< double > > &FFT2, MultidimArray< double > &R, FourierTransformer &transformer)
 
template<class T >
void correlation_vector_no_Fourier (const MultidimArray< T > &v1, const MultidimArray< T > &v2, MultidimArray< T > &result)
 
void correlation_matrix (const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center=true)
 
void correlation_matrix (const MultidimArray< std::complex< double > > &FFT1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center=true)
 
void correlation_matrix (const MultidimArray< std::complex< double > > &FFT1, const MultidimArray< std::complex< double > > &FFT2, MultidimArray< double > &R, CorrelationAux &aux, bool center=true)
 
template<typename T >
void auto_correlation_matrix (const MultidimArray< T > &Img, MultidimArray< double > &R)
 
void auto_correlation_matrix (const MultidimArray< double > &Img, MultidimArray< double > &R, CorrelationAux &aux)
 
void convolutionFFTStack (const MultidimArray< double > &img, const MultidimArray< double > &kernel, MultidimArray< double > &result)
 
void convolutionFFT (MultidimArray< double > &img, MultidimArray< double > &kernel, MultidimArray< double > &result)
 
void frc_dpr (MultidimArray< double > &m1, MultidimArray< double > &m2, double sampling_rate, MultidimArray< double > &freq, MultidimArray< double > &frc, MultidimArray< double > &frc_noise, MultidimArray< double > &dpr, MultidimArray< double > &error_l2, bool skipdpr=false, bool doRfactor=false, double minFreq=-1, double maxFreq=0.5, double *rFactor=NULL)
 
void scaleToSizeFourier (int Zdim, int Ydim, int Xdim, MultidimArray< double > &mdaIn, MultidimArray< double > &mdaOut, int nThreads=1)
 
template<typename T >
void scaleToSizeFourier (MultidimArray< T > &mdaIn, MultidimArray< T > &mdaOut, MultidimArray< std::complex< T > > &inFourier, MultidimArray< std::complex< T > > &outFourier)
 
void selfScaleToSizeFourier (int Zdim, int Ydim, int Xdim, MultidimArray< double > &mda, int nthreads=1)
 
void selfScaleToSizeFourier (int Ydim, int Xdim, MultidimArray< double > &mda, int nthreads=1)
 
void selfScaleToSizeFourier (int Zdim, int Ydim, int Xdim, MultidimArrayGeneric &mda, int nthreads=1)
 
void selfScaleToSizeFourier (int Ydim, int Xdim, MultidimArrayGeneric &mda, int nthreads=1)
 
void getSpectrum (MultidimArray< double > &Min, MultidimArray< double > &spectrum, int spectrum_type=AMPLITUDE_SPECTRUM)
 
void divideBySpectrum (MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact=false)
 
void multiplyBySpectrum (MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact=false)
 
void whitenSpectrum (MultidimArray< double > &Min, MultidimArray< double > &Mout, int spectrum_type=AMPLITUDE_SPECTRUM, bool leave_origin_intact=false)
 
void adaptSpectrum (MultidimArray< double > &Min, MultidimArray< double > &Mout, const MultidimArray< double > &spectrum_ref, int spectrum_type=AMPLITUDE_SPECTRUM, bool leave_origin_intact=false)
 
void randomizePhases (MultidimArray< double > &Min, double wRandom)
 

Detailed Description

Macro Definition Documentation

◆ AMPLITUDE_SPECTRUM

#define AMPLITUDE_SPECTRUM   1

Definition at line 669 of file xmipp_fftw.h.

◆ POWER_SPECTRUM

#define POWER_SPECTRUM   0

Definition at line 668 of file xmipp_fftw.h.

Function Documentation

◆ adaptSpectrum()

void adaptSpectrum ( MultidimArray< double > &  Min,
MultidimArray< double > &  Mout,
const MultidimArray< double > &  spectrum_ref,
int  spectrum_type = AMPLITUDE_SPECTRUM,
bool  leave_origin_intact = false 
)

Adapts Min to have the same spectrum as spectrum_ref

If only_amplitudes==true, the amplitude rather than the power spectrum will be equalized

Definition at line 849 of file xmipp_fftw.cpp.

854 {
855 
856  Min.checkDimension(3);
857 
858  MultidimArray<double> spectrum;
859  getSpectrum(Min,spectrum,spectrum_type);
861  {
862  dAi(spectrum, i) = (dAi(spectrum, i) > 0.) ? dAi(spectrum_ref,i)/ dAi(spectrum, i) : 1.;
863  }
864  Mout=Min;
865  multiplyBySpectrum(Mout,spectrum,leave_origin_intact);
866 
867 }
#define dAi(v, i)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
#define i
void getSpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, int spectrum_type)
Definition: xmipp_fftw.cpp:752
void multiplyBySpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact)
Definition: xmipp_fftw.cpp:806

◆ auto_correlation_matrix() [1/2]

template<typename T >
void auto_correlation_matrix ( const MultidimArray< T > &  Img,
MultidimArray< double > &  R 
)

Autocorrelation function of an image

Fast calcuation of the autocorrelation matrix of a given one using Fast Fourier Transform. (Using the correlation theorem)

Definition at line 594 of file xmipp_fftw.h.

595 {
596  // Compute the Fourier Transform
598  FourierTransformer transformer1;
599  R=Img;
600  transformer1.FourierTransform(R, FFT1, false);
601 
602  // Multiply FFT1 * FFT1'
603  double dSize=MULTIDIM_SIZE(Img);
605  {
606  double *ptr=(double*)&DIRECT_MULTIDIM_ELEM(FFT1,n);
607  double &realPart=*ptr;
608  double &imagPart=*(ptr+1);
609  realPart=dSize*(realPart*realPart+imagPart*imagPart);
610  imagPart=0;
611  }
612 
613  // Invert the product, in order to obtain the correlation image
614  transformer1.inverseFourierTransform();
615 
616  // Center the resulting image to obtain a centered autocorrelation
617  CenterFFT(R, true);
618 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define MULTIDIM_SIZE(v)
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
int * n

◆ auto_correlation_matrix() [2/2]

void auto_correlation_matrix ( const MultidimArray< double > &  Img,
MultidimArray< double > &  R,
CorrelationAux aux 
)

Fast autocorrelation matrix

Definition at line 957 of file xmipp_fftw.cpp.

958 {
959  // Compute the Fourier Transform
960  R=Img;
961  aux.transformer1.FourierTransform(R, aux.FFT1, false);
962 
963  // Multiply FFT1 * FFT1'
964  double dSize=MULTIDIM_SIZE(Img);
966  {
967  double *ptr=(double*)&DIRECT_MULTIDIM_ELEM(aux.FFT1,n);
968  double &realPart=*ptr;
969  double &imagPart=*(ptr+1);
970  realPart=dSize*(realPart*realPart+imagPart*imagPart);
971  imagPart=0;
972  }
973 
974  // Invert the product, in order to obtain the correlation image
976 
977  // Center the resulting image to obtain a centered autocorrelation
978  CenterFFT(R, true);
979 }
FourierTransformer transformer1
Definition: xmipp_fftw.h:555
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define MULTIDIM_SIZE(v)
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
MultidimArray< std::complex< double > > FFT1
Definition: xmipp_fftw.h:554
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
int * n

◆ auto_correlation_vector()

template<typename T >
void auto_correlation_vector ( const MultidimArray< T > &  Img,
MultidimArray< double > &  R 
)

Autocorrelation function of a Xmipp vector

Fast calculation of the autocorrelation vector of a given one using Fast Fourier Transform. (Using the correlation theorem)

Definition at line 452 of file xmipp_fftw.h.

453 {
454  Img.checkDimension(1);
455 
456  // Compute the Fourier Transform
458  FourierTransformer transformer1;
459  R=Img;
460  transformer1.FourierTransform(R, FFT1, false);
461 
462  // Multiply FFT1 * FFT1'
463  double dSize=XSIZE(Img);
465  {
466  double *ptr=(double*)&DIRECT_MULTIDIM_ELEM(FFT1,n);
467  double &realPart=*ptr;
468  double &imagPart=*(ptr+1);
469  realPart=dSize*(realPart*realPart+imagPart*imagPart);
470  imagPart=0;
471  }
472 
473  // Invert the product, in order to obtain the correlation image
474  transformer1.inverseFourierTransform();
475 
476  // Center the resulting image to obtain a centered autocorrelation
477  CenterFFT(R, true);
478 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define XSIZE(v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
int * n

◆ convolutionFFT()

void convolutionFFT ( MultidimArray< double > &  img,
MultidimArray< double > &  kernel,
MultidimArray< double > &  result 
)

Definition at line 457 of file xmipp_fftw.cpp.

460 {
461  FourierTransformer transformer1, transformer2;
463  transformer1.FourierTransform(img, FFT1, false);
464  result=kernel;
465  transformer2.FourierTransform(result, FFT2, false);
466 
467  // Multiply FFT1 * FFT2'
468  double dSize=MULTIDIM_SIZE(img);
469  double a, b, c, d; // a+bi, c+di
470  double *ptrFFT2=(double*)MULTIDIM_ARRAY(FFT2);
471  double *ptrFFT1=(double*)MULTIDIM_ARRAY(FFT1);
473  {
474  a=*ptrFFT1++;
475  b=*ptrFFT1++;
476  c=(*ptrFFT2)*dSize;
477  d=(*(ptrFFT2+1))*dSize;
478  *ptrFFT2++ = a*c-b*d;
479  *ptrFFT2++ = b*c+a*d;
480  }
481 
482  // Invert the product, in order to obtain the correlation image
483  transformer2.inverseFourierTransform();
484 
485  // Center the resulting image to compensate for phase shift
486  CenterFFT(result, false);
487 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
doublereal * c
#define MULTIDIM_SIZE(v)
#define MULTIDIM_ARRAY(v)
doublereal * d
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
doublereal * b
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
doublereal * a

◆ convolutionFFTStack()

void convolutionFFTStack ( const MultidimArray< double > &  img,
const MultidimArray< double > &  kernel,
MultidimArray< double > &  result 
)

Definition at line 429 of file xmipp_fftw.cpp.

432 {
433  if (&result != &img)
434  result = img;
435 
436  MultidimArray<double> imgTemp;
438  FourierTransformer transformer1(FFTW_BACKWARD), transformer2(FFTW_BACKWARD);
439 
440  transformer2.FourierTransform((MultidimArray<double> &)kernel, FFTK, false);
441 
442  for (size_t n = 0; n < ZSIZE(result); n++)
443  {
444  imgTemp.aliasSlice(result, n);
445  transformer1.FourierTransform(imgTemp, FFTIm, false);
446 
449 
450  transformer1.inverseFourierTransform();
451 
452  CenterFFT(imgTemp, false);
453  }
454 
455 }
void aliasSlice(const MultidimArray< T > &m, size_t select_slice)
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define ZSIZE(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ correlation_matrix() [1/3]

void correlation_matrix ( const MultidimArray< double > &  m1,
const MultidimArray< double > &  m2,
MultidimArray< double > &  R,
CorrelationAux aux,
bool  center = true 
)

Correlation of two nD images

Fast calcuation of the correlation matrix on two matrices using Fast Fourier Transform. (Using the correlation theorem). The output matrix must be already resized

Definition at line 869 of file xmipp_fftw.cpp.

874 {
876  correlation_matrix(aux.FFT1,m2,R,aux,center);
877 }
FourierTransformer transformer1
Definition: xmipp_fftw.h:555
void correlation_matrix(const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center)
Definition: xmipp_fftw.cpp:869
MultidimArray< std::complex< double > > FFT1
Definition: xmipp_fftw.h:554
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166

◆ correlation_matrix() [2/3]

void correlation_matrix ( const MultidimArray< std::complex< double > > &  FFT1,
const MultidimArray< double > &  m2,
MultidimArray< double > &  R,
CorrelationAux aux,
bool  center = true 
)

Definition at line 898 of file xmipp_fftw.cpp.

903 {
904  R=m2;
905  aux.transformer2.FourierTransform(R, aux.FFT2, false);
908  if (center)
909  CenterFFT(R, true);
910 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define MULTIDIM_SIZE(v)
void correlationInFourier(const MultidimArray< std::complex< double > > &FF1, MultidimArray< std::complex< double > > &FF2, double dSize)
Definition: xmipp_fftw.cpp:879
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
MultidimArray< std::complex< double > > FFT2
Definition: xmipp_fftw.h:554
FourierTransformer transformer2
Definition: xmipp_fftw.h:555

◆ correlation_matrix() [3/3]

void correlation_matrix ( const MultidimArray< std::complex< double > > &  FFT1,
const MultidimArray< std::complex< double > > &  FFT2,
MultidimArray< double > &  R,
CorrelationAux aux,
bool  center = true 
)

Correlation matrix. R must already be with the right size.

Definition at line 912 of file xmipp_fftw.cpp.

917 {
918  aux.transformer2.setReal(R);
919  aux.transformer2.setFourier(FFT2);
922  if (center)
923  CenterFFT(R, true);
924 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define MULTIDIM_SIZE(v)
MultidimArray< std::complex< double > > fFourier
Definition: xmipp_fftw.h:70
void correlationInFourier(const MultidimArray< std::complex< double > > &FF1, MultidimArray< std::complex< double > > &FF2, double dSize)
Definition: xmipp_fftw.cpp:879
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
void setReal(MultidimArray< double > &img)
Definition: xmipp_fftw.cpp:129
void setFourier(const MultidimArray< std::complex< double > > &imgFourier)
Definition: xmipp_fftw.cpp:249
FourierTransformer transformer2
Definition: xmipp_fftw.h:555

◆ correlation_vector()

template<typename T >
void correlation_vector ( const MultidimArray< T > &  m1,
const MultidimArray< T > &  m2,
MultidimArray< double > &  R 
)

Autocorrelation function of a Xmipp vector

Fast calcuation of the correlation matrix on two matrices using Fast Fourier Transform. (Using the correlation theorem). The output matrix must be already resized

Definition at line 488 of file xmipp_fftw.h.

491 {
492  m1.checkDimension(2);
493  m2.checkDimension(2);
494 
495  // Compute the Fourier Transforms
497  FourierTransformer transformer1, transformer2;
498  R=m1;
499  transformer1.FourierTransform(R, FFT1, false);
500  transformer2.FourierTransform((MultidimArray<T> &)m2, FFT2, false);
501 
502  // Multiply FFT1 * FFT2'
503  double dSize=XSIZE(m1);
505  FFT1(i) *= dSize * conj(FFT2(i));
506 
507  // Invert the product, in order to obtain the correlation image
508  transformer1.inverseFourierTransform();
509 
510  // Center the resulting image to obtain a centered autocorrelation
511  CenterFFT(R, true);
512 }
alglib::complex conj(const alglib::complex &z)
Definition: ap.cpp:4988
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define i
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define XSIZE(v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)

◆ correlation_vector_no_Fourier()

template<class T >
void correlation_vector_no_Fourier ( const MultidimArray< T > &  v1,
const MultidimArray< T > &  v2,
MultidimArray< T > &  result 
)

Compute the correlation vector without using Fourier.

The results are the same as the previous ones but this function is threadsafe while the previous one is not.

It is assumed that the two vectors v1, and v2 are of the same size.

Definition at line 534 of file xmipp_fftw.h.

536 {
537  v1.checkDimension(1);
538  v2.checkDimension(1);
539 
540  result.initZeros(v1);
541  result.setXmippOrigin();
542  int N=XSIZE(v1)-1;
544  for (int k=0; k<XSIZE(v1); ++k)
545  A1D_ELEM(result,i)+=DIRECT_A1D_ELEM(v1,intWRAP(k+i,0,N))*
546  DIRECT_A1D_ELEM(v2,k);
547  STARTINGX(result)=0;
548 }
#define A1D_ELEM(v, i)
#define STARTINGX(v)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
#define XSIZE(v)
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)
void initZeros(const MultidimArray< T1 > &op)
#define intWRAP(x, x0, xF)
Definition: xmipp_macros.h:272

◆ divideBySpectrum()

void divideBySpectrum ( MultidimArray< double > &  Min,
MultidimArray< double > &  spectrum,
bool  leave_origin_intact = false 
)

Divide the input map in Fourier-space by the spectrum provided.

If leave_origin_intact==true, the origin pixel will remain untouched

Definition at line 788 of file xmipp_fftw.cpp.

791 {
792 
793  Min.checkDimension(3);
794 
795  MultidimArray<double> div_spec(spectrum);
797  {
798  if (ABS(dAi(spectrum,i)) > 0.)
799  dAi(div_spec,i) = 1./dAi(spectrum,i);
800  else
801  dAi(div_spec,i) = 1.;
802  }
803  multiplyBySpectrum(Min,div_spec,leave_origin_intact);
804 }
#define dAi(v, i)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
#define i
void multiplyBySpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact)
Definition: xmipp_fftw.cpp:806
#define ABS(x)
Definition: xmipp_macros.h:142

◆ fast_correlation_vector()

void fast_correlation_vector ( const MultidimArray< std::complex< double > > &  FFT1,
const MultidimArray< std::complex< double > > &  FFT2,
MultidimArray< double > &  R,
FourierTransformer transformer 
)

Autocorrelation function of a Xmipp vector

Same as correlation_vector, but the Fourier transforms have already been computed and the transformer is reused. The transformer internal variables must have already been resized.

Definition at line 926 of file xmipp_fftw.cpp.

930 {
931  transformer.setFourier(FFT1);
932 
933  // Multiply FFT1 * FFT2'
934  double a, b, c, d; // a+bi, c+di
935  double *ptrFFT2=(double*)MULTIDIM_ARRAY(FFT2);
936  double *ptrFFT1=(double*)&(A1D_ELEM(transformer.fFourier,0));
938  {
939  a=*ptrFFT1;
940  b=*(ptrFFT1+1);
941  c=(*ptrFFT2++);
942  d=(*ptrFFT2++)*(-1);
943  *ptrFFT1++ = a*c-b*d;
944  *ptrFFT1++ = b*c+a*d;
945  }
946 
947  // Invert the product, in order to obtain the correlation image
948  transformer.inverseFourierTransform();
949 
950  // Center the resulting image to obtain a centered autocorrelation
951  R=*transformer.fReal;
952  CenterFFT(R, true);
953  R.setXmippOrigin();
954 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
doublereal * c
MultidimArray< std::complex< double > > fFourier
Definition: xmipp_fftw.h:70
#define A1D_ELEM(v, i)
#define MULTIDIM_ARRAY(v)
doublereal * d
MultidimArray< double > * fReal
Definition: xmipp_fftw.h:64
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
doublereal * b
void setFourier(const MultidimArray< std::complex< double > > &imgFourier)
Definition: xmipp_fftw.cpp:249
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
doublereal * a

◆ FFT_magnitude()

void FFT_magnitude ( const MultidimArray< std::complex< double > > &  v,
MultidimArray< double > &  mag 
)

FFT Magnitude 1D

Definition at line 393 of file xmipp_fftw.cpp.

395 {
396  mag.resizeNoCopy(v);
397  double * ptrv=(double *)MULTIDIM_ARRAY(v);
399  {
400  double re=*ptrv;
401  double im=*(ptrv+1);
402  DIRECT_MULTIDIM_ELEM(mag, n) = sqrt(re*re+im*im);
403  ptrv+=2;
404  }
405 }
void resizeNoCopy(const MultidimArray< T1 > &v)
void sqrt(Image< double > &op)
#define MULTIDIM_ARRAY(v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ FFT_phase()

void FFT_phase ( const MultidimArray< std::complex< double > > &  v,
MultidimArray< double > &  phase 
)

FFT Phase 1D

Definition at line 408 of file xmipp_fftw.cpp.

410 {
411  phase.resizeNoCopy(v);
413  DIRECT_MULTIDIM_ELEM(phase, n) = atan2(DIRECT_MULTIDIM_ELEM(v,n).imag(), DIRECT_MULTIDIM_ELEM(v, n).real());
414 }
void resizeNoCopy(const MultidimArray< T1 > &v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ frc_dpr()

void frc_dpr ( MultidimArray< double > &  m1,
MultidimArray< double > &  m2,
double  sampling_rate,
MultidimArray< double > &  freq,
MultidimArray< double > &  frc,
MultidimArray< double > &  frc_noise,
MultidimArray< double > &  dpr,
MultidimArray< double > &  error_l2,
bool  skipdpr = false,
bool  doRfactor = false,
double  minFreq = -1,
double  maxFreq = 0.5,
double *  rFactor = NULL 
)

Fourier-Ring-Correlation between two multidimArrays using FFT

Definition at line 491 of file xmipp_fftw.cpp.

504 {
505  if (!m1.sameShape(m2))
506  REPORT_ERROR(ERR_MULTIDIM_SIZE,"MultidimArrays have different shapes!");
507 
508  int m1sizeX = XSIZE(m1), m1sizeY = YSIZE(m1), m1sizeZ = ZSIZE(m1);
509 
511  FourierTransformer transformer1(FFTW_BACKWARD);
512  transformer1.FourierTransform(m1, FT1, false);
513 
514 //#define DEBUG
515 #ifdef DEBUG
516  std::cerr << "FT1" << FT1 << std::endl;
517 #endif
518 #undef DEBUG
519 
520 
521  m1.clear(); // Free memory
522 
524  FourierTransformer transformer2(FFTW_BACKWARD);
525  transformer2.FourierTransform(m2, FT2, false);
526  m2.clear(); // Free memory
527 
528  MultidimArray< int > radial_count(m1sizeX/2+1);
529  MultidimArray<double> num, den1, den2, den_dpr;
530  Matrix1D<double> f(3);
531  //to calculate r-factor
532  double rFactorNumerator=0;
533  double rFactorDenominator=0;
534 
535 
536  num.initZeros(radial_count);
537  den1.initZeros(radial_count);
538  den2.initZeros(radial_count);
539 
540  //dpr calculation takes for ever in large volumes
541  //since atan2 is called many times
542  //until atan2 is changed by a table let us make dpr an option
543  if (dodpr)
544  {
545  dpr.initZeros(radial_count);
546  den_dpr.initZeros(radial_count);
547  }
548  freq.initZeros(radial_count);
549  frc.initZeros(radial_count);
550  frc_noise.initZeros(radial_count);
551  error_l2.initZeros(radial_count);
552 #ifdef SAVE_REAL_PART
553 
554  std::vector<double> *realPart=
555  new std::vector<double>[XSIZE(radial_count)];
556 #endif
557 
558  int sizeZ_2 = m1sizeZ/2;
559  if (sizeZ_2==0)
560  sizeZ_2=1;
561  double isizeZ = 1.0/m1sizeZ;
562  int sizeY_2 = m1sizeY/2;
563  double iysize = 1.0/m1sizeY;
564  int sizeX_2 = m1sizeX/2;
565  double ixsize = 1.0/m1sizeX;
566  double R;
567 
568  int ZdimFT1=(int)ZSIZE(FT1);
569  int YdimFT1=(int)YSIZE(FT1);
570  int XdimFT1=(int)XSIZE(FT1);
571 
572  double maxFreq_2 =0.;
573  maxFreq_2 = maxFreq * maxFreq;
574  for (int k=0; k<ZdimFT1; k++)
575  {
576  FFT_IDX2DIGFREQ_FAST(k,m1sizeZ,sizeZ_2,isizeZ,ZZ(f));
577  double fz2=ZZ(f)*ZZ(f);
578  for (int i=0; i<YdimFT1; i++)
579  {
580  FFT_IDX2DIGFREQ_FAST(i,YSIZE(m1),sizeY_2, iysize, YY(f));
581  double fz2_fy2=fz2 + YY(f)*YY(f);
582  for (int j=0; j<XdimFT1; j++)
583  {
584  FFT_IDX2DIGFREQ_FAST(j,m1sizeX, sizeX_2, ixsize, XX(f));
585 
586  double R2 =fz2_fy2 + XX(f)*XX(f);
587  if (R2>maxFreq_2)
588  continue;
589 
590  R = sqrt(R2);
591  int idx = (int)round(R * m1sizeX);
592  std::complex<double> &z1 = dAkij(FT1, k, i, j);
593  std::complex<double> &z2 = dAkij(FT2, k, i, j);
594  double absz1 = abs(z1);
595  double absz2 = abs(z2);
596  dAi(num,idx) += real(conj(z1) * z2);
597  dAi(den1,idx) += absz1*absz1;
598  dAi(den2,idx) += absz2*absz2;
599  dAi(error_l2,idx) += abs(z1-z2);
600  //for calculating r-factor
601  if ( R > minFreq && R < maxFreq)
602  {
603  rFactorNumerator += fabs(absz1 - absz2);
604  rFactorDenominator += absz1;
605  }
606 
607  if (dodpr) //this takes to long for a huge volume
608  {
609  double phaseDiff=atan2(z1.imag(),z1.real()) - atan2(z2.imag(),z2.real());
610  phaseDiff = RAD2DEG(phaseDiff);
611  phaseDiff = realWRAP(phaseDiff,-180, 180);
612  dAi(dpr,idx) += ((absz1+absz2)*phaseDiff*phaseDiff);
613  dAi(den_dpr,idx) += (absz1+absz2);
614 #ifdef SAVE_REAL_PART
615 
616  realPart[idx].push_back(z1.real());
617 #endif
618 
619  }
620  dAi(radial_count,idx)++;
621  }
622  }
623  }
624  //to calculate r-factor
625  if (doRfactor)
626  {
627  //std::cout << "rFactorNumerator = " << rFactorNumerator << std::endl;
628  //std::cout << "rFactorDenominator = " << rFactorDenominator << std::endl;
629  *rFactor = rFactorNumerator / rFactorDenominator;
630 
631  //std::cout << "R-factor = " << rFactorValue << std::endl;
632  //*rFactor = rFactorValue;
633  //std::cout << "R-rFactor = " << *rFactor << std::endl;
634  }
635 
637  {
638  dAi(freq,i) = (double) i / (m1sizeX * sampling_rate);
639  dAi(frc,i) = dAi(num,i)/sqrt(dAi(den1,i)*dAi(den2,i));
640  dAi(frc_noise,i) = 2 / sqrt((double) dAi(radial_count,i));
641  dAi(error_l2,i) /= dAi(radial_count,i);
642 
643  if (dodpr)
644  dAi(dpr,i) = sqrt(dAi(dpr,i) / dAi(den_dpr,i));
645 #ifdef SAVE_REAL_PART
646 
647  std::ofstream fhOut;
648  fhOut.open(((std::string)"PPP_RealPart_"+integerToString(i)+".txt").
649  c_str());
650  for (int j=0; j<realPart[i].size(); j++)
651  fhOut << realPart[i][j] << std::endl;
652  fhOut.close();
653 #endif
654 
655  }
656 }
#define dAi(v, i)
#define YSIZE(v)
alglib::complex conj(const alglib::complex &z)
Definition: ap.cpp:4988
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
void sqrt(Image< double > &op)
void abs(Image< double > &op)
String integerToString(int I, int _width, char fill_with)
Incorrect MultidimArray size.
Definition: xmipp_error.h:174
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
Definition: xmipp_fft.h:54
#define XX(v)
Definition: matrix1d.h:85
double * f
bool sameShape(const MultidimArrayBase &op) const
#define XSIZE(v)
#define dAkij(V, k, i, j)
#define ZSIZE(v)
#define j
#define YY(v)
Definition: matrix1d.h:93
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)
int round(double x)
Definition: ap.cpp:7245
#define RAD2DEG(r)
Definition: xmipp_macros.h:320
#define realWRAP(x, x0, xF)
Definition: xmipp_macros.h:304
void initZeros(const MultidimArray< T1 > &op)
#define ZZ(v)
Definition: matrix1d.h:101

◆ getSpectrum()

void getSpectrum ( MultidimArray< double > &  Min,
MultidimArray< double > &  spectrum,
int  spectrum_type = AMPLITUDE_SPECTRUM 
)

Get the amplitude or power spectrum of the map in Fourier space.

i.e. the radial average of the (squared) amplitudes of all Fourier components

Definition at line 752 of file xmipp_fftw.cpp.

755 {
757  int xsize = XSIZE(Min);
758  Matrix1D<double> f(3);
759  MultidimArray<double> count(xsize);
760  FourierTransformer transformer;
761 
762  spectrum.initZeros(xsize);
763  count.initZeros();
764  transformer.FourierTransform(Min, Faux, false);
765  if (ZSIZE(Faux)==1)
766  ZZ(f)=0;
768  {
769  FFT_IDX2DIGFREQ(j,xsize,XX(f));
770  FFT_IDX2DIGFREQ(i,YSIZE(Faux),YY(f));
771  if (ZSIZE(Faux)>1)
772  FFT_IDX2DIGFREQ(k,ZSIZE(Faux),ZZ(f));
773  double R=f.module();
774  //if (R>0.5) continue;
775  int idx = round(R*xsize);
776  double F=abs(dAkij(Faux, k, i, j));
777  if (spectrum_type == AMPLITUDE_SPECTRUM)
778  A1D_ELEM(spectrum,idx) += F;
779  else
780  A1D_ELEM(spectrum,idx) += F*F;
781  A1D_ELEM(count,idx) += 1.;
782  }
783  for (int i = 0; i < xsize; i++)
784  if (A1D_ELEM(count,i) > 0.)
785  A1D_ELEM(spectrum,i) /= A1D_ELEM(count,i);
786 }
#define YSIZE(v)
#define A1D_ELEM(v, i)
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define XX(v)
Definition: matrix1d.h:85
double * f
#define XSIZE(v)
#define dAkij(V, k, i, j)
#define ZSIZE(v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
#define j
#define YY(v)
Definition: matrix1d.h:93
int round(double x)
Definition: ap.cpp:7245
#define AMPLITUDE_SPECTRUM
Definition: xmipp_fftw.h:669
void initZeros(const MultidimArray< T1 > &op)
#define ZZ(v)
Definition: matrix1d.h:101

◆ multiplyBySpectrum()

void multiplyBySpectrum ( MultidimArray< double > &  Min,
MultidimArray< double > &  spectrum,
bool  leave_origin_intact = false 
)

Multiply the input map in Fourier-space by the spectrum provided.

If leave_origin_intact==true, the origin pixel will remain untouched

Definition at line 806 of file xmipp_fftw.cpp.

809 {
810  Min.checkDimension(3);
811 
813  Matrix1D<double> f(3);
814  MultidimArray<double> lspectrum;
815  FourierTransformer transformer;
816  double dim3 = XSIZE(Min)*YSIZE(Min)*ZSIZE(Min);
817 
818  transformer.FourierTransform(Min, Faux, false);
819  lspectrum=spectrum;
820  if (leave_origin_intact)
821  lspectrum(0)=1.;
823  {
824  FFT_IDX2DIGFREQ(j,XSIZE(Min), XX(f));
825  FFT_IDX2DIGFREQ(i,YSIZE(Faux),YY(f));
826  FFT_IDX2DIGFREQ(k,ZSIZE(Faux),ZZ(f));
827  double R=f.module();
828  //if (R > 0.5) continue;
829  int idx=ROUND(R*XSIZE(Min));
830  dAkij(Faux, k, i, j) *= lspectrum(idx) * dim3;
831  }
832  transformer.inverseFourierTransform();
833 }
#define YSIZE(v)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define XX(v)
Definition: matrix1d.h:85
double * f
#define XSIZE(v)
#define dAkij(V, k, i, j)
#define ZSIZE(v)
#define ROUND(x)
Definition: xmipp_macros.h:210
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
#define j
#define YY(v)
Definition: matrix1d.h:93
#define ZZ(v)
Definition: matrix1d.h:101

◆ radial_magnitude()

void radial_magnitude ( const MultidimArray< double > &  v,
MultidimArray< std::complex< double > > &  V,
MultidimArray< double > &  radialMagnitude 
)

FFT Radial average. This function computes the Fourier transform (in a relatively inefficient way), the amplitude and radial average of the input image. This is primarily meant for debugging. It also returns the Fourier transform just in case it might be useful outside.

Definition at line 416 of file xmipp_fftw.cpp.

418 {
419  FourierTransform(v,V);
421  FFT_magnitude(V,Vmag);
422  CenterFFT(Vmag,true);
423  Vmag.setXmippOrigin();
424  MultidimArray<int> radialCount;
425  Matrix1D<int> center(3);
426  radialAverage(Vmag,center,radialMagnitude,radialCount);
427 }
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
void radialAverage(const MultidimArray< double > &VolFourierMag, const MultidimArray< double > &V, MultidimArray< double > &radial_mean)
void FourierTransform(const MultidimArray< double > &in, MultidimArray< std::complex< double > > &out)
Definition: xmipp_fft.cpp:124
void FFT_magnitude(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
Definition: xmipp_fftw.cpp:393

◆ randomizePhases()

void randomizePhases ( MultidimArray< double > &  Min,
double  wRandom 
)

Randomize phases beyond a certain frequency

Definition at line 981 of file xmipp_fftw.cpp.

982 {
983  FourierTransformer transformer;
985  transformer.FourierTransform(Min,F,false);
986 
987  Matrix1D<double> f(3);
989  {
990  FFT_IDX2DIGFREQ(j,XSIZE(Min), XX(f));
991  FFT_IDX2DIGFREQ(i,YSIZE(F),YY(f));
992  FFT_IDX2DIGFREQ(k,ZSIZE(F),ZZ(f));
993  double w=f.module();
994  if (w > wRandom)
995  {
996  double alpha=rnd_unif(0,2*PI);
997  double c,s;
998  //sincos(alpha,&s,&c);
999  s = sin(alpha);
1000  c = cos(alpha);
1001 
1002  DIRECT_A3D_ELEM(F,k,i,j)*=std::complex<double>(s,c);
1003  }
1004  }
1005  transformer.inverseFourierTransform();
1006 }
#define YSIZE(v)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
doublereal * c
doublereal * w
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
double rnd_unif()
#define XX(v)
Definition: matrix1d.h:85
double * f
#define XSIZE(v)
#define ZSIZE(v)
#define DIRECT_A3D_ELEM(v, k, i, j)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
#define j
#define YY(v)
Definition: matrix1d.h:93
#define PI
Definition: tools.h:43
#define ZZ(v)
Definition: matrix1d.h:101

◆ scaleToSizeFourier() [1/2]

void scaleToSizeFourier ( int  Zdim,
int  Ydim,
int  Xdim,
MultidimArray< double > &  mdaIn,
MultidimArray< double > &  mdaOut,
int  nThreads = 1 
)

Scale matrix using Fourier transform

Ydim and Xdim define the output size, mda is the MultidimArray to scale

Definition at line 658 of file xmipp_fftw.cpp.

659 {
660  //Mmem = *this
661  //memory for fourier transform output
663  // Perform the Fourier transform
664  FourierTransformer transformerM;
665  transformerM.setThreadsNumber(nThreads);
666  transformerM.FourierTransform(mdaIn, MmemFourier, false);
667 
668  // Create space for the downsampled image and its Fourier transform
669  mdaOut.resizeNoCopy(Zdim, Ydim, Xdim);
670  MultidimArray<std::complex<double> > MpmemFourier;
671  FourierTransformer transformerMp;
672  transformerMp.setReal(mdaOut);
673  transformerMp.getFourierAlias(MpmemFourier);
674 
675  scaleToSizeFourier(mdaIn, mdaOut, MmemFourier, MpmemFourier);
676 
677  // Transform data
678  transformerMp.inverseFourierTransform();
679 }
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
void setThreadsNumber(int tNumber)
Definition: xmipp_fftw.h:119
void resizeNoCopy(const MultidimArray< T1 > &v)
void setReal(MultidimArray< double > &img)
Definition: xmipp_fftw.cpp:129
void scaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mdaIn, MultidimArray< double > &mdaOut, int nThreads)
Definition: xmipp_fftw.cpp:658
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
void getFourierAlias(T &V)
Definition: xmipp_fftw.h:207

◆ scaleToSizeFourier() [2/2]

template<typename T >
void scaleToSizeFourier ( MultidimArray< T > &  mdaIn,
MultidimArray< T > &  mdaOut,
MultidimArray< std::complex< T > > &  inFourier,
MultidimArray< std::complex< T > > &  outFourier 
)

Scale Fourier transform mdaIn and mdaOut define the sizes of the respective image, inFourier is transform to be scaled

Definition at line 685 of file xmipp_fftw.cpp.

686  {
687  size_t xsize = std::min(XSIZE(inFourier),XSIZE(outFourier))*sizeof(std::complex<T>);
688  size_t yhalf = std::min(std::min(YSIZE(mdaIn)/2,YSIZE(mdaOut)/2),YSIZE(mdaIn)-1);
689  size_t zhalf = std::min(std::min(ZSIZE(mdaIn)/2,ZSIZE(mdaOut)/2),ZSIZE(mdaIn)-1);
690 
691  size_t kp0=0;
692  size_t kpF=zhalf;
693  size_t ip0=0;
694  size_t ipF=yhalf;
695  size_t km0=ZSIZE(inFourier)>=ZSIZE(outFourier)?(kpF+1):(ZSIZE(outFourier)-(ZSIZE(inFourier)-(zhalf+1)));
696  size_t kmF=ZSIZE(outFourier)-1;
697  size_t im0=YSIZE(inFourier)>=YSIZE(outFourier)?(ipF+1):(YSIZE(outFourier)-(YSIZE(inFourier)-(yhalf+1)));
698  size_t imF=YSIZE(outFourier)-1;
699 
700  //Init with zero
701  outFourier.initZeros();
702 
703  for (size_t k = kp0; k<=kpF; ++k)
704  {
705  for (size_t i=ip0; i<=ipF; ++i)
706  memcpy(&dAkij(outFourier,k,i,0),&dAkij(inFourier,k,i,0),xsize);
707  for (size_t i=im0; i<=imF; ++i) {
708  size_t ip = i + YSIZE(inFourier)-YSIZE(outFourier) ;
709  memcpy(&dAkij(outFourier,k,i,0),&dAkij(inFourier,k,ip,0),xsize);
710  }
711  }
712  for (size_t k = km0; k<=kmF; ++k) {
713  size_t kp = k + ZSIZE(inFourier)-ZSIZE(outFourier) ;
714  for (size_t i=ip0; i<=ipF; ++i)
715  memcpy(&dAkij(outFourier,k,i,0),&dAkij(inFourier,kp,i,0),xsize);
716  for (size_t i=im0; i<=imF; ++i) {
717  size_t ip = i + YSIZE(inFourier)-YSIZE(outFourier) ;
718  memcpy(&dAkij(outFourier,k,i,0),&dAkij(inFourier,kp,ip,0),xsize);
719  }
720  }
721 }
#define YSIZE(v)
void min(Image< double > &op1, const Image< double > &op2)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define XSIZE(v)
#define dAkij(V, k, i, j)
#define ZSIZE(v)
void initZeros(const MultidimArray< T1 > &op)

◆ selfScaleToSizeFourier() [1/4]

void selfScaleToSizeFourier ( int  Zdim,
int  Ydim,
int  Xdim,
MultidimArray< double > &  mda,
int  nthreads = 1 
)

Definition at line 723 of file xmipp_fftw.cpp.

724 {
726  scaleToSizeFourier(Zdim, Ydim, Xdim, mda, aux, nThreads);
727  mda=aux;
728 }
void scaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mdaIn, MultidimArray< double > &mdaOut, int nThreads)
Definition: xmipp_fftw.cpp:658

◆ selfScaleToSizeFourier() [2/4]

void selfScaleToSizeFourier ( int  Ydim,
int  Xdim,
MultidimArray< double > &  mda,
int  nthreads = 1 
)

Definition at line 731 of file xmipp_fftw.cpp.

732 {
733  selfScaleToSizeFourier(1, Ydim, Xdim, Mpmem, nThreads);
734 }
void selfScaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mda, int nThreads)
Definition: xmipp_fftw.cpp:723

◆ selfScaleToSizeFourier() [3/4]

void selfScaleToSizeFourier ( int  Zdim,
int  Ydim,
int  Xdim,
MultidimArrayGeneric mda,
int  nthreads = 1 
)

MultidimArrayGeneric version

Definition at line 736 of file xmipp_fftw.cpp.

737 {
739  Mpmem.getImage(aux);
740  selfScaleToSizeFourier(Zdim, Ydim, Xdim, aux, nThreads);
741  Mpmem.setImage(aux);
742 }
void selfScaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mda, int nThreads)
Definition: xmipp_fftw.cpp:723
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const

◆ selfScaleToSizeFourier() [4/4]

void selfScaleToSizeFourier ( int  Ydim,
int  Xdim,
MultidimArrayGeneric mda,
int  nthreads = 1 
)

Definition at line 744 of file xmipp_fftw.cpp.

745 {
747  Mpmem.getImage(aux);
748  selfScaleToSizeFourier(1, Ydim, Xdim, aux, nThreads);
749  Mpmem.setImage(aux);
750 }
void selfScaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mda, int nThreads)
Definition: xmipp_fftw.cpp:723
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const

◆ whitenSpectrum()

void whitenSpectrum ( MultidimArray< double > &  Min,
MultidimArray< double > &  Mout,
int  spectrum_type = AMPLITUDE_SPECTRUM,
bool  leave_origin_intact = false 
)

Perform a whitening of the amplitude/power spectrum of a 3D map

If leave_origin_intact==true, the origin pixel will remain untouched

Definition at line 835 of file xmipp_fftw.cpp.

839 {
840  Min.checkDimension(3);
841 
842  MultidimArray<double> spectrum;
843  getSpectrum(Min,spectrum,spectrum_type);
844  Mout=Min;
845  divideBySpectrum(Mout,spectrum,leave_origin_intact);
846 
847 }
void getSpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, int spectrum_type)
Definition: xmipp_fftw.cpp:752
void divideBySpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact)
Definition: xmipp_fftw.cpp:788