From d659fd9b148870e3c1e367139bec388142f2818e Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Fri, 30 Oct 2009 20:26:30 -0400 Subject: moved real-half-spectrum reflection into Eigen::FFT --- unsupported/Eigen/FFT | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'unsupported/Eigen/FFT') diff --git a/unsupported/Eigen/FFT b/unsupported/Eigen/FFT index e2705abf6..b1d3d9f0e 100644 --- a/unsupported/Eigen/FFT +++ b/unsupported/Eigen/FFT @@ -88,6 +88,8 @@ class FFT void fwd( Complex * dst, const Scalar * src, int nfft) { m_impl.fwd(dst,src,nfft); + if ( HasFlag(HalfSpectrum) == false) + ReflectSpectrum(dst,nfft); } void fwd( Complex * dst, const Complex * src, int nfft) @@ -108,15 +110,19 @@ class FFT template void fwd( MatrixBase & dst, const MatrixBase & src) { - EIGEN_STATIC_ASSERT_VECTOR_ONLY(InputDerived) - EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived) - EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived,InputDerived) // size at compile-time - EIGEN_STATIC_ASSERT((ei_is_same_type::ret), - YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) - EIGEN_STATIC_ASSERT(int(InputDerived::Flags)&int(ComplexDerived::Flags)&DirectAccessBit, - THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES) - dst.derived().resize( src.size() ); - fwd( &dst[0],&src[0],src.size() ); + EIGEN_STATIC_ASSERT_VECTOR_ONLY(InputDerived) + EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived) + EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived,InputDerived) // size at compile-time + EIGEN_STATIC_ASSERT((ei_is_same_type::ret), + YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) + EIGEN_STATIC_ASSERT(int(InputDerived::Flags)&int(ComplexDerived::Flags)&DirectAccessBit, + THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES) + + if ( NumTraits< typename InputDerived::Scalar >::IsComplex == 0 && HasFlag(HalfSpectrum) ) + dst.derived().resize( (src.size()>>1)+1); + else + dst.derived().resize(src.size()); + fwd( &dst[0],&src[0],src.size() ); } void inv( Complex * dst, const Complex * src, int nfft) @@ -160,7 +166,6 @@ class FFT inv( &dst[0],&src[0],dst.size() ); } - // TODO: multi-dimensional FFTs // TODO: handle Eigen MatrixBase @@ -176,6 +181,13 @@ class FFT *x++ *= s; } + void ReflectSpectrum(Complex * freq,int nfft) + { + int nhbins=(nfft>>1)+1; + for (int k=nhbins;k < nfft; ++k ) + freq[k] = conj(freq[nfft-k]); + } + impl_type m_impl; int m_flag; }; -- cgit v1.2.3