Statistics
| Branch: | Tag: | Revision:

root / volk / include / volk / volk_32fc_deinterleave_64f_x2_a16.h @ e3600f59

History | View | Annotate | Download (2.4 kB)

1
#ifndef INCLUDED_volk_32fc_deinterleave_64f_x2_a16_H
2
#define INCLUDED_volk_32fc_deinterleave_64f_x2_a16_H
3
4
#include <inttypes.h>
5
#include <stdio.h>
6
7
#if LV_HAVE_SSE2
8
#include <emmintrin.h>
9
/*!
10
  \brief Deinterleaves the lv_32fc_t vector into double I & Q vector data
11
  \param complexVector The complex input vector
12
  \param iBuffer The I buffer output data
13
  \param qBuffer The Q buffer output data
14
  \param num_points The number of complex data values to be deinterleaved
15
*/
16
static inline void volk_32fc_deinterleave_64f_x2_a16_sse2(double* iBuffer, double* qBuffer, const lv_32fc_t* complexVector, unsigned int num_points){
17
  unsigned int number = 0;
18
19
    const float* complexVectorPtr = (float*)complexVector;
20
    double* iBufferPtr = iBuffer;
21
    double* qBufferPtr = qBuffer;
22
23
    const unsigned int halfPoints = num_points / 2;    
24
    __m128 cplxValue, fVal;
25
    __m128d dVal;
26
27
    for(;number < halfPoints; number++){
28
      
29
      cplxValue = _mm_load_ps(complexVectorPtr);
30
      complexVectorPtr += 4;
31
32
      // Arrange in i1i2i1i2 format
33
      fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(2,0,2,0));
34
      dVal = _mm_cvtps_pd(fVal); 
35
      _mm_store_pd(iBufferPtr, dVal);
36
37
      // Arrange in q1q2q1q2 format
38
      fVal = _mm_shuffle_ps(cplxValue, cplxValue, _MM_SHUFFLE(3,1,3,1));
39
      dVal = _mm_cvtps_pd(fVal); 
40
      _mm_store_pd(qBufferPtr, dVal);
41
42
      iBufferPtr += 2;
43
      qBufferPtr += 2;
44
    }
45
46
    number = halfPoints * 2;
47
    for(; number < num_points; number++){
48
      *iBufferPtr++ = *complexVectorPtr++;
49
      *qBufferPtr++ = *complexVectorPtr++;
50
    }
51
}
52
#endif /* LV_HAVE_SSE */
53
54
#if LV_HAVE_GENERIC
55
/*!
56
  \brief Deinterleaves the lv_32fc_t vector into double I & Q vector data
57
  \param complexVector The complex input vector
58
  \param iBuffer The I buffer output data
59
  \param qBuffer The Q buffer output data
60
  \param num_points The number of complex data values to be deinterleaved
61
*/
62
static inline void volk_32fc_deinterleave_64f_x2_a16_generic(double* iBuffer, double* qBuffer, const lv_32fc_t* complexVector, unsigned int num_points){
63
  unsigned int number = 0;
64
  const float* complexVectorPtr = (float*)complexVector;
65
  double* iBufferPtr = iBuffer;
66
  double* qBufferPtr = qBuffer;
67
68
  for(number = 0; number < num_points; number++){
69
    *iBufferPtr++ = (double)*complexVectorPtr++;
70
    *qBufferPtr++ = (double)*complexVectorPtr++;
71
  }
72
}
73
#endif /* LV_HAVE_GENERIC */
74
75
76
77
78
#endif /* INCLUDED_volk_32fc_deinterleave_64f_x2_a16_H */