diff options
author | Tom Rondeau | 2011-08-27 16:44:32 -0400 |
---|---|---|
committer | Tom Rondeau | 2011-08-27 16:44:32 -0400 |
commit | 54881f8803d4f796dde2af031e6f1a37df9445f1 (patch) | |
tree | b1e4e6c34004f22a29c03815ed3ae49065693dce /volk/include/volk/volk_32fc_deinterleave_real_64f_a.h | |
parent | 50cde24aea52d66d69313a490f7eab78a5085849 (diff) | |
parent | f4cc7884c608a7ec1969e68b73e12cdbcc26145c (diff) | |
download | gnuradio-54881f8803d4f796dde2af031e6f1a37df9445f1.tar.gz gnuradio-54881f8803d4f796dde2af031e6f1a37df9445f1.tar.bz2 gnuradio-54881f8803d4f796dde2af031e6f1a37df9445f1.zip |
Merge branch 'master' of gnuradio.org:gnuradio
Diffstat (limited to 'volk/include/volk/volk_32fc_deinterleave_real_64f_a.h')
-rw-r--r-- | volk/include/volk/volk_32fc_deinterleave_real_64f_a.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/volk/include/volk/volk_32fc_deinterleave_real_64f_a.h b/volk/include/volk/volk_32fc_deinterleave_real_64f_a.h new file mode 100644 index 000000000..70a3b1971 --- /dev/null +++ b/volk/include/volk/volk_32fc_deinterleave_real_64f_a.h @@ -0,0 +1,66 @@ +#ifndef INCLUDED_volk_32fc_deinterleave_real_64f_a_H +#define INCLUDED_volk_32fc_deinterleave_real_64f_a_H + +#include <inttypes.h> +#include <stdio.h> + +#ifdef LV_HAVE_SSE2 +#include <emmintrin.h> +/*! + \brief Deinterleaves the complex vector into I vector data + \param complexVector The complex input vector + \param iBuffer The I buffer output data + \param num_points The number of complex data values to be deinterleaved +*/ +static inline void volk_32fc_deinterleave_real_64f_a_sse2(double* iBuffer, const lv_32fc_t* complexVector, unsigned int num_points){ + unsigned int number = 0; + + const float* complexVectorPtr = (float*)complexVector; + double* iBufferPtr = iBuffer; + + const unsigned int halfPoints = num_points / 2; + __m128 cplxValue, fVal; + __m128d dVal; + for(;number < halfPoints; number++){ + + cplxValue = _mm_load_ps(complexVectorPtr); + complexVectorPtr += 4; + + // Arrange in i1i2i1i2 format + fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2,0,2,0)); + dVal = _mm_cvtps_pd(fVal); + _mm_store_pd(iBufferPtr, dVal); + + iBufferPtr += 2; + } + + number = halfPoints * 2; + for(; number < num_points; number++){ + *iBufferPtr++ = (double)*complexVectorPtr++; + complexVectorPtr++; + } +} +#endif /* LV_HAVE_SSE */ + +#ifdef LV_HAVE_GENERIC +/*! + \brief Deinterleaves the complex vector into I vector data + \param complexVector The complex input vector + \param iBuffer The I buffer output data + \param num_points The number of complex data values to be deinterleaved +*/ +static inline void volk_32fc_deinterleave_real_64f_a_generic(double* iBuffer, const lv_32fc_t* complexVector, unsigned int num_points){ + unsigned int number = 0; + const float* complexVectorPtr = (float*)complexVector; + double* iBufferPtr = iBuffer; + for(number = 0; number < num_points; number++){ + *iBufferPtr++ = (double)*complexVectorPtr++; + complexVectorPtr++; + } +} +#endif /* LV_HAVE_GENERIC */ + + + + +#endif /* INCLUDED_volk_32fc_deinterleave_real_64f_a_H */ |