46 #define FFT_IDX2DIGFREQ(idx, size, freq) \ 47 freq = (size<=1)? 0:(( (((int)idx) <= (((int)(size)) >> 1)) ? ((int)(idx)) : -((int)(size)) + ((int)(idx))) / \ 50 #define FFT_IDX2DIGFREQ_DOUBLE(idx, size, freq) \ 51 freq = (size<=1)? 0:(( (((double)idx) <= (((double)(size)) / 2.0)) ? ((double)(idx)) : -((double)(size)) + ((double)(idx))) / \ 54 #define FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq) \ 55 freq = ( ((idx) <= (size_2)) ? (idx) : -(size) + (idx) ) * (isize); 61 #define DIGFREQ2FFT_IDX(freq, size, idx) { \ 62 (idx) = (int) (round((size) * (freq))); if ((idx) < 0) (idx) += (int) \ 70 #define DIGFREQ2FFT_IDX_DOUBLE(freq, size, idx) { \ 71 (idx) = ((size) * (freq)); if ((idx) < 0) (idx) += (size); } 105 template <
typename T>
278 #define SWAP_ARRAY(a, b, n) memcpy(buffer, a, n); memcpy(a, b, n); memcpy(b, buffer, n); 290 template <
typename T>
304 size_t firstHalfSize=0;
305 size_t secondHalfSize=0;
310 firstHalfSize = (l + 1) / 2;
311 secondHalfSize = l - firstHalfSize;
314 for (
size_t k = 0;
k <
ZSIZE(v);
k++)
316 for (
size_t i = 0;
i <
YSIZE(v);
i++)
318 memcpy( &
dAi(aux, 0), &
dAkij(v,
k,
i, 0),
sizeof(T)*firstHalfSize);
319 memcpy( &
dAkij(v,
k,
i, 0), &
dAkij(v,
k,
i, firstHalfSize),
sizeof(T)*secondHalfSize);
320 memcpy( &
dAkij(v,
k,
i, secondHalfSize), &
dAi(aux, 0),
sizeof(T)*firstHalfSize);
326 secondHalfSize = (l + 1) / 2;
327 firstHalfSize = l - secondHalfSize;
330 for (
size_t k = 0;
k <
ZSIZE(v);
k++)
332 for (
size_t i = 0;
i <
YSIZE(v);
i++)
334 memcpy( &
dAi(aux, 0), &
dAkij(v,
k,
i, firstHalfSize),
sizeof(T)*secondHalfSize);
335 memcpy( &
dAkij(v,
k,
i, secondHalfSize), &
dAkij(v,
k,
i, 0),
sizeof(T)*firstHalfSize);
336 memcpy( &
dAkij(v,
k,
i, 0), &
dAi(aux, 0),
sizeof(T)*secondHalfSize);
353 int firstHalfRowSize=0, secondHalfRowSize=0;
356 int nElemsFirstHalf_X=0, nElemsSecondHalf_X=0;
369 T *upperHalfPtr, *lowerHalfSrcPtr, *lowerHalfDestPtr;
377 nElemsFirstHalf_X = (
XSIZE(v) + 1) / 2;
378 nElemsSecondHalf_X =
XSIZE(v) - nElemsFirstHalf_X;
381 rowSize =
XSIZE(v)*
sizeof(T);
384 firstHalfRowSize = nElemsFirstHalf_X*
sizeof(T);
385 secondHalfRowSize = rowSize - firstHalfRowSize;
389 halfRows =
YSIZE(v) / 2;
392 if ((
YSIZE(v) % 2) != 0)
400 upperHalfPtr = &
dAkij(v,
k, 0, 0);
401 lowerHalfSrcPtr = upperHalfPtr + (halfRows*
XSIZE(v));
402 lowerHalfDestPtr = lowerHalfSrcPtr;
407 memcpy( &
dAi(savedRow,0), lowerHalfSrcPtr, rowSize);
410 lowerHalfSrcPtr = lowerHalfSrcPtr +
XSIZE(v);
414 for (i=0; i<halfRows ;i++)
416 memcpy( &
dAi(tempVector,0), upperHalfPtr, rowSize);
417 memcpy( upperHalfPtr, lowerHalfSrcPtr + nElemsFirstHalf_X, secondHalfRowSize);
418 memcpy( upperHalfPtr + nElemsSecondHalf_X, lowerHalfSrcPtr, firstHalfRowSize);
419 memcpy( lowerHalfDestPtr, &
dAi(tempVector, nElemsFirstHalf_X), secondHalfRowSize);
420 memcpy( lowerHalfDestPtr + nElemsSecondHalf_X, &
dAi(tempVector,0), firstHalfRowSize);
422 upperHalfPtr = upperHalfPtr +
XSIZE(v);
423 lowerHalfSrcPtr = lowerHalfSrcPtr +
XSIZE(v);
424 lowerHalfDestPtr = lowerHalfDestPtr +
XSIZE(v);
430 memcpy( lowerHalfDestPtr + nElemsSecondHalf_X, &
dAi(savedRow,0), firstHalfRowSize);
431 memcpy( lowerHalfDestPtr, &
dAi(savedRow, nElemsFirstHalf_X), secondHalfRowSize);
440 T *upperHalfSrcPtr, *upperHalfDestPtr, *lowerHalfPtr;
448 nElemsSecondHalf_X = (
XSIZE(v) + 1) / 2;
449 nElemsFirstHalf_X =
XSIZE(v) - nElemsSecondHalf_X;
452 rowSize =
XSIZE(v)*
sizeof(T);
453 firstHalfRowSize = nElemsFirstHalf_X*
sizeof(T);
454 secondHalfRowSize = rowSize - firstHalfRowSize;
458 halfRows =
YSIZE(v) / 2;
461 if ((
YSIZE(v) % 2) != 0)
469 upperHalfSrcPtr = &
dAkij(v,
k, halfRows-1, 0);
471 upperHalfDestPtr = upperHalfSrcPtr;
477 upperHalfDestPtr = upperHalfDestPtr +
XSIZE(v);
479 memcpy( &
dAi(savedRow,0), upperHalfDestPtr, rowSize);
483 for (i=0; i<halfRows ;i++)
485 memcpy( &
dAi(tempVector, 0), upperHalfSrcPtr, rowSize);
486 memcpy( upperHalfDestPtr, lowerHalfPtr + nElemsFirstHalf_X, secondHalfRowSize);
487 memcpy( upperHalfDestPtr + nElemsSecondHalf_X, lowerHalfPtr, firstHalfRowSize);
488 memcpy( lowerHalfPtr, &
dAi(tempVector, nElemsFirstHalf_X), secondHalfRowSize);
489 memcpy( lowerHalfPtr + nElemsSecondHalf_X, &
dAi(tempVector,0), firstHalfRowSize);
491 upperHalfSrcPtr = upperHalfSrcPtr -
XSIZE(v);
492 lowerHalfPtr = lowerHalfPtr -
XSIZE(v);
493 upperHalfDestPtr = upperHalfDestPtr -
XSIZE(v);
499 memcpy( upperHalfDestPtr + nElemsSecondHalf_X, &
dAi(savedRow, 0), firstHalfRowSize);
500 memcpy( upperHalfDestPtr, &
dAi(savedRow, nElemsFirstHalf_X), secondHalfRowSize);
506 if ((l =
ZSIZE(v)) > 1)
509 shift = (
long int)(l / 2);
514 for (
size_t i = 0; i <
YSIZE(v); i++)
516 for (
size_t j = 0;
j <
XSIZE(v);
j++)
519 for (
size_t k = 0;
k < l;
k++)
521 size_t kp =
k + shift;
522 if (-shift > (
long int)
k)
531 const T* ptrAux=&
dAi(aux,0);
532 for (
size_t k = 0;
k < lmax;
k+=4,ptrAux+=4)
535 dAkij(v,
k+1, i,
j) = *(ptrAux+1);
536 dAkij(v,
k+2, i,
j) = *(ptrAux+2);
537 dAkij(v,
k+3, i,
j) = *(ptrAux+3);
539 for (
size_t k = lmax;
k < l; ++
k, ++ptrAux)
void FourierTransformHalf(const MultidimArray< double > &in, MultidimArray< std::complex< double > > &out)
#define REPORT_ERROR(nerr, ErrormMsg)
Problem with matrix size.
void digfreq2FFT_idx(T &v, const Matrix1D< double > &freq, Matrix1D< int > &idx)
void ShiftFFT(MultidimArray< std::complex< double > > &v, double xshift)
void resizeNoCopy(const MultidimArray< T1 > &v)
#define FFT_IDX2DIGFREQ(idx, size, freq)
void centerFFT2(MultidimArray< double > &v)
void Whole2Half(const MultidimArray< std::complex< double > > &in, MultidimArray< std::complex< double > > &out)
void InverseFourierTransform(const MultidimArray< std::complex< double > > &in, MultidimArray< double > &out)
#define DIGFREQ2FFT_IDX(freq, size, idx)
void FFT_idx2digfreq(T &v, const Matrix1D< int > &idx, Matrix1D< double > &freq)
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
void CenterFFT(MultidimArray< T > &v, bool forward)
void Half2Whole(const MultidimArray< std::complex< double > > &in, MultidimArray< std::complex< double > > &out, size_t oridim)
#define FOR_ALL_ELEMENTS_IN_MATRIX1D(v)
void xmipp2PSD(const MultidimArray< T > &input, MultidimArray< T > &output, bool takeLog=true)
void RealImag2Complex(const MultidimArray< double > &real, const MultidimArray< double > &imag, MultidimArray< std::complex< double > > &out)
void contfreq2digfreq(const Matrix1D< double > &contfreq, Matrix1D< double > &digfreq, double pixel_size)
void xmipp2CTF(const MultidimArray< double > &input, MultidimArray< double > &output)
#define dAkij(V, k, i, j)
void FourierTransform(const MultidimArray< double > &in, MultidimArray< std::complex< double > > &out)
void resizeNoCopy(int Xdim)
Incorrect MultidimArray dimensions.
void Complex2RealImag(const MultidimArray< std::complex< double > > &in, MultidimArray< double > &real, MultidimArray< double > &imag)
void InverseFourierTransformHalf(const MultidimArray< std::complex< double > > &in, MultidimArray< double > &out, int oridim)
void digfreq2contfreq(const Matrix1D< double > &digfreq, Matrix1D< double > &contfreq, double pixel_size)
void CenterOriginFFT(MultidimArray< std::complex< double > > &v, bool forward)