43namespace psdFilterTypes
47template <
typename realT,
size_t rank>
50template <
typename realT>
68template <
typename realT>
69struct arrayT<realT, 2>
71 typedef Eigen::Array<realT, Eigen::Dynamic, Eigen::Dynamic> realArrayT;
72 typedef Eigen::Map<Eigen::Array<realT, Eigen::Dynamic, Eigen::Dynamic>> realArrayMapT;
74 typedef Eigen::Array<std::complex<realT>, Eigen::Dynamic, Eigen::Dynamic> complexArrayT;
76 static void clear( realArrayT &arr )
81 static void clear( complexArrayT &arr )
87template <
typename realT>
90 typedef improc::eigenCube<realT> realArrayT;
91 typedef improc::eigenCube<realT> *realArrayMapT;
92 typedef improc::eigenCube<std::complex<realT>> complexArrayT;
94 static void clear( realArrayT &arr )
96 arr.resize( 0, 0, 0 );
99 static void clear( complexArrayT &arr )
101 arr.resize( 0, 0, 0 );
108template <
typename _realT,
size_t rank,
int cuda = 0>
142template <
typename _realT,
size_t _rank>
149 static const size_t rank = _rank;
171 mutable complexArrayT
223 template <
size_t crank = rank>
224 int setSize(
typename std::enable_if<crank == 1>::type * = 0 );
234 template <
size_t crank = rank>
235 int setSize(
typename std::enable_if<crank == 2>::type * = 0 );
245 template <
size_t crank = rank>
246 int setSize(
typename std::enable_if<crank == 3>::type * = 0 );
283 template <
size_t crank = rank>
286 typename std::enable_if<crank == 1>::type * = 0 );
301 template <
size_t crank = rank>
305 typename std::enable_if<crank == 2>::type * = 0 );
320 template <
size_t crank = rank>
325 typename std::enable_if<crank == 3>::type * = 0 );
338 template <
size_t crank = rank>
341 typename std::enable_if<crank == 1>::type * = 0 );
354 template <
size_t crank = rank>
358 typename std::enable_if<crank == 2>::type * = 0 );
371 template <
size_t crank = rank>
376 typename std::enable_if<crank == 3>::type * = 0 );
389 template <
size_t crank = rank>
392 typename std::enable_if<crank == 1>::type * = 0 );
405 template <
size_t crank = rank>
409 typename std::enable_if<crank == 2>::type * = 0 );
422 template <
size_t crank = rank>
427 typename std::enable_if<crank == 3>::type * = 0 );
443 template <
size_t crank = rank>
447 typename std::enable_if<crank == 1>::type * = 0 )
const;
457 template <
size_t crank = rank>
461 typename std::enable_if<crank == 2>::type * = 0 )
const;
471 template <
size_t crank = rank>
475 typename std::enable_if<crank == 2>::type * = 0 )
const;
485 template <
size_t crank = rank>
489 typename std::enable_if<crank == 3>::type * = 0 )
const;
525template <
typename realT,
size_t rank>
526psdFilter<realT, rank>::psdFilter()
530template <
typename realT,
size_t rank>
531psdFilter<realT, rank>::~psdFilter()
533 if( m_psdSqrt && m_owner )
539template <
typename realT,
size_t rank>
540int psdFilter<realT, rank>::psdSqrt( realArrayT *npsdSqrt )
542 if( m_psdSqrt && m_owner )
547 m_psdSqrt = npsdSqrt;
555template <
typename realT,
size_t rank>
556int psdFilter<realT, rank>::psdSqrt(
const realArrayT &npsdSqrt )
558 if( m_psdSqrt && m_owner )
563 m_psdSqrt =
new realArrayT;
565 ( *m_psdSqrt ) = npsdSqrt;
573template <
typename realT,
size_t rank>
574template <
size_t crank>
575int psdFilter<realT, rank>::setSize(
typename std::enable_if<crank == 1>::type * )
583 if( m_rows == m_psdSqrt->size() )
588 m_rows = m_psdSqrt->size();
592 m_ftWork.resize( m_rows );
601template <
typename realT,
size_t rank>
602template <
size_t crank>
603int psdFilter<realT, rank>::setSize(
typename std::enable_if<crank == 2>::type * )
611 if( m_rows == m_psdSqrt->rows() && m_cols == m_psdSqrt->cols() )
616 m_rows = m_psdSqrt->rows();
617 m_cols = m_psdSqrt->cols();
620 m_ftWork.resize( m_rows, m_cols );
629template <
typename realT,
size_t rank>
630template <
size_t crank>
631int psdFilter<realT, rank>::setSize(
typename std::enable_if<crank == 3>::type * )
639 if( m_rows == m_psdSqrt->rows() && m_cols == m_psdSqrt->cols() && m_planes == m_psdSqrt->planes() )
644 m_rows = m_psdSqrt->rows();
645 m_cols = m_psdSqrt->cols();
646 m_planes = m_psdSqrt->planes();
648 m_ftWork.resize( m_rows, m_cols, m_planes );
657template <
typename realT,
size_t rank>
658int psdFilter<realT, rank>::rows()
663template <
typename realT,
size_t rank>
664int psdFilter<realT, rank>::cols()
669template <
typename realT,
size_t rank>
670int psdFilter<realT, rank>::planes()
675template <
typename realT,
size_t rank>
676template <
size_t crank>
677int psdFilter<realT, rank>::psdSqrt( realArrayT *npsdSqrt, realT df,
typename std::enable_if<crank == 1>::type * )
680 return psdSqrt( npsdSqrt );
683template <
typename realT,
size_t rank>
684template <
size_t crank>
685int psdFilter<realT, rank>::psdSqrt( realArrayT *npsdSqrt,
688 typename std::enable_if<crank == 2>::type * )
692 return psdSqrt( npsdSqrt );
695template <
typename realT,
size_t rank>
696template <
size_t crank>
697int psdFilter<realT, rank>::psdSqrt(
698 realArrayT *npsdSqrt, realT dk1, realT dk2, realT df,
typename std::enable_if<crank == 3>::type * )
703 return psdSqrt( npsdSqrt );
706template <
typename realT,
size_t rank>
707template <
size_t crank>
708int psdFilter<realT, rank>::psdSqrt(
const realArrayT &npsdSqrt, realT df,
typename std::enable_if<crank == 1>::type * )
711 return psdSqrt( npsdSqrt );
714template <
typename realT,
size_t rank>
715template <
size_t crank>
716int psdFilter<realT, rank>::psdSqrt(
const realArrayT &npsdSqrt,
719 typename std::enable_if<crank == 2>::type * )
723 return psdSqrt( npsdSqrt );
726template <
typename realT,
size_t rank>
727template <
size_t crank>
728int psdFilter<realT, rank>::psdSqrt(
729 const realArrayT &npsdSqrt, realT dk1, realT dk2, realT df,
typename std::enable_if<crank == 3>::type * )
734 return psdSqrt( npsdSqrt );
737template <
typename realT,
size_t rank>
738template <
size_t crank>
739int psdFilter<realT, rank>::psd(
const realArrayT &npsd,
const realT df1,
typename std::enable_if<crank == 1>::type * )
741 if( m_psdSqrt && m_owner )
746 m_psdSqrt =
new realArrayT;
749 m_psdSqrt->resize( npsd.size() );
750 for(
size_t n = 0; n < npsd.size(); ++n )
751 ( *m_psdSqrt )[n] = sqrt( npsd[n] );
762template <
typename realT,
size_t rank>
763template <
size_t crank>
764int psdFilter<realT, rank>::psd(
const realArrayT &npsd,
767 typename std::enable_if<crank == 2>::type * )
769 if( m_psdSqrt && m_owner )
774 m_psdSqrt =
new realArrayT;
776 ( *m_psdSqrt ) = npsd.sqrt();
787template <
typename realT,
size_t rank>
788template <
size_t crank>
789int psdFilter<realT, rank>::psd(
const realArrayT &npsd,
793 typename std::enable_if<crank == 3>::type * )
795 if( m_psdSqrt && m_owner )
800 m_psdSqrt =
new realArrayT;
803 m_psdSqrt->resize( npsd.rows(), npsd.cols(), npsd.planes() );
804 for(
int pp = 0; pp < npsd.planes(); ++pp )
806 for(
int cc = 0; cc < npsd.cols(); ++cc )
808 for(
int rr = 0; rr < npsd.rows(); ++rr )
810 m_psdSqrt->image( pp )( rr, cc ) = sqrt( npsd.image( pp )( rr, cc ) );
826template <
typename realT,
size_t rank>
827void psdFilter<realT, rank>::clear()
836 if( m_psdSqrt && m_owner )
843template <
typename realT,
size_t rank>
844template <
size_t crank>
845int psdFilter<realT, rank>::filter( realArrayT &noise,
847 typename std::enable_if<crank == 1>::type * )
const
849 for(
int nn = 0; nn < noise.size(); ++nn )
850 m_ftWork[nn] = complexT( noise[nn], 0 );
853 m_fft_fwd( m_ftWork.data(), m_ftWork.data() );
856 for(
int nn = 0; nn < m_ftWork.size(); ++nn )
857 m_ftWork[nn] *= ( *m_psdSqrt )[nn];
859 m_fft_bwd( m_ftWork.data(), m_ftWork.data() );
862 realT norm = sqrt( noise.size() / m_dFreq1 );
863 for(
int nn = 0; nn < m_ftWork.size(); ++nn )
864 noise[nn] = m_ftWork[nn].real() / norm;
866 if( noiseIm !=
nullptr )
868 for(
int nn = 0; nn < m_ftWork.size(); ++nn )
869 ( *noiseIm )[nn] = m_ftWork[nn].imag() / norm;
875template <
typename realT,
size_t rank>
876template <
size_t crank>
877int psdFilter<realT, rank>::filter( realArrayT &noise,
879 typename std::enable_if<crank == 2>::type * )
const
882 for(
int ii = 0; ii < noise.rows(); ++ii )
884 for(
int jj = 0; jj < noise.cols(); ++jj )
886 m_ftWork( ii, jj ) = complexT( noise( ii, jj ), 0 );
891 m_fft_fwd( m_ftWork.data(), m_ftWork.data() );
894 m_ftWork *= *m_psdSqrt;
896 m_fft_bwd( m_ftWork.data(), m_ftWork.data() );
898 realT norm = sqrt( noise.rows() * noise.cols() / ( m_dFreq1 * m_dFreq2 ) );
901 noise = m_ftWork.real() / norm;
903 if( noiseIm !=
nullptr )
905 *noiseIm = m_ftWork.imag() / norm;
911template <
typename realT,
size_t rank>
912template <
size_t crank>
913int psdFilter<realT, rank>::filter( realArrayMapT noise,
915 typename std::enable_if<crank == 2>::type * )
const
918 for(
int ii = 0; ii < noise.rows(); ++ii )
920 for(
int jj = 0; jj < noise.cols(); ++jj )
922 m_ftWork( ii, jj ) = complexT( noise( ii, jj ), 0 );
927 m_fft_fwd( m_ftWork.data(), m_ftWork.data() );
930 m_ftWork *= *m_psdSqrt;
932 m_fft_bwd( m_ftWork.data(), m_ftWork.data() );
934 realT norm = sqrt( noise.rows() * noise.cols() / ( m_dFreq1 * m_dFreq2 ) );
937 noise = m_ftWork.real() / norm;
939 if( noiseIm !=
nullptr )
941 *noiseIm = m_ftWork.imag() / norm;
947template <
typename realT,
size_t rank>
948template <
size_t crank>
949int psdFilter<realT, rank>::filter( realArrayT &noise,
951 typename std::enable_if<crank == 3>::type * )
const
954 for(
int pp = 0; pp < noise.planes(); ++pp )
956 for(
int ii = 0; ii < noise.rows(); ++ii )
958 for(
int jj = 0; jj < noise.cols(); ++jj )
960 m_ftWork.image( pp )( ii, jj ) = complexT( noise.image( pp )( ii, jj ), 0 );
966 m_fft_fwd( m_ftWork.data(), m_ftWork.data() );
969 for(
int pp = 0; pp < noise.planes(); ++pp )
970 m_ftWork.image( pp ) *= m_psdSqrt->image( pp );
972 m_fft_bwd( m_ftWork.data(), m_ftWork.data() );
976 realT norm = sqrt( m_rows * m_cols * m_planes / ( m_dFreq1 * m_dFreq2 * m_dFreq3 ) );
977 for(
int pp = 0; pp < noise.planes(); ++pp )
978 noise.image( pp ) = m_ftWork.image( pp ).real() / norm;
980 if( noiseIm !=
nullptr )
982 for(
int pp = 0; pp < noise.planes(); ++pp )
983 noiseIm->image( pp ) = m_ftWork.image( pp ).imag() / norm;
989template <
typename realT,
size_t rank>
990int psdFilter<realT, rank>::operator()( realArrayT &noise )
const
992 return filter( noise );
995template <
typename realT,
size_t rank>
996int psdFilter<realT, rank>::operator()( realArrayMapT noise )
const
998 return filter( noise );
1001template <
typename realT,
size_t rank>
1002int psdFilter<realT, rank>::operator()( realArrayT &noise, realArrayT &noiseIm )
const
1004 return filter( noise, &noiseIm );
realT m_dFreq3
The frequency scaling of the z-dimension. Used to scale the output.
int setSize(typename std::enable_if< crank==1 >::type *=0)
Set the size of the filter.
int operator()(realArrayT &noise, realArrayT &noiseIm) const
Apply the filter.
complexArrayT m_ftWork
Working memory for the FFT. Declared mutable so it can be accessed in the const filter method.
int rows()
Get the number of rows in the filter.
int psd(const realArrayT &npsd, const realT df, typename std::enable_if< crank==1 >::type *=0)
Set the sqaure-root of the PSD from the PSD.
int filter(realArrayMapT noise, realArrayT *noiseIm=nullptr, typename std::enable_if< crank==2 >::type *=0) const
Apply the filter.
realArrayT * m_psdSqrt
Pointer to the real array containing the square root of the PSD.
psdFilterTypes::arrayT< realT, rank >::complexArrayT complexArrayT
std::vector for rank==1, Eigen::Array for rank==2, eigenCube for rank==3.
int psdSqrt(realArrayT *npsdSqrt, realT df, typename std::enable_if< crank==1 >::type *=0)
math::ft::fftT< complexT, complexT, rank, 0 > m_fft_fwd
FFT object for the forward transform.
int filter(realArrayT &noise, realArrayT *noiseIm=nullptr, typename std::enable_if< crank==3 >::type *=0) const
Apply the filter.
psdFilterTypes::arrayT< realT, rank >::realArrayMapT realArrayMapT
std::vector for rank==1, Eigen::Map for rank==2, eigenCube for rank==3.
int filter(realArrayT &noise, realArrayT *noiseIm=nullptr, typename std::enable_if< crank==1 >::type *=0) const
Apply the filter.
int psdSqrt(realArrayT *npsdSqrt, realT dk1, realT dk2, typename std::enable_if< crank==2 >::type *=0)
int m_rows
The number of rows in the filter, and the required number of rows in the noise array.
int setSize(typename std::enable_if< crank==2 >::type *=0)
Set the size of the filter.
int operator()(realArrayT &noise) const
Apply the filter.
int psd(const realArrayT &npsd, const realT dk1, const realT dk2, typename std::enable_if< crank==2 >::type *=0)
Set the sqaure-root of the PSD from the PSD.
int psdSqrt(realArrayT *npsdSqrt, realT dk1, realT dk2, realT df, typename std::enable_if< crank==3 >::type *=0)
int m_cols
The number of columns in the filter, and the required number of columns in the noise array.
int cols()
Get the number of columns in the filter.
realT m_dFreq2
The frequency scaling of the y-dimension. Used to scale the output.
std::complex< _realT > complexT
Complex floating point type.
psdFilterTypes::arrayT< realT, rank >::realArrayT realArrayT
std::vector for rank==1, Eigen::Array for rank==2, eigenCube for rank==3.
int psdSqrt(const realArrayT &npsdSqrt, realT dk1, realT dk2, realT df, typename std::enable_if< crank==3 >::type *=0)
Set the sqaure-root of the PSD.
math::ft::fftT< complexT, complexT, rank, 0 > m_fft_bwd
FFT object for the backward transfsorm.
int m_planes
Then number of planes in the filter.
int setSize(typename std::enable_if< crank==3 >::type *=0)
Set the size of the filter.
void clear()
De-allocate all working memory and reset to initial state.
int filter(realArrayT &noise, realArrayT *noiseIm=nullptr, typename std::enable_if< crank==2 >::type *=0) const
Apply the filter.
_realT realT
Real floating point type.
realT m_dFreq1
The frequency scaling of the x-dimension. Used to scale the output.
int operator()(realArrayMapT noise) const
Apply the filter.
int psdSqrt(const realArrayT &npsdSqrt, realT df, typename std::enable_if< crank==1 >::type *=0)
Set the sqaure-root of the PSD.
int psd(const realArrayT &npsd, const realT dk1, const realT dk2, const realT df, typename std::enable_if< crank==3 >::type *=0)
Set the sqaure-root of the PSD from the PSD.
int psdSqrt(const realArrayT &npsdSqrt)
Set the sqaure-root of the PSD.
int psdSqrt(const realArrayT &npsdSqrt, realT dk1, realT dk2, typename std::enable_if< crank==2 >::type *=0)
Set the sqaure-root of the PSD.
int planes()
Get the number of planes in the filter.
int psdSqrt(realArrayT *npsdSqrt)
An image cube with an Eigen API.
The Fast Fourier Transform interface.
@ paramnotset
A parameter was not set.
error_t mxlib_error_report(const error_t &code, const std::string &expl, const std::source_location &loc=std::source_location::current())
Print a report to stderr given an mxlib error_t code and explanation and return the code.
@ backward
Specifies the backward transform.
@ forward
Specifies the forward transform.
Declarations of some libarary wide utilities.
Types for different ranks in psdFilter.