aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/Eigen/FFT
diff options
context:
space:
mode:
authorGravatar Mark Borgerding <mark@borgerding.net>2009-10-30 20:26:30 -0400
committerGravatar Mark Borgerding <mark@borgerding.net>2009-10-30 20:26:30 -0400
commitd659fd9b148870e3c1e367139bec388142f2818e (patch)
tree19aa8beb5a2f572f2ea73178d28719c2477b1b6b /unsupported/Eigen/FFT
parenta26b729cc9784eba82a5951be0e7738c1d209484 (diff)
moved real-half-spectrum reflection into Eigen::FFT
Diffstat (limited to 'unsupported/Eigen/FFT')
-rw-r--r--unsupported/Eigen/FFT32
1 files changed, 22 insertions, 10 deletions
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<typename InputDerived, typename ComplexDerived>
void fwd( MatrixBase<ComplexDerived> & dst, const MatrixBase<InputDerived> & 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<typename ComplexDerived::Scalar, Complex>::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<typename ComplexDerived::Scalar, Complex>::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;
};